mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-01 00:11:29 +00:00
icon-theme: Add GTK_ICON_LOOKUP_LOAD_IN_THREAD flag
This causes lookup to trigger a thread that loads the icon texture.
This commit is contained in:
parent
bdbafe63f9
commit
e27413a9ed
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user