st/icon: Use a static GIcon for the missing-image icon

Don't create a new GIcon for the "missing-image" texture but simply
create it once statically instead and always use that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1179
This commit is contained in:
Jonas Dreßler 2020-04-04 13:11:37 +02:00
parent 402fd8ec29
commit 1ca39e8586

View File

@ -59,7 +59,6 @@ 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;
@ -73,6 +72,8 @@ 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);
static GIcon *default_gicon = NULL;
#define IMAGE_MISSING_ICON_NAME "image-missing" #define IMAGE_MISSING_ICON_NAME "image-missing"
#define DEFAULT_ICON_SIZE 48 #define DEFAULT_ICON_SIZE 48
@ -168,7 +169,6 @@ 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);
@ -295,14 +295,15 @@ st_icon_init (StIcon *self)
{ {
ClutterLayoutManager *layout_manager; ClutterLayoutManager *layout_manager;
if (G_UNLIKELY (default_gicon == NULL))
default_gicon = g_themed_icon_new (IMAGE_MISSING_ICON_NAME);
self->priv = st_icon_get_instance_private (self); self->priv = st_icon_get_instance_private (self);
layout_manager = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_FILL, layout_manager = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_FILL,
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;
@ -453,7 +454,7 @@ st_icon_update (StIcon *icon)
if (priv->pending_texture == NULL) if (priv->pending_texture == NULL)
priv->pending_texture = st_texture_cache_load_gicon (cache, priv->pending_texture = st_texture_cache_load_gicon (cache,
theme_node, theme_node,
priv->default_gicon, default_gicon,
priv->icon_size, priv->icon_size,
paint_scale, paint_scale,
resource_scale); resource_scale);