summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--configure.in2
-rw-r--r--gtk/gtkrecentmanager.c65
3 files changed, 70 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 67eab857a0..0d3681508e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
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
singleton and remove the code that binds a recent manager to
a GdkScreen.
diff --git a/configure.in b/configure.in
index 1233c2f1e5..47c8cc2d83 100644
--- a/configure.in
+++ b/configure.in
@@ -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])
diff --git a/gtk/gtkrecentmanager.c b/gtk/gtkrecentmanager.c
index 8c0269947a..6f038fcd5f 100644
--- a/gtk/gtkrecentmanager.c
+++ b/gtk/gtkrecentmanager.c
@@ -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
@@ -59,6 +59,13 @@
typedef struct
{
+ GSourceFunc func;
+ gpointer data;
+ GDestroyNotify notify;
+} ThreadsDispatch;
+
+typedef struct
+{
gchar *name;
gchar *exec;
@@ -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