From f8e6b74551df04dcfd7c8edb52b86d3bc0405105 Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Fri, 17 Jan 2025 15:08:52 +0000 Subject: [PATCH] Respect system colour scheme for title bar colour (#109) --- UnleashedRecomp/.gitignore | 4 ++-- UnleashedRecomp/CMakeLists.txt | 3 +++ UnleashedRecomp/os/linux/user_linux.cpp | 6 ++++++ UnleashedRecomp/os/user.cpp | 7 +++++++ UnleashedRecomp/os/user.h | 6 ++++++ UnleashedRecomp/os/user_detail.h | 6 ++++++ UnleashedRecomp/os/win32/user_win32.cpp | 23 +++++++++++++++++++++++ UnleashedRecomp/ui/game_window.cpp | 24 ++++++++++++++---------- UnleashedRecomp/ui/game_window.h | 2 +- 9 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 UnleashedRecomp/os/linux/user_linux.cpp create mode 100644 UnleashedRecomp/os/user.cpp create mode 100644 UnleashedRecomp/os/user.h create mode 100644 UnleashedRecomp/os/user_detail.h create mode 100644 UnleashedRecomp/os/win32/user_win32.cpp diff --git a/UnleashedRecomp/.gitignore b/UnleashedRecomp/.gitignore index 65295cb..780a0bb 100644 --- a/UnleashedRecomp/.gitignore +++ b/UnleashedRecomp/.gitignore @@ -1,2 +1,2 @@ -version.h -version.cpp \ No newline at end of file +/version.h +/version.cpp \ No newline at end of file diff --git a/UnleashedRecomp/CMakeLists.txt b/UnleashedRecomp/CMakeLists.txt index 854ef15..a30d6ef 100644 --- a/UnleashedRecomp/CMakeLists.txt +++ b/UnleashedRecomp/CMakeLists.txt @@ -91,6 +91,7 @@ set(SWA_OS_CXX_SOURCES "os/logger.cpp" "os/media.cpp" "os/process.cpp" + "os/user.cpp" "os/version.cpp" ) @@ -99,6 +100,7 @@ if (WIN32) "os/win32/logger_win32.cpp" "os/win32/media_win32.cpp" "os/win32/process_win32.cpp" + "os/win32/user_win32.cpp" "os/win32/version_win32.cpp" ) elseif (CMAKE_SYSTEM_NAME MATCHES "Linux") @@ -106,6 +108,7 @@ elseif (CMAKE_SYSTEM_NAME MATCHES "Linux") "os/linux/logger_linux.cpp" "os/linux/media_linux.cpp" "os/linux/process_linux.cpp" + "os/linux/user_linux.cpp" "os/linux/version_linux.cpp" ) endif() diff --git a/UnleashedRecomp/os/linux/user_linux.cpp b/UnleashedRecomp/os/linux/user_linux.cpp new file mode 100644 index 0000000..b9c4034 --- /dev/null +++ b/UnleashedRecomp/os/linux/user_linux.cpp @@ -0,0 +1,6 @@ +#include + +bool os::user::detail::IsDarkTheme() +{ + return false; +} diff --git a/UnleashedRecomp/os/user.cpp b/UnleashedRecomp/os/user.cpp new file mode 100644 index 0000000..530bbb1 --- /dev/null +++ b/UnleashedRecomp/os/user.cpp @@ -0,0 +1,7 @@ +#include +#include + +bool os::user::IsDarkTheme() +{ + return detail::IsDarkTheme(); +} diff --git a/UnleashedRecomp/os/user.h b/UnleashedRecomp/os/user.h new file mode 100644 index 0000000..78321d6 --- /dev/null +++ b/UnleashedRecomp/os/user.h @@ -0,0 +1,6 @@ +#pragma once + +namespace os::user +{ + bool IsDarkTheme(); +} diff --git a/UnleashedRecomp/os/user_detail.h b/UnleashedRecomp/os/user_detail.h new file mode 100644 index 0000000..bb81f25 --- /dev/null +++ b/UnleashedRecomp/os/user_detail.h @@ -0,0 +1,6 @@ +#pragma once + +namespace os::user::detail +{ + bool IsDarkTheme(); +} diff --git a/UnleashedRecomp/os/win32/user_win32.cpp b/UnleashedRecomp/os/win32/user_win32.cpp new file mode 100644 index 0000000..9fd2bdb --- /dev/null +++ b/UnleashedRecomp/os/win32/user_win32.cpp @@ -0,0 +1,23 @@ +#include + +bool os::user::detail::IsDarkTheme() +{ + HKEY hKey; + + if (RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + DWORD value = 0; + DWORD valueSize = sizeof(value); + + if (RegQueryValueExA(hKey, "AppsUseLightTheme", nullptr, nullptr, (LPBYTE)&value, &valueSize) == ERROR_SUCCESS) + { + RegCloseKey(hKey); + + return value == 0; + } + + RegCloseKey(hKey); + } + + return false; +} diff --git a/UnleashedRecomp/ui/game_window.cpp b/UnleashedRecomp/ui/game_window.cpp index 6677ca4..4460240 100644 --- a/UnleashedRecomp/ui/game_window.cpp +++ b/UnleashedRecomp/ui/game_window.cpp @@ -1,6 +1,7 @@ #include "game_window.h" #include #include +#include #include #include #include @@ -238,7 +239,7 @@ void GameWindow::Init(const char* sdlVideoDriver) static_assert(false, "Unknown platform."); #endif - SetDarkTitleBar(true); + SetTitleBarColour(); SDL_ShowWindow(s_pWindow); } @@ -307,20 +308,23 @@ void GameWindow::SetTitle(const char* title) SDL_SetWindowTitle(s_pWindow, title ? title : GetTitle()); } -void GameWindow::SetDarkTitleBar(bool isEnabled) +void GameWindow::SetTitleBarColour() { #if _WIN32 - auto version = os::version::GetOSVersion(); + if (os::user::IsDarkTheme()) + { + auto version = os::version::GetOSVersion(); - if (version.Major < 10 || version.Build <= 17763) - return; + if (version.Major < 10 || version.Build <= 17763) + return; - auto flag = version.Build >= 18985 - ? DWMWA_USE_IMMERSIVE_DARK_MODE - : 19; // DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 + auto flag = version.Build >= 18985 + ? DWMWA_USE_IMMERSIVE_DARK_MODE + : 19; // DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 - const DWORD useImmersiveDarkMode = isEnabled; - DwmSetWindowAttribute(s_renderWindow, flag, &useImmersiveDarkMode, sizeof(useImmersiveDarkMode)); + const DWORD useImmersiveDarkMode = 1; + DwmSetWindowAttribute(s_renderWindow, flag, &useImmersiveDarkMode, sizeof(useImmersiveDarkMode)); + } #endif } diff --git a/UnleashedRecomp/ui/game_window.h b/UnleashedRecomp/ui/game_window.h index 95d2ddc..6bd703a 100644 --- a/UnleashedRecomp/ui/game_window.h +++ b/UnleashedRecomp/ui/game_window.h @@ -30,7 +30,7 @@ public: static void SetIcon(bool isNight = false); static const char* GetTitle(); static void SetTitle(const char* title = nullptr); - static void SetDarkTitleBar(bool isEnabled); + static void SetTitleBarColour(); static bool IsFullscreen(); static bool SetFullscreen(bool isEnabled); static void SetFullscreenCursorVisibility(bool isVisible);