From 62a4a025b1ea5db20768dc3ec2bd9d3f026b8f6d Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 9 Jan 2022 01:04:59 +0600 Subject: [PATCH] Port Win32 Discord integration to Linux and macOS --- src/CMakeLists.txt | 2 +- src/{win/win_discord.c => discord.c} | 23 +++++++++++-------- .../86box/{win_discord.h => discord.h} | 11 ++++++++- src/qt/qt_main.cpp | 16 +++++++++++++ src/qt/qt_mainwindow.cpp | 16 ++++++++++++- src/qt/qt_mainwindow.hpp | 2 ++ src/qt/qt_mainwindow.ui | 10 ++++++++ src/qt/qt_platform.cpp | 4 +++- src/win/CMakeLists.txt | 2 +- 9 files changed, 72 insertions(+), 14 deletions(-) rename src/{win/win_discord.c => discord.c} (85%) rename src/include/86box/{win_discord.h => discord.h} (90%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6bc00b432..f8e55fcaa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -17,7 +17,7 @@ # WIN32 marks us as a GUI app on Windows add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c log.c random.c timer.c io.c acpi.c apm.c - dma.c ddma.c nmi.c pic.c pit.c port_6x.c port_92.c ppi.c pci.c mca.c usb.c fifo8.c + dma.c ddma.c discord.c nmi.c pic.c pit.c port_6x.c port_92.c ppi.c pci.c mca.c usb.c fifo8.c device.c nvr.c nvr_at.c nvr_ps2.c) if(CPPTHREADS) diff --git a/src/win/win_discord.c b/src/discord.c similarity index 85% rename from src/win/win_discord.c rename to src/discord.c index 487157af5..7a9dc1fec 100644 --- a/src/win/win_discord.c +++ b/src/discord.c @@ -19,18 +19,23 @@ #include #include #include -#include #include #define HAVE_STDARG_H #include <86box/86box.h> -#include "cpu.h" +#include "cpu/cpu.h" #include <86box/machine.h> #include <86box/plat.h> #include <86box/plat_dynld.h> -#include <86box/win_discord.h> +#include <86box/discord.h> #include +#ifdef _WIN32 #define PATH_DISCORD_DLL "discord_game_sdk.dll" +#elif defined __APPLE__ +#define PATH_DISCORD_DLL "discord_game_sdk.dylib" +#else +#define PATH_DISCORD_DLL "discord_game_sdk.so" +#endif int discord_loaded = 0; @@ -74,7 +79,7 @@ discord_update_activity(int paused) if(discord_activities == NULL) return; - discord_log("win_discord: discord_update_activity(paused=%d)\n", paused); + discord_log("discord: discord_update_activity(paused=%d)\n", paused); memset(&activity, 0x00, sizeof(activity)); @@ -85,13 +90,13 @@ discord_update_activity(int paused) if (strlen(vm_name) < 100) { - sprintf_s(activity.details, sizeof(activity.details), "Running \"%s\"", vm_name); - sprintf_s(activity.state, sizeof(activity.state), "%s (%s/%s)", strchr(machine_getname(), ']') + 2, cpufamily, cpu_s->name); + snprintf(activity.details, sizeof(activity.details), "Running \"%s\"", vm_name); + snprintf(activity.state, sizeof(activity.state), "%s (%s/%s)", strchr(machine_getname(), ']') + 2, cpufamily, cpu_s->name); } else { strncpy(activity.details, strchr(machine_getname(), ']') + 2, sizeof(activity.details) - 1); - sprintf_s(activity.state, sizeof(activity.state), "%s/%s", cpufamily, cpu_s->name); + snprintf(activity.state, sizeof(activity.state), "%s/%s", cpufamily, cpu_s->name); } activity.timestamps.start = time(NULL); @@ -139,7 +144,7 @@ discord_load() if (discord_handle == NULL) { - discord_log("win_discord: couldn't load " PATH_DISCORD_DLL "\n"); + discord_log("discord: couldn't load " PATH_DISCORD_DLL "\n"); discord_close(); return(0); @@ -165,7 +170,7 @@ discord_init() result = discord_create(DISCORD_VERSION, ¶ms, &discord_core); if (result != DiscordResult_Ok) { - discord_log("win_discord: DiscordCreate returned %d\n", result); + discord_log("discord: DiscordCreate returned %d\n", result); discord_close(); return; } diff --git a/src/include/86box/win_discord.h b/src/include/86box/discord.h similarity index 90% rename from src/include/86box/win_discord.h rename to src/include/86box/discord.h index 9e56b9a32..90621e16d 100644 --- a/src/include/86box/win_discord.h +++ b/src/include/86box/discord.h @@ -17,6 +17,11 @@ #ifndef WIN_DISCORD_H # define WIN_DISCORD_H +#ifdef __cplusplus +extern "C" +{ +#endif + extern int discord_loaded; extern int discord_load(); @@ -25,4 +30,8 @@ extern void discord_close(); extern void discord_update_activity(int paused); extern void discord_run_callbacks(); -#endif \ No newline at end of file +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 464d5115f..16c1e3b53 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -26,6 +26,7 @@ Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin) #include <86box/plat.h> #include <86box/ui.h> #include <86box/video.h> +#include <86box/discord.h> #include #include @@ -127,6 +128,7 @@ int main(int argc, char* argv[]) { return 6; } + discord_load(); main_window = new MainWindow(); main_window->show(); app.installEventFilter(main_window); @@ -148,10 +150,24 @@ int main(int argc, char* argv[]) { // plat_pause(0); if (settings_only) dopause = 1; QTimer onesec; + QTimer discordupdate; QObject::connect(&onesec, &QTimer::timeout, &app, [] { pc_onesec(); }); onesec.start(1000); + if (discord_loaded) { + QTimer::singleShot(1000, &app, [] { + if (enable_discord) { + discord_init(); + discord_update_activity(dopause); + } else + discord_close(); + }); + QObject::connect(&discordupdate, &QTimer::timeout, &app, [] { + discord_run_callbacks(); + }); + discordupdate.start(0); + } /* Initialize the rendering window, or fullscreen. */ auto main_thread = std::thread([] { diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 8e7fdcd28..96504cf23 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -13,6 +13,7 @@ extern "C" { #include <86box/config.h> #include <86box/keyboard.h> #include <86box/plat.h> +#include <86box/discord.h> #include <86box/video.h> #include <86box/vid_ega.h> #include <86box/version.h> @@ -152,6 +153,7 @@ MainWindow::MainWindow(QWidget *parent) : ui->actionHiDPI_scaling->setChecked(dpi_scale); ui->actionHide_status_bar->setChecked(hide_status_bar); ui->actionUpdate_status_bar_icons->setChecked(update_icons); + ui->actionEnable_Discord_integration->setChecked(enable_discord); #if defined Q_OS_WINDOWS || defined Q_OS_MACOS /* Make the option visible only if ANGLE is loaded. */ @@ -420,7 +422,8 @@ void MainWindow::on_actionSettings_triggered() { plat_pause(currentPause); if (settings_only) { cpu_thread_run = 0; - close(); + config_save(); + QApplication::quit(); } } @@ -1392,3 +1395,14 @@ void MainWindow::on_actionPreferences_triggered() progsettings.exec(); } + +void MainWindow::on_actionEnable_Discord_integration_triggered(bool checked) +{ + enable_discord = checked; + if(enable_discord) { + discord_init(); + discord_update_activity(dopause); + } else + discord_close(); +} + diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 7683c526b..d0ff06787 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -103,6 +103,8 @@ private slots: void on_actionPreferences_triggered(); + void on_actionEnable_Discord_integration_triggered(bool checked); + protected: void keyPressEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override; diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index e537753dc..de6131694 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -73,6 +73,8 @@ + + @@ -554,6 +556,14 @@ QAction::NoRole + + + true + + + Enable &Discord integration + + diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index a53634f45..44c5c2b4c 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -67,6 +67,7 @@ extern "C" { #include <86box/plat_dynld.h> #include <86box/config.h> #include <86box/ui.h> +#include <86box/discord.h> #include "../cpu/cpu.h" #include <86box/plat.h> @@ -339,7 +340,7 @@ plat_pause(int p) wchar_t title[512]; if ((p == 0) && (time_sync & TIME_SYNC_ENABLED)) - nvr_time_sync(); + nvr_time_sync(); dopause = p; if (p) { @@ -350,6 +351,7 @@ plat_pause(int p) } else { ui_window_title(oldtitle); } + discord_update_activity(dopause); } // because we can't include nvr.h because it's got fields named new diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt index 36c3dc9ac..63d8296ed 100644 --- a/src/win/CMakeLists.txt +++ b/src/win/CMakeLists.txt @@ -20,7 +20,7 @@ add_library(plat OBJECT win.c win_dynld.c win_cdrom.c win_keyboard.c add_library(ui OBJECT win_ui.c win_icon.c win_stbar.c win_sdl.c win_dialog.c win_about.c win_settings.c win_devconf.c win_snd_gain.c win_specify_dim.c win_new_floppy.c - win_jsconf.c win_media_menu.c win_preferences.c win_discord.c glad.c win_opengl.c + win_jsconf.c win_media_menu.c win_preferences.c glad.c win_opengl.c win_opengl_glslp.c 86Box.rc) if(NOT CPPTHREADS)