diff --git a/app/qt.conf b/app/qt.conf new file mode 100644 index 00000000..a9801052 --- /dev/null +++ b/app/qt.conf @@ -0,0 +1,2 @@ +[Platforms] +WindowsArguments = darkmode=1 \ No newline at end of file diff --git a/app/streaming/session.cpp b/app/streaming/session.cpp index 040f34af..e81f2f6f 100644 --- a/app/streaming/session.cpp +++ b/app/streaming/session.cpp @@ -22,6 +22,19 @@ #define ICON_SIZE 64 #endif +// HACK: Remove once proper Dark Mode support lands in SDL +#ifdef Q_OS_WIN32 +#include +#include +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE_OLD +#define DWMWA_USE_IMMERSIVE_DARK_MODE_OLD 19 +#endif +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif +#endif + + #define SDL_CODE_FLUSH_WINDOW_EVENT_BARRIER 100 #define SDL_CODE_GAMECONTROLLER_RUMBLE 101 @@ -35,6 +48,7 @@ #include #include #include +#include #define CONN_TEST_SERVER "qt.conntest.moonlight-stream.org" @@ -1415,6 +1429,34 @@ void Session::execInternal() } } + // HACK: Remove once proper Dark Mode support lands in SDL +#ifdef Q_OS_WIN32 + { + BOOL darkModeEnabled = FALSE; + + // Query whether dark mode is enabled for our Qt window (which tracks the OS dark mode state) + QWindowList windows = QGuiApplication::topLevelWindows(); + for (const QWindow* window : windows) { + if (SUCCEEDED(DwmGetWindowAttribute((HWND)window->winId(), DWMWA_USE_IMMERSIVE_DARK_MODE, &darkModeEnabled, sizeof(darkModeEnabled))) || + SUCCEEDED(DwmGetWindowAttribute((HWND)window->winId(), DWMWA_USE_IMMERSIVE_DARK_MODE_OLD, &darkModeEnabled, sizeof(darkModeEnabled)))) { + break; + } + } + + // If dark mode is enabled, propagate that to our SDL window + if (darkModeEnabled) { + SDL_SysWMinfo info; + + SDL_VERSION(&info.version); + if (SDL_GetWindowWMInfo(m_Window, &info) && info.subsystem == SDL_SYSWM_WINDOWS) { + if (FAILED(DwmSetWindowAttribute(info.info.win.window, DWMWA_USE_IMMERSIVE_DARK_MODE, &darkModeEnabled, sizeof(darkModeEnabled)))) { + DwmSetWindowAttribute(info.info.win.window, DWMWA_USE_IMMERSIVE_DARK_MODE_OLD, &darkModeEnabled, sizeof(darkModeEnabled)); + } + } + } + } +#endif + m_InputHandler->setWindow(m_Window); QSvgRenderer svgIconRenderer(QString(":/res/moonlight.svg")); diff --git a/scripts/build-arch.bat b/scripts/build-arch.bat index 64a72d65..9fe958e7 100644 --- a/scripts/build-arch.bat +++ b/scripts/build-arch.bat @@ -144,6 +144,10 @@ echo Copying GC mapping list copy %SOURCE_ROOT%\app\SDL_GameControllerDB\gamecontrollerdb.txt %DEPLOY_FOLDER% if !ERRORLEVEL! NEQ 0 goto Error +echo Copying qt.conf +copy %SOURCE_ROOT%\app\qt.conf %DEPLOY_FOLDER% +if !ERRORLEVEL! NEQ 0 goto Error + echo Deploying Qt dependencies windeployqt.exe --dir %DEPLOY_FOLDER% --%BUILD_CONFIG% --qmldir %SOURCE_ROOT%\app\gui --no-opengl-sw --no-compiler-runtime --no-qmltooling --no-virtualkeyboard --no-sql %BUILD_FOLDER%\app\%BUILD_CONFIG%\Moonlight.exe if !ERRORLEVEL! NEQ 0 goto Error