+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkicontheme.c: When changing the icon theme, defer
+ the resetting of rc styles to an idle, so that it does
+ not happen e.g during expose handling (which is problematic,
+ since some widgets, like the toolbar, are changing the
+ hierarchy in response to style changes). (#300539, reported
+ by many people, analyzed by Owen Taylor)
+
2005-08-12 Owen Taylor <otaylor@redhat.com>
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_back_pixmap)
+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkicontheme.c: When changing the icon theme, defer
+ the resetting of rc styles to an idle, so that it does
+ not happen e.g during expose handling (which is problematic,
+ since some widgets, like the toolbar, are changing the
+ hierarchy in response to style changes). (#300539, reported
+ by many people, analyzed by Owen Taylor)
+
2005-08-12 Owen Taylor <otaylor@redhat.com>
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_back_pixmap)
+2005-08-12 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkicontheme.c: When changing the icon theme, defer
+ the resetting of rc styles to an idle, so that it does
+ not happen e.g during expose handling (which is problematic,
+ since some widgets, like the toolbar, are changing the
+ hierarchy in response to style changes). (#300539, reported
+ by many people, analyzed by Owen Taylor)
+
2005-08-12 Owen Taylor <otaylor@redhat.com>
* gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_back_pixmap)
/* time when we last stat:ed for theme changes */
long last_stat_time;
GList *dir_mtimes;
+
+ gulong reset_styles_idle;
};
struct _GtkIconInfo
}
+static gboolean
+reset_styles_idle (gpointer user_data)
+{
+ GtkIconTheme *icon_theme;
+ GtkIconThemePrivate *priv;
+
+ GDK_THREADS_ENTER ();
+
+ icon_theme = GTK_ICON_THEME (user_data);
+ priv = icon_theme->priv;
+
+ if (priv->screen && priv->is_screen_singleton)
+ {
+ GtkSettings *settings = gtk_settings_get_for_screen (priv->screen);
+ gtk_rc_reset_styles (settings);
+ }
+
+ priv->reset_styles_idle = 0;
+
+ GDK_THREADS_LEAVE ();
+
+ return FALSE;
+}
+
static void
do_theme_change (GtkIconTheme *icon_theme)
{
g_print ("change to icon theme \"%s\"\n", priv->current_theme));
blow_themes (icon_theme);
g_signal_emit (icon_theme, signal_changed, 0);
-
- if (priv->screen && priv->is_screen_singleton)
- {
- GtkSettings *settings = gtk_settings_get_for_screen (priv->screen);
- gtk_rc_reset_styles (settings);
- }
+
+ if (!priv->reset_styles_idle)
+ priv->reset_styles_idle =
+ g_idle_add (reset_styles_idle, icon_theme);
}
static void
icon_theme = GTK_ICON_THEME (object);
priv = icon_theme->priv;
+ if (priv->reset_styles_idle)
+ {
+ g_source_remove (priv->reset_styles_idle);
+ priv->reset_styles_idle = 0;
+ }
+
unset_screen (icon_theme);
g_free (priv->current_theme);