@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
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.``
#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;
}
#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;
}
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...)
#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, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.