gtk+ r20006 - in trunk: . gtk
- From: ebassi svn gnome org
- To: svn-commits-list gnome org
- Subject: gtk+ r20006 - in trunk: . gtk
- Date: Tue, 15 Apr 2008 23:37:32 +0100 (BST)
Author: ebassi
Date: Tue Apr 15 23:37:32 2008
New Revision: 20006
URL: http://svn.gnome.org/viewvc/gtk+?rev=20006&view=rev
Log:
2008-04-15 Emmanuele Bassi <ebassi gnome org>
Bug 488507 â boundless growth of .recently-used.xbel file
slows down applications
* gtk/gtkrecentmanager.c:
(gtk_recent_manager_init),
(gtk_recent_manager_real_changed),
(gtk_recent_manager_set_filename),
(gtk_recent_manager_clamp_to_age): Clamp the recently
used resources list by the age of its items, using
the newly added GtkSettings property.
* gtk/gtksettings.c (gtk_settings_class_init): Add the
gtk-recent-files-max-age property, controlling the
maximum age of the items in the recently used resources
list.
Modified:
trunk/ChangeLog
trunk/gtk/gtkrecentmanager.c
trunk/gtk/gtksettings.c
Modified: trunk/gtk/gtkrecentmanager.c
==============================================================================
--- trunk/gtk/gtkrecentmanager.c (original)
+++ trunk/gtk/gtkrecentmanager.c Tue Apr 15 23:37:32 2008
@@ -137,6 +137,9 @@
static void gtk_recent_manager_real_changed (GtkRecentManager *manager);
static void gtk_recent_manager_set_filename (GtkRecentManager *manager,
const gchar *filename);
+static void gtk_recent_manager_clamp_to_age (GtkRecentManager *manager,
+ gint age);
+
static void build_recent_items_list (GtkRecentManager *manager);
static void purge_recent_items_list (GtkRecentManager *manager,
@@ -278,19 +281,13 @@
gtk_recent_manager_init (GtkRecentManager *manager)
{
GtkRecentManagerPrivate *priv;
- gchar *filename;
manager->priv = priv = GTK_RECENT_MANAGER_GET_PRIVATE (manager);
priv->limit = DEFAULT_LIMIT;
priv->size = 0;
- /* this will take care of building the files list */
- filename = g_build_filename (g_get_home_dir (),
- GTK_RECENTLY_USED_FILE,
- NULL);
- gtk_recent_manager_set_filename (manager, filename);
- g_free (filename);
+ priv->filename = NULL;
}
static void
@@ -388,14 +385,23 @@
*/
g_assert (priv->filename != NULL);
- /* if no container object has been defined, we create a new
- * empty container, and dump it
- */
if (!priv->recent_items)
{
+ /* if no container object has been defined, we create a new
+ * empty container, and dump it
+ */
priv->recent_items = g_bookmark_file_new ();
priv->size = 0;
}
+ else
+ {
+ GtkSettings *settings = gtk_settings_get_default ();
+ gint age = 30;
+
+ g_object_get (G_OBJECT (settings), "gtk-recent-files-max-age", &age, NULL);
+ if (age > 0)
+ gtk_recent_manager_clamp_to_age (manager, age);
+ }
write_error = NULL;
g_bookmark_file_to_file (priv->recent_items, priv->filename, &write_error);
@@ -458,22 +464,43 @@
g_assert (GTK_IS_RECENT_MANAGER (manager));
priv = manager->priv;
-
- g_free (priv->filename);
- if (priv->monitor)
+ /* if a filename is already set and filename is not NULL, then copy
+ * it and reset the monitor; otherwise, if it's NULL we're being
+ * called from the finalization sequence, so we simply disconnect the
+ * monitoring and return.
+ *
+ * if no filename is set and filename is NULL, use the default.
+ */
+ if (priv->filename)
{
- g_signal_handlers_disconnect_by_func (priv->monitor,
- G_CALLBACK (gtk_recent_manager_monitor_changed),
- manager);
- g_object_unref (priv->monitor);
- priv->monitor = NULL;
+ g_free (priv->filename);
+
+ if (priv->monitor)
+ {
+ g_signal_handlers_disconnect_by_func (priv->monitor,
+ G_CALLBACK (gtk_recent_manager_monitor_changed),
+ manager);
+ g_object_unref (priv->monitor);
+ priv->monitor = NULL;
+ }
+
+ if (!filename || *filename == '\0')
+ return;
+ else
+ priv->filename = g_strdup (filename);
+ }
+ else
+ {
+ if (!filename || *filename == '\0')
+ priv->filename = g_build_filename (g_get_user_data_dir (),
+ GTK_RECENTLY_USED_FILE,
+ NULL);
+ else
+ priv->filename = g_strdup (filename);
}
- if (!filename || filename[0] == '\0')
- return;
-
- priv->filename = g_strdup (filename);
+ g_assert (priv->filename != NULL);
file = g_file_new_for_path (priv->filename);
error = NULL;
@@ -1312,6 +1339,34 @@
g_signal_emit (recent_manager, signal_changed, 0);
}
+static void
+gtk_recent_manager_clamp_to_age (GtkRecentManager *manager,
+ gint age)
+{
+ GtkRecentManagerPrivate *priv = manager->priv;
+ gchar **uris;
+ gsize n_uris, i;
+ time_t now;
+
+ if (G_UNLIKELY (!priv->recent_items))
+ return;
+
+ now = time (NULL);
+
+ uris = g_bookmark_file_get_uris (priv->recent_items, &n_uris);
+ for (i = 0; i < n_uris; i++)
+ {
+ const gchar *uri = uris[i];
+ time_t modified;
+ gint item_age;
+
+ modified = g_bookmark_file_get_modified (priv->recent_items, uri, NULL);
+ item_age = (gint) ((now - modified) / (60 * 60 * 24));
+ if (item_age > age)
+ g_bookmark_file_remove_item (priv->recent_items, uri, NULL);
+ }
+}
+
/*****************
* GtkRecentInfo *
*****************/
Modified: trunk/gtk/gtksettings.c
==============================================================================
--- trunk/gtk/gtksettings.c (original)
+++ trunk/gtk/gtksettings.c Tue Apr 15 23:37:32 2008
@@ -107,7 +107,8 @@
PROP_ENABLE_MNEMONICS,
PROP_ENABLE_ACCELS,
PROP_RECENT_FILES_LIMIT,
- PROP_IM_MODULE
+ PROP_IM_MODULE,
+ PROP_RECENT_FILES_MAX_AGE
};
@@ -820,6 +821,26 @@
GTK_PARAM_READWRITE),
NULL);
g_assert (result == PROP_IM_MODULE);
+
+ /**
+ * GtkSettings:gtk-recent-files-max-age:
+ *
+ * The maximum age, in days, of the items inside the recently used
+ * resources list. Items older than this setting will be excised
+ * from the list. If set to 0, the list will always be empty; if
+ * set to -1, no item will be removed.
+ *
+ * Since: 2.14
+ */
+ result = settings_install_property_parser (class,
+ g_param_spec_int ("gtk-recent-files-max-age",
+ P_("Recent Files Max Age"),
+ P_("Maximum age of recently used files, in days"),
+ -1, G_MAXINT,
+ 30,
+ GTK_PARAM_READWRITE),
+ NULL);
+ g_assert (result == PROP_RECENT_FILES_MAX_AGE);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]