Updated Dark mode title bar changed for Windows

Added dynamical change of the title bar if main dark/light theme changed
This commit is contained in:
Nikolai Sinyov 2021-09-08 13:56:35 +03:00
parent 7cda2964dd
commit 42aeaf682b
4 changed files with 60 additions and 42 deletions

View File

@ -20,3 +20,23 @@ void api_load_libs(lua_State *L) {
luaL_requiref(L, libs[i].name, libs[i].func, 1);
}
}
#ifdef _WIN32
int api_windows_dark_theme_activated()
{
DWORD type;
DWORD value;
DWORD count = 4;
LSTATUS st = RegGetValue(
HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"),
TEXT("AppsUseLightTheme"),
RRF_RT_REG_DWORD,
&type,
&value,
&count );
if ( st == ERROR_SUCCESS && type == REG_DWORD )
return value == 0? 1 : 0;
return 0;
}
#endif

View File

@ -11,4 +11,11 @@
void api_load_libs(lua_State *L);
#ifdef _WIN32
#define WINDOWS_DARK_MODE_BEFORE_20H1 19
#define WINDOWS_DARK_MODE 20
#include <windows.h>
int api_windows_dark_theme_activated();
#endif
#endif

View File

@ -11,6 +11,8 @@
#include <direct.h>
#include <windows.h>
#include <fileapi.h>
#include "SDL_syswm.h"
#include <dwmapi.h>
#endif
extern SDL_Window *window;
@ -107,7 +109,30 @@ top:
case SDL_QUIT:
lua_pushstring(L, "quit");
return 1;
#ifdef _WIN32
case SDL_SYSWMEVENT:
if (e.syswm.msg->msg.win.msg == WM_SETTINGCHANGE) {
HWND hwnd = e.syswm.msg->msg.win.hwnd;
LPARAM lParam = e.syswm.msg->msg.win.lParam;
if (lParam) {
int current_immersive_mode = 0;
if(DwmGetWindowAttribute(hwnd, WINDOWS_DARK_MODE_BEFORE_20H1, &current_immersive_mode, 4) != FACILITY_NULL)
DwmGetWindowAttribute(hwnd, WINDOWS_DARK_MODE, &current_immersive_mode, 4);
int current_dark_mode = api_windows_dark_theme_activated();
if (current_dark_mode != current_immersive_mode) {
if (DwmSetWindowAttribute(hwnd, WINDOWS_DARK_MODE_BEFORE_20H1, &current_dark_mode, 4) != 0)
DwmSetWindowAttribute(hwnd, WINDOWS_DARK_MODE, &current_dark_mode, 4);
}
}
}
return 0;
#endif
case SDL_WINDOWEVENT:
if (e.window.event == SDL_WINDOWEVENT_RESIZED) {
ren_resize_window();

View File

@ -30,7 +30,7 @@ static double get_scale(void) {
#endif
}
#if _WIN32
#ifdef _WIN32
static HWND GetWindowHandle(SDL_Window* window){
SDL_SysWMinfo sysInfo;
@ -38,39 +38,6 @@ static HWND GetWindowHandle(SDL_Window* window){
SDL_GetWindowWMInfo(window, &sysInfo);
return sysInfo.info.win.window;
}
static int GetWinDarkMode() {
LPCSTR subKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
LPCSTR pValue = "AppsUseLightTheme";
DWORD options = 0;
REGSAM samDesired = KEY_READ;
HKEY OpenResult;
DWORD flags = RRF_RT_ANY;
//Allocationg memory for a DWORD value.
DWORD dataType;
WCHAR value[255];
PVOID pvData = value;
DWORD size = sizeof(value);
LONG err = RegOpenKeyEx(HKEY_CURRENT_USER, subKey, options, samDesired, &OpenResult);
if (err == ERROR_SUCCESS) {
err = RegGetValueA(OpenResult, NULL, pValue, flags, &dataType, pvData, &size);
if (err == ERROR_SUCCESS) {
return *(DWORD*)pvData;
}
else
err = 1;
RegCloseKey(OpenResult);
}
else
err = 1;
return err;
}
#endif
@ -117,8 +84,6 @@ static void init_window_icon(void) {
#define LITE_OS_HOME "USERPROFILE"
#define LITE_PATHSEP_PATTERN "\\\\"
#define LITE_NONPATHSEP_PATTERN "[^\\\\]+"
#define USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 19
#define USE_IMMERSIVE_DARK_MODE 20
#else
#define LITE_OS_HOME "HOME"
#define LITE_PATHSEP_PATTERN "/"
@ -159,12 +124,13 @@ int main(int argc, char **argv) {
window = SDL_CreateWindow(
"", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, dm.w * 0.8, dm.h * 0.8,
SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_HIDDEN);
#if _WIN32
HWND handle = GetWindowHandle(window);
int mode = GetWinDarkMode()? 0 : 1;
if (DwmSetWindowAttribute(handle, USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, &mode, 4) != 0)
DwmSetWindowAttribute(handle, USE_IMMERSIVE_DARK_MODE, &mode, 4);
#endif
#ifdef _WIN32
HWND handle = GetWindowHandle(window);
int mode = api_windows_dark_theme_activated();
if (DwmSetWindowAttribute(handle, WINDOWS_DARK_MODE_BEFORE_20H1, &mode, 4) != 0)
DwmSetWindowAttribute(handle, WINDOWS_DARK_MODE, &mode, 4);
#endif
init_window_icon();
ren_init(window);