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:
parent
7cda2964dd
commit
42aeaf682b
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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, ¤t_immersive_mode, 4) != FACILITY_NULL)
|
||||
DwmGetWindowAttribute(hwnd, WINDOWS_DARK_MODE, ¤t_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, ¤t_dark_mode, 4) != 0)
|
||||
DwmSetWindowAttribute(hwnd, WINDOWS_DARK_MODE, ¤t_dark_mode, 4);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
#endif
|
||||
case SDL_WINDOWEVENT:
|
||||
if (e.window.event == SDL_WINDOWEVENT_RESIZED) {
|
||||
ren_resize_window();
|
||||
|
|
50
src/main.c
50
src/main.c
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue