Branch: refs/heads/master Author: Jiří Techet techet@gmail.com Committer: Jiří Techet techet@gmail.com Date: Wed, 05 Feb 2025 22:48:36 UTC Commit: 018b83e4fd4e286d873984a976acb587c5ef4aea https://github.com/geany/geany/commit/018b83e4fd4e286d873984a976acb587c5ef4a...
Log Message: ----------- Use themed title bar on Windows
Based on a patch from @GabrielFrigo4. Thanks!
Modified to connect to the realized signal using a patch from Colomban Wendling. Thanks!
Modified Paths: -------------- src/search.c src/ui_utils.c src/win32.c src/win32.h
Modified: src/search.c 13 lines changed, 13 insertions(+), 0 deletions(-) =================================================================== @@ -44,6 +44,7 @@ #include "toolbar.h" #include "ui_utils.h" #include "utils.h" +#include "win32.h"
#include <unistd.h> #include <string.h> @@ -547,6 +548,10 @@ static void create_find_dialog(void) GTK_BUTTON_BOX(bbox)); gtk_container_add(GTK_CONTAINER(exp), bbox); gtk_container_add(GTK_CONTAINER(vbox), exp); + +#ifdef G_OS_WIN32 + win32_update_titlebar_theme(find_dlg.dialog); +#endif }
@@ -731,6 +736,10 @@ static void create_replace_dialog(void) GTK_BUTTON_BOX(bbox)); gtk_container_add(GTK_CONTAINER(exp), bbox); gtk_container_add(GTK_CONTAINER(vbox), exp); + +#ifdef G_OS_WIN32 + win32_update_titlebar_theme(replace_dlg.dialog); +#endif }
@@ -1029,6 +1038,10 @@ static void create_fif_dialog(void) G_CALLBACK(on_find_in_files_dialog_response), NULL); g_signal_connect(fif_dlg.dialog, "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), NULL); + +#ifdef G_OS_WIN32 + win32_update_titlebar_theme(fif_dlg.dialog); +#endif }
Modified: src/ui_utils.c 5 lines changed, 5 insertions(+), 0 deletions(-) =================================================================== @@ -2521,6 +2521,11 @@ void ui_init_builder(void)
widget = GTK_WIDGET(iter->data);
+#ifdef G_OS_WIN32 + if (GTK_IS_WINDOW(widget)) + win32_update_titlebar_theme(widget); +#endif + name = ui_guess_object_name(G_OBJECT(widget)); if (! name) {
Modified: src/win32.c 38 lines changed, 38 insertions(+), 0 deletions(-) =================================================================== @@ -53,12 +53,17 @@
#include <windows.h> #include <commdlg.h> +#include <dwmapi.h> #include <shellapi.h> #include <shlobj.h>
#include <glib/gstdio.h> #include <gdk/gdkwin32.h>
+#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif +
/* Little wrapper for _waccess(), returns errno or 0 if there was no error */ gint win32_check_write_permission(const gchar *dir) @@ -327,4 +332,37 @@ gchar *win32_get_user_config_dir(void) return g_build_filename(g_get_user_config_dir(), "geany", NULL); }
+ +static void on_update_titlebar_theme_realized(GtkWidget *widget, gpointer data) +{ + GdkWindow *gdk_window = gtk_widget_get_window(widget); + + g_return_if_fail(gdk_window != NULL); + + 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)); + } +} + +/* Makes titlebar dark when using dark theme; call this before + * gtk_widget_show(window) to avoid titlebar color change */ +void win32_update_titlebar_theme(GtkWidget *window) +{ + const gchar *reg_path = "Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"; + gboolean is_light_theme = TRUE; + DWORD val; + DWORD data_size = sizeof(val); + + g_return_if_fail(GTK_IS_WINDOW(window)); + + if (RegGetValueA(HKEY_CURRENT_USER, reg_path, "AppsUseLightTheme", RRF_RT_DWORD, NULL, &val, &data_size) == ERROR_SUCCESS) + is_light_theme = val; + + if (!is_light_theme) + g_signal_connect(window, "realize", G_CALLBACK(on_update_titlebar_theme_realized), NULL); +} + #endif
Modified: src/win32.h 2 lines changed, 2 insertions(+), 0 deletions(-) =================================================================== @@ -47,6 +47,8 @@ gchar *win32_expand_environment_variables(const gchar *str);
gchar *win32_get_user_config_dir(void);
+void win32_update_titlebar_theme(GtkWidget *window); + G_END_DECLS
#endif /* G_OS_WIN32 */
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).