From c89d6a633aa431adda8080665e38d957146c5357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 25 Mar 2020 16:44:26 +0100 Subject: [PATCH] st/icon: Add a default fallback icon The idea behind commit 3dd8ffc2bb1cefd to try harder to avoid empty icon actors because of missing icons was sound, so implement that behavior in StIcon itself: If the main gicon was not found, and the fallback gicon isn't set or wasn't found either, fall back to the standard 'missing-image' icon. https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1127 --- src/st/st-icon.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/st/st-icon.c b/src/st/st-icon.c index 090ba4b10..a2ccd8f75 100644 --- a/src/st/st-icon.c +++ b/src/st/st-icon.c @@ -59,6 +59,7 @@ struct _StIconPrivate gint theme_icon_size; /* icon size from theme node */ gint icon_size; /* icon size we are using */ GIcon *fallback_gicon; + GIcon *default_gicon; CoglPipeline *shadow_pipeline; StShadow *shadow_spec; @@ -72,6 +73,7 @@ static gboolean st_icon_update_icon_size (StIcon *icon); static void st_icon_update_shadow_pipeline (StIcon *icon); static void st_icon_clear_shadow_pipeline (StIcon *icon); +#define IMAGE_MISSING_ICON_NAME "image-missing" #define DEFAULT_ICON_SIZE 48 static void @@ -166,6 +168,7 @@ st_icon_dispose (GObject *gobject) g_clear_object (&priv->gicon); g_clear_object (&priv->fallback_gicon); + g_clear_object (&priv->default_gicon); g_clear_pointer (&priv->shadow_pipeline, cogl_object_unref); g_clear_pointer (&priv->shadow_spec, st_shadow_unref); @@ -298,6 +301,8 @@ st_icon_init (StIcon *self) CLUTTER_BIN_ALIGNMENT_FILL); clutter_actor_set_layout_manager (CLUTTER_ACTOR (self), layout_manager); + self->priv->default_gicon = g_themed_icon_new (IMAGE_MISSING_ICON_NAME); + self->priv->icon_size = DEFAULT_ICON_SIZE; self->priv->prop_icon_size = -1; @@ -442,6 +447,14 @@ st_icon_update (StIcon *icon) paint_scale, resource_scale); + if (priv->pending_texture == NULL) + priv->pending_texture = st_texture_cache_load_gicon (cache, + theme_node, + priv->default_gicon, + priv->icon_size, + paint_scale, + resource_scale); + if (priv->pending_texture) { g_object_ref_sink (priv->pending_texture);