diff options
author | Matthias Clasen <mclasen@redhat.com> | 2007-07-20 10:39:03 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2007-07-20 10:39:03 +0000 |
commit | 13277b42e28a987c0e26f4e0ecb458b73d7f06ff (patch) | |
tree | 7eac6762224e958e7215c5754c33a453ba2d05e3 /gtk/gtkfilechooserdefault.c | |
parent | 5a58d1ab187546908a81c1525e9bc435021ce2f1 (diff) | |
download | gtk+-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.c | 61 |
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, |