From 11b70784c957ee1e1602215bde91d9f0109ec137 Mon Sep 17 00:00:00 2001 From: Aleksandar Kurtakov Date: Tue, 5 Aug 2025 17:46:28 +0300 Subject: [PATCH] [GTK] Fire settings event on Gtk theme change Listen for notify::gtk-theme-name signal and fire SWT.Settings even in this case. --- .../gtk/org/eclipse/swt/internal/gtk/OS.java | 1 + .../gtk/org/eclipse/swt/widgets/Display.java | 22 ++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java index 9e7dda3a524..b784bbc4eca 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java @@ -338,6 +338,7 @@ public static String getEnvironmentalVariable (String envVarName) { public static final byte[] mnemonic_activate = ascii("mnemonic-activate"); public static final byte[] month_changed = ascii("month-changed"); public static final byte[] next_month = ascii("next-month"); + public static final byte[] notify_gtk_theme = ascii("notify::gtk-theme-name"); public static final byte[] prev_month = ascii("prev-month"); public static final byte[] next_year = ascii("next-year"); public static final byte[] prev_year = ascii("prev-year"); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java index 4c131452879..4ab57937c23 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java @@ -497,6 +497,10 @@ public void stop() { long keysChangedProc; Callback keysChangedCallback; + /* Settings "changed" callback */ + long settingsChangedProc; + Callback settingsChangedCallback; + /* Multiple Displays. */ static Display Default; static Display [] Displays = new Display [1]; @@ -1323,7 +1327,11 @@ void createDisplay (DeviceData data) { } else { keymap = GDK.gdk_keymap_get_for_display(display); OS.g_signal_connect (keymap, OS.keys_changed, keysChangedProc, 0); - } + } + + settingsChangedCallback = new Callback (this, "settingsChangedProc", 3); //$NON-NLS-1$ + settingsChangedProc = settingsChangedCallback.getAddress (); + OS.g_signal_connect (GTK.gtk_settings_get_default(), OS.notify_gtk_theme, settingsChangedProc, 0); } /** @@ -1403,6 +1411,14 @@ long keysChangedProc (long keymap, long user_data) { return 0; } +/** + * GtkSettings 'changed' event handler. + */ +long settingsChangedProc (long settings, long key, long user_data) { + settingsChanged = true; + return 0; +} + Image createImage (String name) { byte[] buffer = Converter.wcsToMbcs(name, true); @@ -4818,6 +4834,10 @@ void releaseDisplay () { keysChangedCallback.dispose(); keysChangedCallback = null; keysChangedProc = 0; + /* Dispose the settings "changed" callback */ + settingsChangedCallback.dispose(); settingsChangedCallback = null; + settingsChangedProc = 0; + /* Dispose subclass */ if (!GTK.GTK4) { long pangoLayoutType = OS.PANGO_TYPE_LAYOUT ();