From 0b1dfbf6f3f40e4e7baf67aa77b79d4f0ced6129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Thu, 23 Jan 2020 10:44:30 +0100 Subject: [PATCH] st/icon: Check icon properties for changes before regenerating texture Properly compare the new icon properties of StIcon to the old ones on style-changes and only update the icon texture in case something changed. This should help reduce the amount of texture cache requests when we start emitting all "style-changed" signals again. Part-of: --- src/st/st-icon.c | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/src/st/st-icon.c b/src/st/st-icon.c index c54fe9d72..6a9348179 100644 --- a/src/st/st-icon.c +++ b/src/st/st-icon.c @@ -60,6 +60,8 @@ struct _StIconPrivate gint icon_size; /* icon size we are using */ GIcon *fallback_gicon; + StIconColors *colors; + CoglPipeline *shadow_pipeline; StShadow *shadow_spec; graphene_size_t shadow_size; @@ -169,6 +171,7 @@ st_icon_dispose (GObject *gobject) g_clear_object (&priv->gicon); g_clear_object (&priv->fallback_gicon); + g_clear_pointer (&priv->colors, st_icon_colors_unref); g_clear_pointer (&priv->shadow_pipeline, cogl_object_unref); g_clear_pointer (&priv->shadow_spec, st_shadow_unref); @@ -212,22 +215,46 @@ st_icon_style_changed (StWidget *widget) StIcon *self = ST_ICON (widget); StThemeNode *theme_node = st_widget_get_theme_node (widget); StIconPrivate *priv = self->priv; + gboolean should_update = FALSE; + g_autoptr(StShadow) shadow_spec = NULL; + StIconColors *colors; - st_icon_clear_shadow_pipeline (self); - g_clear_pointer (&priv->shadow_spec, st_shadow_unref); + shadow_spec = st_theme_node_get_shadow (theme_node, "icon-shadow"); - priv->shadow_spec = st_theme_node_get_shadow (theme_node, "icon-shadow"); - - if (priv->shadow_spec && priv->shadow_spec->inset) + if (shadow_spec && shadow_spec->inset) { g_warning ("The icon-shadow property does not support inset shadows"); - st_shadow_unref (priv->shadow_spec); - priv->shadow_spec = NULL; + g_clear_pointer (&shadow_spec, st_shadow_unref); + } + + if ((shadow_spec && priv->shadow_spec && !st_shadow_equal (shadow_spec, priv->shadow_spec)) || + (shadow_spec && !priv->shadow_spec) || (!shadow_spec && priv->shadow_spec)) + { + st_icon_clear_shadow_pipeline (self); + + g_clear_pointer (&priv->shadow_spec, st_shadow_unref); + priv->shadow_spec = g_steal_pointer (&shadow_spec); + + should_update = TRUE; + } + + colors = st_theme_node_get_icon_colors (theme_node); + + if ((colors && priv->colors && !st_icon_colors_equal (colors, priv->colors)) || + (colors && !priv->colors) || (!colors && priv->colors)) + { + g_clear_pointer (&priv->colors, st_icon_colors_unref); + priv->colors = st_icon_colors_ref (colors); + + should_update = TRUE; } priv->theme_icon_size = (int)(0.5 + st_theme_node_get_length (theme_node, "icon-size")); - st_icon_update_icon_size (self); - st_icon_update (self); + + should_update |= st_icon_update_icon_size (self); + + if (should_update) + st_icon_update (self); } static void