diff options
author | Alexander Larsson <alexl@redhat.com> | 2020-02-07 17:25:18 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2020-02-07 17:25:18 +0100 |
commit | e27413a9ed5ce0d18895ec02b7f45d84b39440ee (patch) | |
tree | 0f3ff0050e83f599fc6d036224d97aa4093672cb /gtk | |
parent | bdbafe63f96b9fc9713ff8edb094f49b2c31a713 (diff) | |
download | gtk+-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')
-rw-r--r-- | gtk/gtkicontheme.c | 34 | ||||
-rw-r--r-- | gtk/gtkicontheme.h | 5 |
2 files changed, 38 insertions, 1 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; } diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h index afc79e5a18..f0fc704ed4 100644 --- a/gtk/gtkicontheme.h +++ b/gtk/gtkicontheme.h @@ -44,13 +44,16 @@ typedef struct _GtkIconTheme GtkIconTheme; * when symbolic icon names are given * @GTK_ICON_LOOKUP_FORCE_SYMBOLIC: Try to always load symbolic icons, even * when regular icon names are given + * @GTK_ICON_LOOKUP_LOAD_IN_THREAD: Starts loading the texture in the background + * so it is ready when later needed. * * Used to specify options for gtk_icon_theme_lookup_icon() */ typedef enum { GTK_ICON_LOOKUP_FORCE_REGULAR = 1 << 0, - GTK_ICON_LOOKUP_FORCE_SYMBOLIC = 1 << 1 + GTK_ICON_LOOKUP_FORCE_SYMBOLIC = 1 << 1, + GTK_ICON_LOOKUP_LOAD_IN_THREAD = 1 << 2, } GtkIconLookupFlags; /** |