summaryrefslogtreecommitdiff
path: root/gtk/gtkicontheme.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2020-02-07 17:25:18 +0100
committerAlexander Larsson <alexl@redhat.com>2020-02-07 17:25:18 +0100
commite27413a9ed5ce0d18895ec02b7f45d84b39440ee (patch)
tree0f3ff0050e83f599fc6d036224d97aa4093672cb /gtk/gtkicontheme.c
parentbdbafe63f96b9fc9713ff8edb094f49b2c31a713 (diff)
downloadgtk+-e27413a9ed5ce0d18895ec02b7f45d84b39440ee.tar.gz
icon-theme: Add GTK_ICON_LOOKUP_LOAD_IN_THREAD flag
This causes lookup to trigger a thread that loads the icon texture.
Diffstat (limited to 'gtk/gtkicontheme.c')
-rw-r--r--gtk/gtkicontheme.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 1377abc192..45b580e6a2 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -2185,6 +2185,20 @@ choose_icon (GtkIconTheme *self,
return icon;
}
+static void
+load_icon_thread (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
+{
+ GtkIconPaintable *self = GTK_ICON_PAINTABLE (source_object);
+
+ g_mutex_lock (&self->texture_lock);
+ icon_ensure_texture__locked (self, TRUE);
+ g_mutex_unlock (&self->texture_lock);
+ g_task_return_pointer (task, NULL, NULL);
+}
+
/**
* gtk_icon_theme_lookup_icon:
* @self: a #GtkIconTheme
@@ -2258,6 +2272,26 @@ gtk_icon_theme_lookup_icon (GtkIconTheme *self,
gtk_icon_theme_unlock (self);
+ if (flags & GTK_ICON_LOOKUP_LOAD_IN_THREAD)
+ {
+ gboolean has_texture = FALSE;
+
+ /* If we fail to get the lock it is because some other thread is
+ currently loading the icon, so we need to do nothing */
+ if (g_mutex_trylock (&icon->texture_lock))
+ {
+ has_texture = icon->texture != NULL;
+ g_mutex_unlock (&icon->texture_lock);
+
+ if (!has_texture)
+ {
+ GTask *task = g_task_new (icon, NULL, NULL, NULL);
+ g_task_run_in_thread (task, load_icon_thread);
+ g_object_unref (task);
+ }
+ }
+ }
+
return icon;
}