[gnome-shell] st/texture-cache: Cancel pending requests on icon-theme changes



commit d81237b9d60e1cf95266533458598055dd93e4aa
Author: Florian Müllner <fmuellner gnome org>
Date:   Fri May 22 22:53:39 2020 +0200

    st/texture-cache: Cancel pending requests on icon-theme changes
    
    As outlined in commit 36b8dcbe07, we can end up with wrong icons
    if the icon theme changes right after a GTK theme change to/from
    HighContrast triggered a theme reload.
    
    That's because when we reload icons for the new icon theme, there
    are already pending requests due to the icon-style change; those
    requests are simply re-used for the new icons, with the existing
    icon infos from the old theme.
    
    The above commit applied a simple work-around by changing the
    icon theme before the GTK theme, but that only works for the
    HighContrast switch in our own UI.
    
    It turns out that Settings also uses the "wrong" order, so the
    issue still reproduces with the Universal Access panel.
    
    So instead of relying on everything changing the settings in the
    order we expect, cancel all ongoing requests on icon-theme changes.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1277

 src/st/st-texture-cache.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)
---
diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c
index 850c0d6979..bf42b86075 100644
--- a/src/st/st-texture-cache.c
+++ b/src/st/st-texture-cache.c
@@ -50,6 +50,8 @@ struct _StTextureCachePrivate
 
   /* File monitors to evict cache data on changes */
   GHashTable *file_monitors; /* char * -> GFileMonitor * */
+
+  GCancellable *cancellable;
 };
 
 static void st_texture_cache_dispose (GObject *object);
@@ -144,6 +146,9 @@ on_icon_theme_changed (StSettings     *settings,
 {
   g_autofree gchar *theme = NULL;
 
+  g_cancellable_cancel (cache->priv->cancellable);
+  g_cancellable_reset (cache->priv->cancellable);
+
   st_texture_cache_evict_icons (cache);
 
   g_object_get (settings, "gtk-icon-theme", &theme, NULL);
@@ -190,6 +195,8 @@ st_texture_cache_init (StTextureCache *self)
   self->priv->file_monitors = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal,
                                                      g_object_unref, g_object_unref);
 
+  self->priv->cancellable = g_cancellable_new ();
+
   on_icon_theme_changed (settings, NULL, self);
 }
 
@@ -198,8 +205,11 @@ st_texture_cache_dispose (GObject *object)
 {
   StTextureCache *self = (StTextureCache*)object;
 
+  g_cancellable_cancel (self->priv->cancellable);
+
   g_clear_object (&self->priv->settings);
   g_clear_object (&self->priv->icon_theme);
+  g_clear_object (&self->priv->cancellable);
 
   g_clear_pointer (&self->priv->keyed_cache, g_hash_table_destroy);
   g_clear_pointer (&self->priv->keyed_surface_cache, g_hash_table_destroy);
@@ -696,11 +706,14 @@ load_texture_async (StTextureCache       *cache,
           gtk_icon_info_load_symbolic_async (data->icon_info,
                                              &foreground_color, &success_color,
                                              &warning_color, &error_color,
-                                             NULL, on_symbolic_icon_loaded, data);
+                                             cache->priv->cancellable,
+                                             on_symbolic_icon_loaded, data);
         }
       else
         {
-          gtk_icon_info_load_icon_async (data->icon_info, NULL, on_icon_loaded, data);
+          gtk_icon_info_load_icon_async (data->icon_info,
+                                         cache->priv->cancellable,
+                                         on_icon_loaded, data);
         }
     }
   else


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