> @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]>

Reply via email to