[Xfce4-commits] <ristretto:master> Implement clear-recently-used list feature.
Stephan Arts
noreply at xfce.org
Sun Aug 14 13:14:03 CEST 2011
Updating branch refs/heads/master
to aad58da05ab7d1b3d8b60dc00e843ad5d834ceb7 (commit)
from 73b90da4e798b3694c4e742aeb91ce3224bde79a (commit)
commit aad58da05ab7d1b3d8b60dc00e843ad5d834ceb7
Author: Stephan Arts <stephan at xfce.org>
Date: Sun Aug 14 13:11:28 2011 +0200
Implement clear-recently-used list feature.
src/main_window.c | 17 ++++-
src/privacy_dialog.c | 185 +++++++++++++++++++++++++++++++++++++++++++++----
src/privacy_dialog.h | 5 +-
3 files changed, 189 insertions(+), 18 deletions(-)
diff --git a/src/main_window.c b/src/main_window.c
index 342e35d..b227b97 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -2523,9 +2523,24 @@ rstto_main_window_add_file_to_recent_files (GFile *file)
static void
cb_rstto_main_window_clear_private_data (GtkWidget *widget, RsttoMainWindow *window)
{
- GtkWidget *dialog = rstto_privacy_dialog_new (GTK_WINDOW (window));
+ GtkRecentFilter *recent_filter;
+ gsize n_uris = 0;
+ gchar **uris = NULL;
+ gint i = 0;
+
+ GtkWidget *dialog = rstto_privacy_dialog_new (GTK_WINDOW (window), window->priv->recent_manager);
+
+ recent_filter = gtk_recent_filter_new();
+ gtk_recent_filter_add_application (recent_filter, "ristretto");
+ gtk_recent_chooser_add_filter(GTK_RECENT_CHOOSER(dialog), recent_filter);
gtk_dialog_run (GTK_DIALOG (dialog));
+ uris = gtk_recent_chooser_get_uris (GTK_RECENT_CHOOSER(dialog), &n_uris);
+ for (i = 0; i < n_uris; ++i)
+ {
+ gtk_recent_manager_remove_item (window->priv->recent_manager, uris[i], NULL);
+ }
+
gtk_widget_destroy (dialog);
}
diff --git a/src/privacy_dialog.c b/src/privacy_dialog.c
index 7896c2a..5d82f6a 100644
--- a/src/privacy_dialog.c
+++ b/src/privacy_dialog.c
@@ -25,9 +25,9 @@
#include "privacy_dialog.h"
static void
-rstto_privacy_dialog_init(RsttoPrivacyDialog *);
+rstto_privacy_dialog_init (RsttoPrivacyDialog *);
static void
-rstto_privacy_dialog_class_init(GObjectClass *);
+rstto_privacy_dialog_class_init (GObjectClass *);
static void
rstto_recent_chooser_init (GtkRecentChooserIface *iface);
@@ -44,9 +44,20 @@ rstto_privacy_dialog_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
+static void
+rstto_recent_chooser_add_filter (
+ GtkRecentChooser *chooser,
+ GtkRecentFilter *filter);
+static GList *
+rstto_recent_chooser_get_items (
+ GtkRecentChooser *chooser);
static void
cb_rstto_privacy_dialog_combobox_timeframe_changed (GtkComboBox *, gpointer user_data);
+gboolean
+cb_rstto_recent_filter_filter_timeframe(
+ const GtkRecentFilterInfo *filter_info,
+ gpointer user_data);
static GtkWidgetClass *parent_class = NULL;
@@ -73,6 +84,12 @@ struct _RsttoPrivacyDialogPriv
GtkWidget *cleanup_frame;
GtkWidget *cleanup_vbox;
GtkWidget *cleanup_timeframe_combo;
+
+ GtkRecentManager *recent_manager;
+ GSList *filters;
+ GtkRecentFilter *timeframe_filter;
+ time_t time_now;
+ time_t time_offset;
};
GType
@@ -111,7 +128,7 @@ rstto_privacy_dialog_get_type (void)
}
static void
-rstto_privacy_dialog_init(RsttoPrivacyDialog *dialog)
+rstto_privacy_dialog_init (RsttoPrivacyDialog *dialog)
{
GtkWidget *display_main_hbox;
GtkWidget *display_main_lbl;
@@ -119,6 +136,16 @@ rstto_privacy_dialog_init(RsttoPrivacyDialog *dialog)
dialog->priv = g_new0 (RsttoPrivacyDialogPriv, 1);
dialog->priv->settings = rstto_settings_new ();
+ dialog->priv->time_now = time(0);
+ dialog->priv->timeframe_filter = gtk_recent_filter_new ();
+
+ /* Add recent-filter function to filter in access-time */
+ gtk_recent_filter_add_custom (
+ dialog->priv->timeframe_filter,
+ GTK_RECENT_FILTER_URI,
+ (GtkRecentFilterFunc)cb_rstto_recent_filter_filter_timeframe,
+ dialog,
+ NULL);
display_main_hbox = gtk_hbox_new(FALSE, 0);
display_main_lbl = gtk_label_new(_("Timerange to clear:"));
@@ -156,7 +183,7 @@ rstto_privacy_dialog_init(RsttoPrivacyDialog *dialog)
}
static void
-rstto_privacy_dialog_class_init(GObjectClass *object_class)
+rstto_privacy_dialog_class_init (GObjectClass *object_class)
{
GParamSpec *pspec;
@@ -256,6 +283,8 @@ rstto_privacy_dialog_class_init(GObjectClass *object_class)
static void
rstto_recent_chooser_init (GtkRecentChooserIface *iface)
{
+ iface->add_filter = rstto_recent_chooser_add_filter;
+ iface->get_items = rstto_recent_chooser_get_items;
}
static void
@@ -272,24 +301,21 @@ rstto_privacy_dialog_dispose (GObject *object)
}
-GtkWidget *
-rstto_privacy_dialog_new (GtkWindow *parent)
-{
- GtkWidget *dialog = g_object_new (RSTTO_TYPE_PRIVACY_DIALOG,
- "title", _("Clear private data"),
- "icon-name", GTK_STOCK_CLEAR,
- NULL);
- gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
-
- return dialog;
-}
-
static void
rstto_privacy_dialog_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
+ RsttoPrivacyDialog *dialog = RSTTO_PRIVACY_DIALOG (object);
+
+ switch (property_id)
+ {
+ case PROP_RECENT_MANAGER:
+ dialog->priv->recent_manager = g_value_get_object (value);
+ break;
+ }
+
}
static void
@@ -299,6 +325,80 @@ rstto_privacy_dialog_get_property (GObject *object,
GParamSpec *pspec)
{
}
+
+/******************************************/
+/* GtkRecentChooserIface static functions */
+/* */
+/******************************************/
+
+static void
+rstto_recent_chooser_add_filter (
+ GtkRecentChooser *chooser,
+ GtkRecentFilter *filter)
+{
+ RsttoPrivacyDialog *dialog = RSTTO_PRIVACY_DIALOG (chooser);
+
+ /* Add the filter to the list of available filters */
+ dialog->priv->filters =
+ g_slist_append (dialog->priv->filters, filter);
+}
+
+static GList *
+rstto_recent_chooser_get_items (
+ GtkRecentChooser *chooser)
+{
+ RsttoPrivacyDialog *dialog = RSTTO_PRIVACY_DIALOG (chooser);
+ GList *all_items = gtk_recent_manager_get_items (dialog->priv->recent_manager);
+ GList *all_items_iter = all_items;
+ GList *items = g_list_copy (all_items);
+ GSList *filters = dialog->priv->filters;
+ GtkRecentInfo *info;
+ GtkRecentFilterInfo filter_info;
+ gsize n_applications;
+
+ g_list_foreach (items, (GFunc)gtk_recent_info_ref, NULL);
+
+ while (NULL != all_items_iter)
+ {
+ info = all_items_iter->data;
+
+ filter_info.contains = GTK_RECENT_FILTER_URI | GTK_RECENT_FILTER_APPLICATION;
+ filter_info.uri = gtk_recent_info_get_uri (info);
+ filter_info.applications = (const gchar **)gtk_recent_info_get_applications (info, &n_applications);
+
+ if (FALSE == gtk_recent_filter_filter(dialog->priv->timeframe_filter, &filter_info))
+ {
+ items = g_list_remove (items, info);
+ }
+ else
+ {
+ filters = dialog->priv->filters;
+
+ while (NULL != filters)
+ {
+ if (FALSE == gtk_recent_filter_filter(filters->data, &filter_info))
+ {
+ items = g_list_remove (items, info);
+ break;
+ }
+
+ filters = g_slist_next (filters);
+ }
+ }
+
+ g_strfreev ((gchar **)filter_info.applications);
+ all_items_iter = g_list_next (all_items_iter);
+ }
+
+ g_list_foreach (all_items, (GFunc)gtk_recent_info_unref, NULL);
+ g_list_free (all_items);
+
+ return items;
+}
+
+
+
+
/***************/
/* CALLBACKS */
/***************/
@@ -306,4 +406,57 @@ static void
cb_rstto_privacy_dialog_combobox_timeframe_changed (GtkComboBox *combobox, gpointer user_data)
{
RsttoPrivacyDialog *dialog = RSTTO_PRIVACY_DIALOG (user_data);
+
+ switch (gtk_combo_box_get_active (combobox))
+ {
+ case 0:
+ dialog->priv->time_offset = 3600;
+ break;
+ case 1:
+ dialog->priv->time_offset = 7200;
+ break;
+ case 2:
+ dialog->priv->time_offset = 14200;
+ break;
+ case 3:
+ /* TODO: calculate the time from time_now to midnight */
+ dialog->priv->time_offset = 14200;
+ break;
+ case 4:
+ dialog->priv->time_offset = dialog->priv->time_now;
+ break;
+ }
+}
+
+gboolean
+cb_rstto_recent_filter_filter_timeframe(
+ const GtkRecentFilterInfo *filter_info,
+ gpointer user_data)
+{
+ RsttoPrivacyDialog *dialog = RSTTO_PRIVACY_DIALOG (user_data);
+ GtkRecentInfo *info = gtk_recent_manager_lookup_item (dialog->priv->recent_manager, filter_info->uri, NULL);
+
+ if ((dialog->priv->time_now - gtk_recent_info_get_visited (info)) < dialog->priv->time_offset)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/********************/
+/* Public functions */
+/********************/
+
+GtkWidget *
+rstto_privacy_dialog_new (GtkWindow *parent, GtkRecentManager *recent_manager)
+{
+ GtkWidget *dialog = g_object_new (RSTTO_TYPE_PRIVACY_DIALOG,
+ "title", _("Clear private data"),
+ "icon-name", GTK_STOCK_CLEAR,
+ "recent-manager", recent_manager,
+ NULL);
+
+ gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
+
+ return dialog;
}
diff --git a/src/privacy_dialog.h b/src/privacy_dialog.h
index e9c270e..97011ee 100644
--- a/src/privacy_dialog.h
+++ b/src/privacy_dialog.h
@@ -62,7 +62,10 @@ GType
rstto_privacy_dialog_get_type();
GtkWidget *
-rstto_privacy_dialog_new (GtkWindow *parent);
+rstto_privacy_dialog_new (
+ GtkWindow *parent,
+ GtkRecentManager *recent_manager
+ );
G_END_DECLS
More information about the Xfce4-commits
mailing list