> @GabrielFrigo4 I've just tried what you suggested in #4201. I don't have
> access to a Windows machine where I could try the result at the moment. Could
> you test the artifact at the bottom of
>
> https://github.com/geany/geany/actions/runs/12727914414 ?
I think I found the error
I made two small codes, Code1 and Code2.
Code1 worked and Code2 gave `Failed to get GdkWindow from GtkWidget.``
### Code1 (Ok)
```c
#include <gtk/gtk.h>
#include <windows.h>
#include <dwmapi.h>
#include <gdk/gdkwin32.h>
void enable_dark_titlebar(GtkWidget *window) {
GdkWindow *gdk_window = gtk_widget_get_window(window);
if (gdk_window) {
HWND hwnd = (HWND)gdk_win32_window_get_handle(gdk_window);
if (hwnd) {
BOOL use_dark_mode = TRUE;
DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE,
&use_dark_mode, sizeof(use_dark_mode));
} else {
g_warning("Failed to get HWND from GdkWindow.");
}
} else {
g_warning("Failed to get GdkWindow from GtkWidget.");
}
}
int main(int argc, char *argv[]) {
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Dark Mode Title Bar");
gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
// After *gtk_widget_show_all(window);*
enable_dark_titlebar(window);
gtk_main();
return 0;
}
```
### Code2 (Failed)
```c
#include <gtk/gtk.h>
#include <windows.h>
#include <dwmapi.h>
#include <gdk/gdkwin32.h>
void enable_dark_titlebar(GtkWidget *window) {
GdkWindow *gdk_window = gtk_widget_get_window(window);
if (gdk_window) {
HWND hwnd = (HWND)gdk_win32_window_get_handle(gdk_window);
if (hwnd) {
BOOL use_dark_mode = TRUE;
DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE,
&use_dark_mode, sizeof(use_dark_mode));
} else {
g_warning("Failed to get HWND from GdkWindow.");
}
} else {
g_warning("Failed to get GdkWindow from GtkWidget.");
}
}
int main(int argc, char *argv[]) {
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Dark Mode Title Bar");
gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
// Before *gtk_widget_show_all(window);*
enable_dark_titlebar(window);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
```
### Change only when it is Dark Theme
However, Code1 has an error: It will always leave the Title Bar in Dark Mode,
regardless of the theme that the User left in Windows.
To do this, we simply use the functions `RegOpenKeyA` (Since this type of
information is saved in the Windows registry... And functions like
`ShouldAppsUseDarkMode` and `ShouldSystemUseDarkMode` are not documented and
may change location in memory and ruin the program's startup later...)
### Code3 (Completely OK)
```c
#include <gtk/gtk.h>
#include <windows.h>
#include <dwmapi.h>
#include <gdk/gdkwin32.h>
BOOL ShouldAppsUseDarkMode() {
BOOL isLight = TRUE;
DWORD val, dataSize = sizeof(val);
if (RegGetValueA(HKEY_CURRENT_USER,
"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize",
"AppsUseLightTheme", RRF_RT_DWORD, NULL, &val, &dataSize) == ERROR_SUCCESS) {
isLight = val;
}
else {
g_warning("Failed to get AppsUseLightTheme from Reg.");
}
return !isLight;
}
void enable_dark_titlebar(GtkWidget *window) {
GdkWindow *gdk_window = gtk_widget_get_window(window);
if (gdk_window) {
HWND hwnd = (HWND)gdk_win32_window_get_handle(gdk_window);
if (hwnd) {
BOOL use_dark_mode = ShouldAppsUseDarkMode();
DwmSetWindowAttribute(hwnd,
DWMWA_USE_IMMERSIVE_DARK_MODE, &use_dark_mode, sizeof(use_dark_mode));
} else {
g_warning("Failed to get HWND from GdkWindow.");
}
} else {
g_warning("Failed to get GdkWindow from GtkWidget.");
}
}
int main(int argc, char *argv[]) {
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Dark Mode Title Bar");
gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
enable_dark_titlebar(window);
gtk_main();
return 0;
}
```
--
Reply to this email directly or view it on GitHub:
https://github.com/geany/geany/issues/4200#issuecomment-2586090849
You are receiving this because you are subscribed to this thread.
Message ID: <geany/geany/issues/4200/[email protected]>