summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-04-24 21:47:33 -0400
committerMatthias Clasen <mclasen@redhat.com>2012-05-02 08:46:50 -0400
commit3bc206c13e320a5c57ad00d034cb94cfc391ff50 (patch)
treeba2b0ce2d46a83dce2a5ffaba54ee7817aeaf70e
parent2b496e390f6b9f74f04b4a61caa57ad165928240 (diff)
downloadgtk+-3bc206c13e320a5c57ad00d034cb94cfc391ff50.tar.gz
icontheme: search first in all themes if the requested icon is symbolic
Symbolic icons use a "-symbolic" suffix to distinguish themselves from highcolor variants. Note that the dash character here has a different meaning than the specificity level defined in the icon-naming-spec [1], as it identifies a property of the icon itself. Since they might be provided by a parent theme (e.g. the HighContrast theme relies on the gnome icon theme for them), when we are looking up one we should first escape the generic icon inheritance mechanism defined in the icon-naming-spec [1], and privilege a symbolic icon, if it exists in a parent theme, before applying the inheritance evaluation. This fixes symbolic icons not working properly when used in the HighContrast theme with the GTK_ICON_LOOKUP_GENERIC_FALLBACK flag set. [1] http://standards.freedesktop.org/icon-naming-spec/latest/ar01s03.html https://bugzilla.gnome.org/show_bug.cgi?id=674806
-rw-r--r--gtk/gtkicontheme.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 2b4d1d4570..ec26bddb91 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -1331,6 +1331,23 @@ choose_icon (GtkIconTheme *icon_theme,
ensure_valid_themes (icon_theme);
+ /* for symbolic icons, do a search in all registered themes first;
+ * a theme that inherits them from a parent theme might provide
+ * an alternative highcolor version, but still expect the symbolic icon
+ * to show up instead.
+ */
+ if (icon_names[0] &&
+ g_str_has_suffix (icon_names[0], "-symbolic"))
+ {
+ for (l = priv->themes; l; l = l->next)
+ {
+ IconTheme *theme = l->data;
+ icon_info = theme_lookup_icon (theme, icon_names[0], size, allow_svg, use_builtin);
+ if (icon_info)
+ goto out;
+ }
+ }
+
for (l = priv->themes; l; l = l->next)
{
IconTheme *theme = l->data;