summaryrefslogtreecommitdiff
path: root/gtk/gtkicontheme.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkicontheme.c')
-rw-r--r--gtk/gtkicontheme.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 885df5381a..869cc2c701 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -72,6 +72,7 @@ struct _GtkIconThemePrivate
guint pixbuf_supports_svg : 1;
char *current_theme;
+ char *fallback_theme;
char **search_path;
int search_path_len;
@@ -412,11 +413,15 @@ update_current_theme (GtkIconTheme *icon_theme)
if (!priv->custom_theme)
{
gchar *theme = NULL;
+ gchar *fallback_theme = NULL;
+ gboolean changed = FALSE;
if (priv->screen)
{
GtkSettings *settings = gtk_settings_get_for_screen (priv->screen);
- g_object_get (settings, "gtk-icon-theme-name", &theme, NULL);
+ g_object_get (settings,
+ "gtk-icon-theme-name", &theme,
+ "gtk-fallback-icon-theme", &fallback_theme, NULL);
}
if (!theme)
@@ -427,10 +432,26 @@ update_current_theme (GtkIconTheme *icon_theme)
g_free (priv->current_theme);
priv->current_theme = theme;
- do_theme_change (icon_theme);
+ changed = TRUE;
}
else
g_free (theme);
+
+ if ((priv->fallback_theme && !fallback_theme) ||
+ (!priv->fallback_theme && fallback_theme) ||
+ (priv->fallback_theme && fallback_theme &&
+ strcmp (priv->fallback_theme, fallback_theme) != 0))
+ {
+ g_free (priv->fallback_theme);
+ priv->fallback_theme = fallback_theme;
+
+ changed = TRUE;
+ }
+ else
+ g_free (fallback_theme);
+
+ if (changed)
+ do_theme_change (icon_theme);
}
}
@@ -504,6 +525,8 @@ gtk_icon_theme_set_screen (GtkIconTheme *icon_theme,
G_CALLBACK (display_closed), icon_theme);
g_signal_connect (settings, "notify::gtk-icon-theme-name",
G_CALLBACK (theme_changed), icon_theme);
+ g_signal_connect (settings, "notify::gtk-fallback-icon-theme-name",
+ G_CALLBACK (theme_changed), icon_theme);
}
update_current_theme (icon_theme);
@@ -1019,8 +1042,10 @@ load_themes (GtkIconTheme *icon_theme)
priv->all_icons = g_hash_table_new (g_str_hash, g_str_equal);
insert_theme (icon_theme, priv->current_theme);
-
- /* Always look in the "default" icon theme */
+
+ /* Always look in the "default" icon theme, and in a fallback theme */
+ if (priv->fallback_theme)
+ insert_theme (icon_theme, priv->fallback_theme);
insert_theme (icon_theme, DEFAULT_THEME_NAME);
priv->themes = g_list_reverse (priv->themes);