st/icon: Add a default fallback icon

The idea behind commit 3dd8ffc2bb 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
This commit is contained in:
Florian Müllner 2020-03-25 16:44:26 +01:00 committed by Georges Basile Stavracas Neto
parent fecc0c06ac
commit c89d6a633a

View File

@ -59,6 +59,7 @@ struct _StIconPrivate
gint theme_icon_size; /* icon size from theme node */ gint theme_icon_size; /* icon size from theme node */
gint icon_size; /* icon size we are using */ gint icon_size; /* icon size we are using */
GIcon *fallback_gicon; GIcon *fallback_gicon;
GIcon *default_gicon;
CoglPipeline *shadow_pipeline; CoglPipeline *shadow_pipeline;
StShadow *shadow_spec; 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_update_shadow_pipeline (StIcon *icon);
static void st_icon_clear_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 #define DEFAULT_ICON_SIZE 48
static void static void
@ -166,6 +168,7 @@ st_icon_dispose (GObject *gobject)
g_clear_object (&priv->gicon); g_clear_object (&priv->gicon);
g_clear_object (&priv->fallback_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_pipeline, cogl_object_unref);
g_clear_pointer (&priv->shadow_spec, st_shadow_unref); g_clear_pointer (&priv->shadow_spec, st_shadow_unref);
@ -298,6 +301,8 @@ st_icon_init (StIcon *self)
CLUTTER_BIN_ALIGNMENT_FILL); CLUTTER_BIN_ALIGNMENT_FILL);
clutter_actor_set_layout_manager (CLUTTER_ACTOR (self), layout_manager); 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->icon_size = DEFAULT_ICON_SIZE;
self->priv->prop_icon_size = -1; self->priv->prop_icon_size = -1;
@ -442,6 +447,14 @@ st_icon_update (StIcon *icon)
paint_scale, paint_scale,
resource_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) if (priv->pending_texture)
{ {
g_object_ref_sink (priv->pending_texture); g_object_ref_sink (priv->pending_texture);