summaryrefslogtreecommitdiff
path: root/gtk/gtkfilechooserdefault.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2007-07-20 10:39:03 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2007-07-20 10:39:03 +0000
commit13277b42e28a987c0e26f4e0ecb458b73d7f06ff (patch)
tree7eac6762224e958e7215c5754c33a453ba2d05e3 /gtk/gtkfilechooserdefault.c
parent5a58d1ab187546908a81c1525e9bc435021ce2f1 (diff)
downloadgtk+-13277b42e28a987c0e26f4e0ecb458b73d7f06ff.tar.gz
Apply a patch by Emmanuele Bassi to limit the number of shown recent
2007-07-20 Matthias Clasen <mclasen@redhat.com> Apply a patch by Emmanuele Bassi to limit the number of shown recent files. (#439715) * gtk/gtksettings.c: Add a setting for the number of recent files to display by default. * gtk/gtkrecentchooserdefault.c: * gtk/gtkfilechooserdefault.c: Respect the limit. * gtk/gtkrecentmanager.c: Remove the poll timeout in dispose, and do not stat more often than every 5 seconds. * gtk/gtkrecentchooserutils.c: * gtk/gtkrecentchoosermenu.c: Cleanups * tests/testrecentchoosermenu.c: Test limits. svn path=/trunk/; revision=18510
Diffstat (limited to 'gtk/gtkfilechooserdefault.c')
-rw-r--r--gtk/gtkfilechooserdefault.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c
index 372f6c9bda..f27e4bf84f 100644
--- a/gtk/gtkfilechooserdefault.c
+++ b/gtk/gtkfilechooserdefault.c
@@ -9765,6 +9765,7 @@ typedef struct
GList *items;
gint n_items;
gint n_loaded_items;
+ guint needs_sorting : 1;
} RecentLoadData;
static void
@@ -9848,6 +9849,32 @@ out:
g_object_unref (handle);
}
+static gint
+recent_sort_mru (gconstpointer a,
+ gconstpointer b)
+{
+ GtkRecentInfo *info_a = (GtkRecentInfo *) a;
+ GtkRecentInfo *info_b = (GtkRecentInfo *) b;
+
+ return (gtk_recent_info_get_modified (info_a) < gtk_recent_info_get_modified (info_b));
+}
+
+static gint
+get_recent_files_limit (GtkWidget *widget)
+{
+ GtkSettings *settings;
+ gint limit;
+
+ if (gtk_widget_has_screen (widget))
+ settings = gtk_settings_get_for_screen (gtk_widget_get_screen (widget));
+ else
+ settings = gtk_settings_get_default ();
+
+ g_object_get (G_OBJECT (settings), "gtk-recent-files-limit", &limit, NULL);
+
+ return limit;
+}
+
static gboolean
recent_idle_load (gpointer data)
{
@@ -9864,14 +9891,47 @@ recent_idle_load (gpointer data)
if (!impl->recent_manager)
return FALSE;
+ /* first iteration: load all the items */
if (!load_data->items)
{
load_data->items = gtk_recent_manager_get_items (impl->recent_manager);
if (!load_data->items)
return FALSE;
+ load_data->needs_sorting = TRUE;
+
+ return TRUE;
+ }
+
+ /* second iteration: preliminary MRU sorting and clamping */
+ if (load_data->needs_sorting)
+ {
+ gint limit;
+
+ load_data->items = g_list_sort (load_data->items, recent_sort_mru);
load_data->n_items = g_list_length (load_data->items);
+
+ limit = get_recent_files_limit (GTK_WIDGET (impl));
+
+ if (limit != -1 && (load_data->n_items > limit))
+ {
+ GList *clamp, *l;
+
+ clamp = g_list_nth (load_data->items, limit - 1);
+ if (G_LIKELY (clamp))
+ {
+ l = clamp->next;
+ clamp->next = NULL;
+
+ g_list_foreach (l, (GFunc) gtk_recent_info_unref, NULL);
+ g_list_free (l);
+
+ load_data->n_items = limit;
+ }
+ }
+
load_data->n_loaded_items = 0;
+ load_data->needs_sorting = FALSE;
return TRUE;
}
@@ -9943,6 +10003,7 @@ recent_start_loading (GtkFileChooserDefault *impl)
load_data->items = NULL;
load_data->n_items = 0;
load_data->n_loaded_items = 0;
+ load_data->needs_sorting = TRUE;
/* begin lazy loading the recent files into the model */
impl->load_recent_id = gdk_threads_add_idle_full (G_PRIORITY_HIGH_IDLE + 30,