+2005-08-22 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkwindow.c (gtk_window_client_event):
+ * gtk/gtkicontheme.c (ensure_valid_themes)
+ (_gtk_icon_theme_check_reload): Implement a clientmessage based
+ scheme for makeing sure that all GTK+ applications notice if an
+ icon theme has been updated. This should prevent multiple versions
+ of an icon theme cache to be mapped in memory at the same time,
+ which can cause excessive memory consumption. (#313156, Chris
+ Lahey)
+
2005-08-22 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkicontheme.c (gtk_icon_theme_load_icon): Add a note
+2005-08-22 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkwindow.c (gtk_window_client_event):
+ * gtk/gtkicontheme.c (ensure_valid_themes)
+ (_gtk_icon_theme_check_reload): Implement a clientmessage based
+ scheme for makeing sure that all GTK+ applications notice if an
+ icon theme has been updated. This should prevent multiple versions
+ of an icon theme cache to be mapped in memory at the same time,
+ which can cause excessive memory consumption. (#313156, Chris
+ Lahey)
+
2005-08-22 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkicontheme.c (gtk_icon_theme_load_icon): Add a note
+2005-08-22 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkwindow.c (gtk_window_client_event):
+ * gtk/gtkicontheme.c (ensure_valid_themes)
+ (_gtk_icon_theme_check_reload): Implement a clientmessage based
+ scheme for makeing sure that all GTK+ applications notice if an
+ icon theme has been updated. This should prevent multiple versions
+ of an icon theme cache to be mapped in memory at the same time,
+ which can cause excessive memory consumption. (#313156, Chris
+ Lahey)
+
2005-08-22 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkicontheme.c (gtk_icon_theme_load_icon): Add a note
GList *dir_mtimes;
gulong reset_styles_idle;
+
+ gboolean check_reload;
};
struct _GtkIconInfo
{
GtkIconThemePrivate *priv = icon_theme->priv;
GTimeVal tv;
-
+
if (priv->themes_valid)
{
g_get_current_time (&tv);
}
if (!priv->themes_valid)
- load_themes (icon_theme);
+ {
+ load_themes (icon_theme);
+
+ if (!priv->check_reload)
+ {
+ static GdkAtom atom_iconthemes = GDK_NONE;
+ GdkEvent *event = gdk_event_new (GDK_CLIENT_EVENT);
+ int i;
+
+ if (!atom_iconthemes)
+ atom_iconthemes = gdk_atom_intern ("_GTK_LOAD_ICONTHEMES", FALSE);
+
+ for (i = 0; i < 5; i++)
+ event->client.data.l[i] = 0;
+ event->client.data_format = 32;
+ event->client.message_type = atom_iconthemes;
+
+ gdk_screen_broadcast_client_message (priv->screen, event);
+ }
+ }
}
/**
return min_icon;
}
+void
+_gtk_icon_theme_check_reload (GdkDisplay *display)
+{
+ gint n_screens, i;
+ GdkScreen *screen;
+ GtkIconTheme *icon_theme;
+
+ n_screens = gdk_display_get_n_screens (display);
+
+ for (i = 0; i < n_screens; i++)
+ {
+ screen = gdk_display_get_screen (display, i);
+
+ icon_theme = g_object_get_data (G_OBJECT (screen), "gtk-icon-theme");
+ if (icon_theme)
+ {
+ icon_theme->priv->check_reload = TRUE;
+ ensure_valid_themes (icon_theme);
+ icon_theme->priv->check_reload = FALSE;
+ }
+ }
+}
+
#ifdef G_OS_WIN32
/* DLL ABI stability backward compatibility versions */
}
static GdkAtom atom_rcfiles = GDK_NONE;
+static GdkAtom atom_iconthemes = GDK_NONE;
static void
-gtk_window_read_rcfiles (GtkWidget *widget,
- GdkEventClient *event)
+send_client_message_to_embedded_windows (GtkWidget *widget,
+ GdkAtom message_type)
{
GList *embedded_windows;
for (i = 0; i < 5; i++)
send_event->client.data.l[i] = 0;
send_event->client.data_format = 32;
- send_event->client.message_type = atom_rcfiles;
+ send_event->client.message_type = message_type;
while (embedded_windows)
{
gdk_event_free (send_event);
}
-
- gtk_rc_reparse_all_for_settings (gtk_widget_get_settings (widget), FALSE);
}
static gint
GdkEventClient *event)
{
if (!atom_rcfiles)
- atom_rcfiles = gdk_atom_intern ("_GTK_READ_RCFILES", FALSE);
+ {
+ atom_rcfiles = gdk_atom_intern ("_GTK_READ_RCFILES", FALSE);
+ atom_iconthemes = gdk_atom_intern ("_GTK_LOAD_ICONTHEMES", FALSE);
+ }
if (event->message_type == atom_rcfiles)
- gtk_window_read_rcfiles (widget, event);
+ {
+ send_client_message_to_embedded_windows (widget, atom_rcfiles);
+ gtk_rc_reparse_all_for_settings (gtk_widget_get_settings (widget), FALSE);
+ }
+
+ if (event->message_type == atom_iconthemes)
+ {
+ send_client_message_to_embedded_windows (widget, atom_iconthemes);
+ _gtk_icon_theme_check_reload (gtk_widget_get_display (widget));
+ }
return FALSE;
}