[gtk/fix-icontheme-invalidation] settings: Use system_settings_changed



commit d43b95f04f6d7b62f60ff80d03a656bbeb90521b
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Apr 21 12:08:15 2020 -0400

    settings: Use system_settings_changed
    
    Replace calls to gtk_style_context_reset_widgets by
    system_settings_changed. This gives us a hook to walk
    the widget tree whenever a global setting changes and
    do per-widget invalidations.

 gtk/gtkicontheme.c |  1 -
 gtk/gtksettings.c  | 39 +++++++++++++++++++++++++++++----------
 2 files changed, 29 insertions(+), 11 deletions(-)
---
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index b1c8157de7..88bf54ed7b 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -1311,7 +1311,6 @@ theme_changed_idle__mainthread_unlocked (gpointer user_data)
         {
           GtkSettings *settings = gtk_settings_get_for_display (self->display);
           gtk_style_provider_changed (GTK_STYLE_PROVIDER (settings));
-          gtk_style_context_reset_widgets (self->display);
           g_object_unref (display);
         }
 
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index c6b9634213..403bc78db3 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -29,7 +29,7 @@
 #include "gtkstyleproviderprivate.h"
 #include "gtktypebuiltins.h"
 #include "gtkversion.h"
-#include "gtkwidget.h"
+#include "gtkwidgetprivate.h"
 
 #include "gdk/gdk-private.h"
 
@@ -1227,6 +1227,25 @@ settings_update_font_values (GtkSettings *settings)
     pango_font_description_free (desc);
 }
 
+static void
+gtk_system_setting_changed (GdkDisplay       *display,
+                            GtkSystemSetting  setting)
+{
+  GList *list, *toplevels;
+
+  toplevels = gtk_window_list_toplevels ();
+  g_list_foreach (toplevels, (GFunc) g_object_ref, NULL);
+
+  for (list = toplevels; list; list = list->next)
+    {
+      if (gtk_widget_get_display (list->data) == display)
+        gtk_widget_system_setting_changed (list->data, setting);
+      g_object_unref (list->data);
+    }
+
+  g_list_free (toplevels);
+}
+
 static void
 gtk_settings_notify (GObject    *object,
                      GParamSpec *pspec)
@@ -1246,32 +1265,32 @@ gtk_settings_notify (GObject    *object,
     case PROP_FONT_NAME:
       settings_update_font_values (settings);
       settings_invalidate_style (settings);
-      gtk_style_context_reset_widgets (settings->display);
+      gtk_system_setting_changed (settings->display, GTK_SYSTEM_SETTING_FONT_NAME);
       break;
     case PROP_THEME_NAME:
     case PROP_APPLICATION_PREFER_DARK_THEME:
       settings_update_theme (settings);
+      gtk_system_setting_changed (settings->display, GTK_SYSTEM_SETTING_THEME);
+      break;
+    case PROP_ICON_THEME_NAME:
+      gtk_system_setting_changed (settings->display, GTK_SYSTEM_SETTING_ICON_THEME);
       break;
     case PROP_XFT_DPI:
-      /* This is a hack because with gtk_rc_reset_styles() doesn't get
-       * widgets with gtk_widget_style_set(), and also causes more
-       * recomputation than necessary.
-       */
-      gtk_style_context_reset_widgets (settings->display);
+      gtk_system_setting_changed (settings->display, GTK_SYSTEM_SETTING_DPI);
       break;
     case PROP_XFT_ANTIALIAS:
     case PROP_XFT_HINTING:
     case PROP_XFT_HINTSTYLE:
     case PROP_XFT_RGBA:
       settings_update_font_options (settings);
-      gtk_style_context_reset_widgets (settings->display);
+      gtk_system_setting_changed (settings->display, GTK_SYSTEM_SETTING_FONT_CONFIG);
       break;
     case PROP_FONTCONFIG_TIMESTAMP:
       if (settings_update_fontconfig (settings))
-        gtk_style_context_reset_widgets (settings->display);
+        gtk_system_setting_changed (settings->display, GTK_SYSTEM_SETTING_FONT_CONFIG);
       break;
     case PROP_ENABLE_ANIMATIONS:
-      gtk_style_context_reset_widgets (settings->display);
+      gtk_system_setting_changed (settings->display, GTK_SYSTEM_SETTING_ANIMATIONS);
       break;
     case PROP_CURSOR_THEME_NAME:
     case PROP_CURSOR_THEME_SIZE:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]