diff --git a/ChangeLog b/ChangeLog index 9ae69a9842..c686083406 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2005-08-12 Matthias Clasen + + * 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 * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_back_pixmap) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 9ae69a9842..c686083406 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,12 @@ +2005-08-12 Matthias Clasen + + * 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 * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_back_pixmap) diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 9ae69a9842..c686083406 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,12 @@ +2005-08-12 Matthias Clasen + + * 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 * gdk/linux-fb/gdkwindow-fb.c (gdk_window_set_back_pixmap) diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c index 8e36998fde..eddfddf574 100644 --- a/gtk/gtkicontheme.c +++ b/gtk/gtkicontheme.c @@ -94,6 +94,8 @@ struct _GtkIconThemePrivate /* time when we last stat:ed for theme changes */ long last_stat_time; GList *dir_mtimes; + + gulong reset_styles_idle; }; struct _GtkIconInfo @@ -585,6 +587,30 @@ free_dir_mtime (IconThemeDirMtime *dir_mtime) } +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) { @@ -594,12 +620,10 @@ 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 @@ -633,6 +657,12 @@ gtk_icon_theme_finalize (GObject *object) 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);