From d3b0d23d8fc31667954d2ef19dc92bebf70fc287 Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Sun, 26 Aug 2012 15:36:45 +0200 Subject: [PATCH] StIcon: deprecate StIcon:icon-name and StIcon:icon-type Reroute setting those properties to a GIcon. API users are expected to create GIcon directly now. The advantage is that from a StIcon you can now create a similar one by accessing :gicon. https://bugzilla.gnome.org/show_bug.cgi?id=682540 --- src/st/st-icon.c | 72 +++++++++++++-------------------------- src/st/st-private.c | 52 ++++++++++++++++++++++++++++ src/st/st-private.h | 2 ++ src/st/st-texture-cache.c | 49 ++------------------------ 4 files changed, 80 insertions(+), 95 deletions(-) diff --git a/src/st/st-icon.c b/src/st/st-icon.c index ff75d32ec..ba04a5b36 100644 --- a/src/st/st-icon.c +++ b/src/st/st-icon.c @@ -53,7 +53,6 @@ struct _StIconPrivate guint opacity_handler_id; GIcon *gicon; - gchar *icon_name; StIconType icon_type; gint prop_icon_size; /* icon size set as property */ gint theme_icon_size; /* icon size from theme node */ @@ -174,20 +173,6 @@ st_icon_dispose (GObject *gobject) G_OBJECT_CLASS (st_icon_parent_class)->dispose (gobject); } -static void -st_icon_finalize (GObject *gobject) -{ - StIconPrivate *priv = ST_ICON (gobject)->priv; - - if (priv->icon_name) - { - g_free (priv->icon_name); - priv->icon_name = NULL; - } - - G_OBJECT_CLASS (st_icon_parent_class)->finalize (gobject); -} - static void st_icon_get_preferred_height (ClutterActor *actor, gfloat for_width, @@ -337,7 +322,6 @@ st_icon_class_init (StIconClass *klass) object_class->get_property = st_icon_get_property; object_class->set_property = st_icon_set_property; object_class->dispose = st_icon_dispose; - object_class->finalize = st_icon_finalize; actor_class->get_preferred_height = st_icon_get_preferred_height; actor_class->get_preferred_width = st_icon_get_preferred_width; @@ -348,7 +332,7 @@ st_icon_class_init (StIconClass *klass) pspec = g_param_spec_object ("gicon", "GIcon", - "A GIcon to override :icon-name", + "The GIcon shown by this icon actor", G_TYPE_ICON, ST_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_GICON, pspec); @@ -356,7 +340,7 @@ st_icon_class_init (StIconClass *klass) pspec = g_param_spec_string ("icon-name", "Icon name", "An icon name", - NULL, ST_PARAM_READWRITE); + NULL, ST_PARAM_READWRITE | G_PARAM_DEPRECATED); g_object_class_install_property (object_class, PROP_ICON_NAME, pspec); pspec = g_param_spec_enum ("icon-type", @@ -364,7 +348,7 @@ st_icon_class_init (StIconClass *klass) "The type of icon that should be used", ST_TYPE_ICON_TYPE, DEFAULT_ICON_TYPE, - ST_PARAM_READWRITE); + ST_PARAM_READWRITE | G_PARAM_DEPRECATED); g_object_class_install_property (object_class, PROP_ICON_TYPE, pspec); pspec = g_param_spec_int ("icon-size", @@ -492,14 +476,6 @@ st_icon_update (StIcon *icon) priv->gicon, priv->icon_size); } - else if (priv->icon_name) - { - priv->pending_texture = st_texture_cache_load_icon_name (cache, - theme_node, - priv->icon_name, - priv->icon_type, - priv->icon_size); - } if (priv->pending_texture) { @@ -562,9 +538,16 @@ st_icon_new (void) const gchar * st_icon_get_icon_name (StIcon *icon) { + StIconPrivate *priv; + g_return_val_if_fail (ST_IS_ICON (icon), NULL); - return icon->priv->icon_name; + priv = icon->priv; + + if (priv->gicon && G_IS_THEMED_ICON (priv->gicon)) + return g_themed_icon_get_names (G_THEMED_ICON (priv->gicon)) [0]; + else + return NULL; } void @@ -577,20 +560,20 @@ st_icon_set_icon_name (StIcon *icon, priv = icon->priv; - /* Check if there's no change */ - if (g_strcmp0 (priv->icon_name, icon_name) == 0) - return; - - g_free (priv->icon_name); - priv->icon_name = g_strdup (icon_name); - if (priv->gicon) - { - g_object_unref (priv->gicon); - priv->gicon = NULL; - g_object_notify (G_OBJECT (icon), "gicon"); - } + g_object_unref (priv->gicon); + if (icon_name) + { + if (priv->icon_type == ST_ICON_SYMBOLIC) + priv->gicon = _st_make_symbolic_themed_icon (icon_name); + else + priv->gicon = g_themed_icon_new_with_default_fallbacks (icon_name); + } + else + priv->gicon = NULL; + + g_object_notify (G_OBJECT (icon), "gicon"); g_object_notify (G_OBJECT (icon), "icon-name"); st_icon_update (icon); @@ -665,7 +648,7 @@ void st_icon_set_gicon (StIcon *icon, GIcon *gicon) { g_return_if_fail (ST_IS_ICON (icon)); - g_return_if_fail (G_IS_ICON (gicon)); + g_return_if_fail (gicon == NULL || G_IS_ICON (gicon)); if (icon->priv->gicon == gicon) /* do nothing */ return; @@ -679,13 +662,6 @@ st_icon_set_gicon (StIcon *icon, GIcon *gicon) if (gicon) icon->priv->gicon = g_object_ref (gicon); - if (icon->priv->icon_name) - { - g_free (icon->priv->icon_name); - icon->priv->icon_name = NULL; - g_object_notify (G_OBJECT (icon), "icon-name"); - } - g_object_notify (G_OBJECT (icon), "gicon"); st_icon_update (icon); diff --git a/src/st/st-private.c b/src/st/st-private.c index bab1d3c31..b34b3e483 100644 --- a/src/st/st-private.c +++ b/src/st/st-private.c @@ -691,3 +691,55 @@ _st_paint_shadow_with_opacity (StShadow *shadow_spec, shadow_box.x2, shadow_box.y2, 0, 0, 1, 1); } + +/* generates names like g_themed_icon_new_with_default_fallbacks(), + * but *only* symbolic names + */ +static char ** +symbolic_names_for_icon (const char *name) +{ + char **parts, **names; + int i, numnames; + + parts = g_strsplit (name, "-", -1); + numnames = g_strv_length (parts); + names = g_new (char *, numnames + 1); + for (i = 0; parts[i]; i++) + { + if (i == 0) + { + names[i] = g_strdup_printf ("%s-symbolic", parts[i]); + } + else + { + names[i] = g_strdup_printf ("%.*s-%s-symbolic", + (int) (strlen (names[i - 1]) - strlen ("-symbolic")), + names[i - 1], parts[i]); + } + } + names[i] = NULL; + + g_strfreev (parts); + + /* need to reverse here, because longest (most specific) + name has to come first */ + for (i = 0; i < (numnames / 2); i++) { + char *tmp = names[i]; + names[i] = names[numnames - i - 1]; + names[numnames - i - 1] = tmp; + } + return names; +} + +GIcon * +_st_make_symbolic_themed_icon (const char *icon_name) +{ + char **names; + GIcon *themed; + + names = symbolic_names_for_icon (icon_name); + themed = g_themed_icon_new_from_names (names, -1); + g_strfreev (names); + + return themed; +} diff --git a/src/st/st-private.h b/src/st/st-private.h index c8ee49523..87edff9e5 100644 --- a/src/st/st-private.h +++ b/src/st/st-private.h @@ -79,4 +79,6 @@ void _st_paint_shadow_with_opacity (StShadow *shadow_spec, ClutterActorBox *box, guint8 paint_opacity); +GIcon *_st_make_symbolic_themed_icon (const char *icon_name); + #endif /* __ST_PRIVATE_H__ */ diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c index 68dd33769..67c7c5292 100644 --- a/src/st/st-texture-cache.c +++ b/src/st/st-texture-cache.c @@ -22,6 +22,7 @@ #include "config.h" #include "st-texture-cache.h" +#include "st-private.h" #include #include #include @@ -967,9 +968,6 @@ load_gicon_with_colors (StTextureCache *cache, * icon isn't loaded already, the texture will be filled * asynchronously. * - * This will load @icon as a full-color icon; if you want a symbolic - * icon, you must use st_texture_cache_load_icon_name(). - * * Return Value: (transfer none): A new #ClutterActor for the icon, or %NULL if not found */ ClutterActor * @@ -1135,46 +1133,6 @@ st_texture_cache_load_sliced_image (StTextureCache *cache, * full-color icon. */ -/* generates names like g_themed_icon_new_with_default_fallbacks(), - * but *only* symbolic names - */ -static char ** -symbolic_names_for_icon (const char *name) -{ - char **parts, **names; - int i, numnames; - - parts = g_strsplit (name, "-", -1); - numnames = g_strv_length (parts); - names = g_new (char *, numnames + 1); - for (i = 0; parts[i]; i++) - { - if (i == 0) - { - names[i] = g_strdup_printf ("%s-symbolic", parts[i]); - } - else - { - names[i] = g_strdup_printf ("%.*s-%s-symbolic", - (int) (strlen (names[i - 1]) - strlen ("-symbolic")), - names[i - 1], parts[i]); - } - } - names[i] = NULL; - - g_strfreev (parts); - - /* need to reverse here, because longest (most specific) - name has to come first */ - for (i = 0; i < (numnames / 2); i++) { - char *tmp = names[i]; - names[i] = names[numnames - i - 1]; - names[numnames - i - 1] = tmp; - } - - return names; -} - /** * st_texture_cache_load_icon_name: * @cache: The texture cache instance @@ -1198,16 +1156,13 @@ st_texture_cache_load_icon_name (StTextureCache *cache, { ClutterActor *texture; GIcon *themed; - char **names; g_return_val_if_fail (!(icon_type == ST_ICON_SYMBOLIC && theme_node == NULL), NULL); switch (icon_type) { case ST_ICON_SYMBOLIC: - names = symbolic_names_for_icon (name); - themed = g_themed_icon_new_from_names (names, -1); - g_strfreev (names); + themed = _st_make_symbolic_themed_icon (name); texture = load_gicon_with_colors (cache, themed, size, st_theme_node_get_icon_colors (theme_node)); g_object_unref (themed);