]> Pileus Git - ~andy/gtk/commitdiff
Implement a clientmessage based scheme for makeing sure that all GTK+
authorMatthias Clasen <mclasen@redhat.com>
Mon, 22 Aug 2005 20:12:15 +0000 (20:12 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 22 Aug 2005 20:12:15 +0000 (20:12 +0000)
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)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-8
gtk/gtkicontheme.c
gtk/gtkwindow.c

index 841ba490e0488622daf664fd9e4b5f84bfd0f24a..eb9e32ae91140451be352ef50bab62f1c156a78b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+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
index 841ba490e0488622daf664fd9e4b5f84bfd0f24a..eb9e32ae91140451be352ef50bab62f1c156a78b 100644 (file)
@@ -1,3 +1,14 @@
+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
index 841ba490e0488622daf664fd9e4b5f84bfd0f24a..eb9e32ae91140451be352ef50bab62f1c156a78b 100644 (file)
@@ -1,3 +1,14 @@
+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
index 360a5c7b44740375e43b9fb6f59e4701bec4fdb2..07f55e03e7261f1f7d85885940bf487ac9d46379 100644 (file)
@@ -96,6 +96,8 @@ struct _GtkIconThemePrivate
   GList *dir_mtimes;
 
   gulong reset_styles_idle;
+
+  gboolean check_reload;
 };
 
 struct _GtkIconInfo
@@ -1128,7 +1130,7 @@ ensure_valid_themes (GtkIconTheme *icon_theme)
 {
   GtkIconThemePrivate *priv = icon_theme->priv;
   GTimeVal tv;
-  
+
   if (priv->themes_valid)
     {
       g_get_current_time (&tv);
@@ -1138,7 +1140,26 @@ ensure_valid_themes (GtkIconTheme *icon_theme)
     }
   
   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);
+       }
+    }
 }
 
 /**
@@ -2937,6 +2958,29 @@ find_builtin_icon (const gchar *icon_name,
   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 */
index 5d40b2711b4586054003e191259aca93586b59cc..7d27c44c4b7de13412a6d1d460d105f6b560ddde 100644 (file)
@@ -4648,10 +4648,11 @@ gtk_window_focus_out_event (GtkWidget     *widget,
 }
 
 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;
 
@@ -4664,7 +4665,7 @@ gtk_window_read_rcfiles (GtkWidget *widget,
       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)
        {
@@ -4675,8 +4676,6 @@ gtk_window_read_rcfiles (GtkWidget *widget,
 
       gdk_event_free (send_event);
     }
-
-  gtk_rc_reparse_all_for_settings (gtk_widget_get_settings (widget), FALSE);
 }
 
 static gint
@@ -4684,10 +4683,22 @@ gtk_window_client_event (GtkWidget      *widget,
                         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;
 }