]> Pileus Git - ~andy/gtk/commitdiff
Use g_timeout_add_seconds_full() for the timed poll of the storage file,
authorEmmanuele Bassi <ebassi@gnome.org>
Tue, 19 Jun 2007 10:59:37 +0000 (10:59 +0000)
committerEmmanuele Bassi <ebassi@src.gnome.org>
Tue, 19 Jun 2007 10:59:37 +0000 (10:59 +0000)
2007-06-19  Emmanuele Bassi  <ebassi@gnome.org>

* gtk/gtkrecentmanager.c: Use g_timeout_add_seconds_full() for
the timed poll of the storage file, since we are using multiple
seconds intervals and we don't actually care about millisecond
precision.

(threads_dispatch), (threads_free), (gtk_recent_manager_init),
(gtk_recent_manager_set_filename): Roll our own version of
gdk_threads_add_timeout() using g_timeout_add_seconds_full()
while holding the GDK main lock.

svn path=/trunk/; revision=18185

ChangeLog
configure.in
gtk/gtkrecentmanager.c

index 67eab857a08e14a1285e2992ef6cd4bfba799085..0d3681508e636097a891713f20b2edef5cf0a619 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2007-06-19  Emmanuele Bassi  <ebassi@gnome.org>
+
+       * gtk/gtkrecentmanager.c: Use g_timeout_add_seconds_full() for
+       the timed poll of the storage file, since we are using multiple
+       seconds intervals and we don't actually care about millisecond
+       precision.
+
+       (threads_dispatch), (threads_free), (gtk_recent_manager_init),
+       (gtk_recent_manager_set_filename): Roll our own version of
+       gdk_threads_add_timeout() using g_timeout_add_seconds_full()
+       while holding the GDK main lock.
+
 2007-06-19  Emmanuele Bassi  <ebassi@gnome.org>
 
        * gtk/gtkrecentmanager.c: Use a static variable to hold the
index 1233c2f1e5bf113aa0067223c11e7a75106ebf5e..47c8cc2d83498c5098ee1be675e09ccdebf4ee41 100644 (file)
@@ -31,7 +31,7 @@ m4_define([gtk_api_version], [2.0])
 m4_define([gtk_binary_version], [2.10.0])
 
 # required versions of other packages
-m4_define([glib_required_version], [2.13.3])
+m4_define([glib_required_version], [2.13.5])
 m4_define([pango_required_version], [1.15.3])
 m4_define([atk_required_version], [1.9.0])
 m4_define([cairo_required_version], [1.2.0])
index 8c0269947a3db6b8c65a9775cbf1950c9966be5f..6f038fcd5fb94b7f32fbc3e332e886c4799427e1 100644 (file)
@@ -48,8 +48,8 @@
 /* the file where we store the recently used items */
 #define GTK_RECENTLY_USED_FILE ".recently-used.xbel"
 
-/* a poll every two seconds should be enough */
-#define POLL_DELTA     2000
+/* a poll approximately every five seconds */
+#define POLL_DELTA      5
 
 /* return all items by default */
 #define DEFAULT_LIMIT  -1
 /* keep in sync with xdgmime */
 #define GTK_RECENT_DEFAULT_MIME        "application/octet-stream"
 
+typedef struct
+{
+  GSourceFunc func;
+  gpointer data;
+  GDestroyNotify notify;
+} ThreadsDispatch;
+
 typedef struct
 {
   gchar *name;
@@ -189,6 +196,32 @@ gtk_recent_manager_error_quark (void)
   return g_quark_from_static_string ("gtk-recent-manager-error-quark");
 }
 
+static gboolean
+threads_dispatch (gpointer data)
+{
+  ThreadsDispatch *dispatch = data;
+  gboolean res = FALSE;
+
+  GDK_THREADS_ENTER ();
+
+  if (!g_source_is_destroyed (g_main_current_source ()))
+    res = dispatch->func (dispatch->data);
+
+  GDK_THREADS_LEAVE ();
+
+  return res;
+}
+
+static void
+threads_free (gpointer data)
+{
+  ThreadsDispatch *dispatch = data;
+
+  if (dispatch->notify)
+    dispatch->notify (dispatch->data);
+
+  g_slice_free (ThreadsDispatch, dispatch);
+}
 
 static void
 gtk_recent_manager_class_init (GtkRecentManagerClass *klass)
@@ -277,6 +310,7 @@ static void
 gtk_recent_manager_init (GtkRecentManager *manager)
 {
   GtkRecentManagerPrivate *priv;
+  ThreadsDispatch *dispatch;
   
   priv = g_type_instance_get_private ((GTypeInstance *) manager,
                                      GTK_TYPE_RECENT_MANAGER);
@@ -292,9 +326,16 @@ gtk_recent_manager_init (GtkRecentManager *manager)
   priv->filename = g_build_filename (g_get_home_dir (),
                                     GTK_RECENTLY_USED_FILE,
                                     NULL);
-  priv->poll_timeout = gdk_threads_add_timeout (POLL_DELTA,
-                                     gtk_recent_manager_poll_timeout,
-                                     manager);
+  
+  dispatch = g_slice_new (ThreadsDispatch);
+  dispatch->func = gtk_recent_manager_poll_timeout;
+  dispatch->data = manager;
+  dispatch->notify = NULL;
+  priv->poll_timeout = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT + 30,
+                                                   POLL_DELTA,
+                                                   threads_dispatch,
+                                                   dispatch,
+                                                   threads_free);
 
   build_recent_items_list (manager);
 }
@@ -487,6 +528,7 @@ gtk_recent_manager_set_filename (GtkRecentManager *manager,
                                 const gchar      *filename)
 {
   GtkRecentManagerPrivate *priv;
+  ThreadsDispatch *dispatch;
   
   g_assert (GTK_IS_RECENT_MANAGER (manager));
   priv = manager->priv;
@@ -503,9 +545,16 @@ gtk_recent_manager_set_filename (GtkRecentManager *manager,
     }
 
   priv->filename = g_strdup (filename);
-  priv->poll_timeout = gdk_threads_add_timeout (POLL_DELTA,
-                                     gtk_recent_manager_poll_timeout,
-                                     manager);
+
+  dispatch = g_slice_new (ThreadsDispatch);
+  dispatch->func = gtk_recent_manager_poll_timeout;
+  dispatch->data = manager;
+  dispatch->notify = NULL;
+  priv->poll_timeout = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT + 30,
+                                                   POLL_DELTA,
+                                                   threads_dispatch,
+                                                   dispatch,
+                                                   threads_free);
 
   /* mark us clean, so that we can re-read the list
    * of recently used resources