Blame SOURCES/0001-st-texture-cache-Cancel-pending-requests-on-icon-the.patch

1be690
From 1bf28eea64056846547ec33d783c7f2e0dad78a4 Mon Sep 17 00:00:00 2001
1be690
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
1be690
Date: Fri, 22 May 2020 22:53:39 +0200
1be690
Subject: [PATCH] st/texture-cache: Cancel pending requests on icon-theme
1be690
 changes
1be690
1be690
As outlined in commit 36b8dcbe07, we can end up with wrong icons
1be690
if the icon theme changes right after a GTK theme change to/from
1be690
HighContrast triggered a theme reload.
1be690
1be690
That's because when we reload icons for the new icon theme, there
1be690
are already pending requests due to the icon-style change; those
1be690
requests are simply re-used for the new icons, with the existing
1be690
icon infos from the old theme.
1be690
1be690
The above commit applied a simple work-around by changing the
1be690
icon theme before the GTK theme, but that only works for the
1be690
HighContrast switch in our own UI.
1be690
1be690
It turns out that Settings also uses the "wrong" order, so the
1be690
issue still reproduces with the Universal Access panel.
1be690
1be690
So instead of relying on everything changing the settings in the
1be690
order we expect, cancel all ongoing requests on icon-theme changes.
1be690
1be690
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1277
1be690
---
1be690
 src/st/st-texture-cache.c | 17 +++++++++++++++--
1be690
 1 file changed, 15 insertions(+), 2 deletions(-)
1be690
1be690
diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c
1be690
index 35e9d036f..6dc351282 100644
1be690
--- a/src/st/st-texture-cache.c
1be690
+++ b/src/st/st-texture-cache.c
1be690
@@ -48,6 +48,8 @@ struct _StTextureCachePrivate
1be690
 
1be690
   /* File monitors to evict cache data on changes */
1be690
   GHashTable *file_monitors; /* char * -> GFileMonitor * */
1be690
+
1be690
+  GCancellable *cancellable;
1be690
 };
1be690
 
1be690
 static void st_texture_cache_dispose (GObject *object);
1be690
@@ -152,6 +154,9 @@ on_icon_theme_changed (StSettings     *settings,
1be690
 {
1be690
   g_autofree gchar *theme;
1be690
 
1be690
+  g_cancellable_cancel (cache->priv->cancellable);
1be690
+  g_cancellable_reset (cache->priv->cancellable);
1be690
+
1be690
   st_texture_cache_evict_icons (cache);
1be690
 
1be690
   g_object_get (settings, "gtk-icon-theme", &theme, NULL);
1be690
@@ -186,6 +191,8 @@ st_texture_cache_init (StTextureCache *self)
1be690
   self->priv->file_monitors = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal,
1be690
                                                      g_object_unref, g_object_unref);
1be690
 
1be690
+  self->priv->cancellable = g_cancellable_new ();
1be690
+
1be690
   on_icon_theme_changed (settings, NULL, self);
1be690
 }
1be690
 
1be690
@@ -194,8 +201,11 @@ st_texture_cache_dispose (GObject *object)
1be690
 {
1be690
   StTextureCache *self = (StTextureCache*)object;
1be690
 
1be690
+  g_cancellable_cancel (self->priv->cancellable);
1be690
+
1be690
   g_clear_object (&self->priv->settings);
1be690
   g_clear_object (&self->priv->icon_theme);
1be690
+  g_clear_object (&self->priv->cancellable);
1be690
 
1be690
   g_clear_pointer (&self->priv->keyed_cache, g_hash_table_destroy);
1be690
   g_clear_pointer (&self->priv->keyed_surface_cache, g_hash_table_destroy);
1be690
@@ -675,11 +685,14 @@ load_texture_async (StTextureCache       *cache,
1be690
           gtk_icon_info_load_symbolic_async (data->icon_info,
1be690
                                              &foreground_color, &success_color,
1be690
                                              &warning_color, &error_color,
1be690
-                                             NULL, on_symbolic_icon_loaded, data);
1be690
+                                             cache->priv->cancellable,
1be690
+                                             on_symbolic_icon_loaded, data);
1be690
         }
1be690
       else
1be690
         {
1be690
-          gtk_icon_info_load_icon_async (data->icon_info, NULL, on_icon_loaded, data);
1be690
+          gtk_icon_info_load_icon_async (data->icon_info,
1be690
+                                         cache->priv->cancellable,
1be690
+                                         on_icon_loaded, data);
1be690
         }
1be690
     }
1be690
   else
1be690
-- 
1be690
2.26.2
1be690