From f36c9e446e0640cbf78b76117d3fa254181b7882 Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Thu, 4 Jan 2007 01:09:30 +0000 Subject: [PATCH] 2007-01-03 Jim Evins * src/recent-files/* Removed EggRecent stuff. * configure.in: * src/Makefile.am: * src/file.c: * src/recent.c: * src/recent.h: * src/ui-commands.c: * src/ui-commands.h: * src/ui.c: Ported from EggRecent to GtkRecentManager. git-svn-id: https://glabels.svn.sourceforge.net/svnroot/glabels/trunk@603 f5e0f49d-192f-0410-a22d-a8d8700d0965 --- glabels2/ChangeLog | 15 + glabels2/configure.in | 1 - glabels2/src/Makefile.am | 3 +- glabels2/src/file.c | 10 +- glabels2/src/recent-files/Makefile.am | 21 - glabels2/src/recent-files/egg-recent-item.c | 462 ----- glabels2/src/recent-files/egg-recent-item.h | 80 - glabels2/src/recent-files/egg-recent-model.c | 1781 ----------------- glabels2/src/recent-files/egg-recent-model.h | 80 - glabels2/src/recent-files/egg-recent-util.c | 138 -- glabels2/src/recent-files/egg-recent-util.h | 23 - .../recent-files/egg-recent-view-uimanager.c | 738 ------- .../recent-files/egg-recent-view-uimanager.h | 60 - glabels2/src/recent-files/egg-recent-view.c | 68 - glabels2/src/recent-files/egg-recent-view.h | 43 - glabels2/src/recent-files/egg-recent.h | 6 - glabels2/src/recent-files/update-from-egg.sh | 25 - glabels2/src/recent.c | 214 +- glabels2/src/recent.h | 20 +- glabels2/src/ui-commands.c | 26 +- glabels2/src/ui-commands.h | 5 +- glabels2/src/ui.c | 60 +- 22 files changed, 166 insertions(+), 3713 deletions(-) delete mode 100644 glabels2/src/recent-files/Makefile.am delete mode 100644 glabels2/src/recent-files/egg-recent-item.c delete mode 100644 glabels2/src/recent-files/egg-recent-item.h delete mode 100644 glabels2/src/recent-files/egg-recent-model.c delete mode 100644 glabels2/src/recent-files/egg-recent-model.h delete mode 100644 glabels2/src/recent-files/egg-recent-util.c delete mode 100644 glabels2/src/recent-files/egg-recent-util.h delete mode 100644 glabels2/src/recent-files/egg-recent-view-uimanager.c delete mode 100644 glabels2/src/recent-files/egg-recent-view-uimanager.h delete mode 100644 glabels2/src/recent-files/egg-recent-view.c delete mode 100644 glabels2/src/recent-files/egg-recent-view.h delete mode 100644 glabels2/src/recent-files/egg-recent.h delete mode 100755 glabels2/src/recent-files/update-from-egg.sh diff --git a/glabels2/ChangeLog b/glabels2/ChangeLog index a496754a..fc35486a 100644 --- a/glabels2/ChangeLog +++ b/glabels2/ChangeLog @@ -1,3 +1,18 @@ +2007-01-03 Jim Evins + + * src/recent-files/* + Removed EggRecent stuff. + * configure.in: + * src/Makefile.am: + * src/file.c: + * src/recent.c: + * src/recent.h: + * src/ui-commands.c: + * src/ui-commands.h: + * src/ui.c: + Ported from EggRecent to GtkRecentManager. + + 2007-01-02 Jim Evins * configure.in: diff --git a/glabels2/configure.in b/glabels2/configure.in index db525393..ea600166 100644 --- a/glabels2/configure.in +++ b/glabels2/configure.in @@ -188,7 +188,6 @@ src/Makefile src/pixmaps/Makefile src/stock-pixmaps/Makefile src/mygal/Makefile -src/recent-files/Makefile data/Makefile data/templates/Makefile data/pixmaps/Makefile diff --git a/glabels2/src/Makefile.am b/glabels2/src/Makefile.am index 4a11700a..7f0b1953 100644 --- a/glabels2/src/Makefile.am +++ b/glabels2/src/Makefile.am @@ -1,7 +1,7 @@ LIB_BARCODE_DIR = ../barcode-0.98 LIB_IEC16022_DIR = ../iec16022-0.2.1 -SUBDIRS= pixmaps stock-pixmaps mygal recent-files +SUBDIRS= pixmaps stock-pixmaps mygal bin_PROGRAMS = glabels glabels-batch @@ -26,7 +26,6 @@ glabels_LDADD = \ $(GLABELS_LIBS) \ ../libglabels/libglabels.la \ mygal/libmygal.la \ - recent-files/librecent.la \ $(LIB_BARCODE_DIR)/libbarcode.la \ $(LIB_IEC16022_DIR)/libiec16022.la diff --git a/glabels2/src/file.c b/glabels2/src/file.c index 8bff5918..4f934c55 100644 --- a/glabels2/src/file.c +++ b/glabels2/src/file.c @@ -325,7 +325,6 @@ open_response (GtkDialog *chooser, gchar *filename; GtkWidget *dialog; gint ret; - EggRecentModel *recent; gl_debug (DEBUG_FILE, "START"); @@ -422,7 +421,6 @@ gl_file_open_real (const gchar *filename, gchar *abs_filename; glLabel *label; glXMLLabelStatus status; - EggRecentModel *recent; gint ret; GtkWidget *new_window; @@ -462,7 +460,7 @@ gl_file_open_real (const gchar *filename, gtk_widget_show_all (new_window); } - gl_recent_add_uri (abs_filename); + gl_recent_add_utf8_filename (abs_filename); if (open_path != NULL) g_free (open_path); @@ -486,7 +484,6 @@ gl_file_save (glLabel *label, glXMLLabelStatus status; GError *error = NULL; gchar *filename = NULL; - EggRecentModel *recent; gl_debug (DEBUG_FILE, ""); @@ -538,7 +535,7 @@ gl_file_save (glLabel *label, { gl_debug (DEBUG_FILE, "OK"); - gl_recent_add_uri (filename); + gl_recent_add_utf8_filename (filename); g_free (filename); @@ -625,7 +622,6 @@ save_as_response (GtkDialog *chooser, gchar *raw_filename, *filename, *full_filename; GtkWidget *dialog; glXMLLabelStatus status; - EggRecentModel *recent; gboolean *saved_flag; gboolean cancel_flag = FALSE; @@ -712,7 +708,7 @@ save_as_response (GtkDialog *chooser, *saved_flag = TRUE; - gl_recent_add_uri (filename); + gl_recent_add_utf8_filename (filename); if (save_path != NULL) g_free (save_path); diff --git a/glabels2/src/recent-files/Makefile.am b/glabels2/src/recent-files/Makefile.am deleted file mode 100644 index bb0cec19..00000000 --- a/glabels2/src/recent-files/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -INCLUDES = \ - $(GLABELS_CFLAGS) - - -EGG_FILES = \ - egg-recent.h \ - egg-recent-item.c \ - egg-recent-item.h \ - egg-recent-model.c \ - egg-recent-model.h \ - egg-recent-util.c \ - egg-recent-util.h \ - egg-recent-view.c \ - egg-recent-view.h \ - egg-recent-view-uimanager.c \ - egg-recent-view-uimanager.h - -noinst_LTLIBRARIES = librecent.la - -librecent_la_SOURCES = $(EGG_FILES) - diff --git a/glabels2/src/recent-files/egg-recent-item.c b/glabels2/src/recent-files/egg-recent-item.c deleted file mode 100644 index 535e2227..00000000 --- a/glabels2/src/recent-files/egg-recent-item.c +++ /dev/null @@ -1,462 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - * - * Authors: - * James Willcox - */ - - -#include -#include -#include -#include -#include -#include "egg-recent-item.h" - - - -EggRecentItem * -egg_recent_item_new (void) -{ - EggRecentItem *item; - - item = g_new (EggRecentItem, 1); - - item->groups = NULL; - item->private_data = FALSE; - item->uri = NULL; - item->mime_type = NULL; - item->mime_type_is_explicit = FALSE; - - item->refcount = 1; - - return item; -} - -static void -egg_recent_item_free (EggRecentItem *item) -{ - if (item->uri) - g_free (item->uri); - - if (item->mime_type) - g_free (item->mime_type); - - if (item->groups) { - g_list_foreach (item->groups, (GFunc)g_free, NULL); - g_list_free (item->groups); - item->groups = NULL; - } - - g_free (item); -} - -EggRecentItem * -egg_recent_item_ref (EggRecentItem *item) -{ - item->refcount++; - return item; -} - -EggRecentItem * -egg_recent_item_unref (EggRecentItem *item) -{ - item->refcount--; - - if (item->refcount == 0) { - egg_recent_item_free (item); - } - - return item; -} - - -EggRecentItem * -egg_recent_item_new_from_uri (const gchar *uri) -{ - EggRecentItem *item; - - g_return_val_if_fail (uri != NULL, NULL); - - item = egg_recent_item_new (); - - if (!egg_recent_item_set_uri (item ,uri)) { - egg_recent_item_free (item); - return NULL; - } - - return item; -} - -/* -static GList * -egg_recent_item_copy_groups (const GList *list) -{ - GList *newlist = NULL; - - while (list) { - gchar *group = (gchar *)list->data; - - newlist = g_list_prepend (newlist, g_strdup (group)); - - list = list->next; - } - - return newlist; -} - - -EggRecentItem * -egg_recent_item_copy (const EggRecentItem *item) -{ - EggRecentItem *newitem; - - newitem = egg_recent_item_new (); - newitem->uri = g_strdup (item->uri); - if (item->mime_type) - newitem->mime_type = g_strdup (item->mime_type); - newitem->mime_type_is_explicit = item->mime_type_is_explicit - newitem->timestamp = item->timestamp; - newitem->private_data = item->private_data; - newitem->groups = egg_recent_item_copy_groups (item->groups); - - return newitem; -} -*/ - -/* -EggRecentItem * -egg_recent_item_new_valist (const gchar *uri, va_list args) -{ - EggRecentItem *item; - EggRecentArg arg; - gchar *str1; - gchar *str2; - gboolean priv; - - item = egg_recent_item_new (); - - arg = va_arg (args, EggRecentArg); - - while (arg != EGG_RECENT_ARG_NONE) { - switch (arg) { - case EGG_RECENT_ARG_MIME_TYPE: - str1 = va_arg (args, gchar*); - - egg_recent_item_set_mime_type (item, str1); - break; - case EGG_RECENT_ARG_GROUP: - str1 = va_arg (args, gchar*); - - egg_recent_item_add_group (item, str1); - break; - case EGG_RECENT_ARG_PRIVATE: - priv = va_arg (args, gboolean); - - egg_recent_item_set_private (item, priv); - break; - default: - break; - } - - arg = va_arg (args, EggRecentArg); - } - - return item; -} -*/ - -static void -egg_recent_item_update_mime_type (EggRecentItem *item) -{ - if (!item->mime_type_is_explicit) { - g_free (item->mime_type); - item->mime_type = NULL; - - if (item->uri) - item->mime_type = gnome_vfs_get_mime_type (item->uri); - - if (!item->mime_type) - item->mime_type = g_strdup (GNOME_VFS_MIME_TYPE_UNKNOWN); - } -} - -gboolean -egg_recent_item_set_uri (EggRecentItem *item, const gchar *uri) -{ - gchar *utf8_uri; - - /* if G_BROKEN_FILENAMES is not set, this should succede */ - if (g_utf8_validate (uri, -1, NULL)) { - item->uri = gnome_vfs_make_uri_from_input (uri); - } else { - utf8_uri = g_filename_to_utf8 (uri, -1, NULL, NULL, NULL); - - if (utf8_uri == NULL) { - g_warning ("Couldn't convert URI to UTF-8"); - return FALSE; - } - - if (g_utf8_validate (utf8_uri, -1, NULL)) { - item->uri = gnome_vfs_make_uri_from_input (utf8_uri); - } else { - g_free (utf8_uri); - return FALSE; - } - - g_free (utf8_uri); - } - - return TRUE; -} - -gchar * -egg_recent_item_get_uri (const EggRecentItem *item) -{ - return g_strdup (item->uri); -} - -G_CONST_RETURN gchar * -egg_recent_item_peek_uri (const EggRecentItem *item) -{ - return item->uri; -} - -gchar * -egg_recent_item_get_uri_utf8 (const EggRecentItem *item) -{ - /* this could fail, but it's not likely, since we've already done it - * once in set_uri() - */ - return g_filename_to_utf8 (item->uri, -1, NULL, NULL, NULL); -} - -gchar * -egg_recent_item_get_uri_for_display (const EggRecentItem *item) -{ - return gnome_vfs_format_uri_for_display (item->uri); -} - -/* Stolen from gnome_vfs_make_valid_utf8() */ -static char * -make_valid_utf8 (const char *name) -{ - GString *string; - const char *remainder, *invalid; - int remaining_bytes, valid_bytes; - - string = NULL; - remainder = name; - remaining_bytes = name ? strlen (name) : 0; - - while (remaining_bytes != 0) { - if (g_utf8_validate (remainder, remaining_bytes, &invalid)) - break; - - valid_bytes = invalid - remainder; - - if (string == NULL) - string = g_string_sized_new (remaining_bytes); - - g_string_append_len (string, remainder, valid_bytes); - g_string_append_c (string, '?'); - - remaining_bytes -= valid_bytes + 1; - remainder = invalid + 1; - } - - if (string == NULL) - return g_strdup (name); - - g_string_append (string, remainder); -/* g_string_append (string, _(" (invalid file name)")); */ - g_assert (g_utf8_validate (string->str, -1, NULL)); - - return g_string_free (string, FALSE); -} - -/** - * egg_recent_item_get_short_name: - * @item: an #EggRecentItem - * - * Computes a valid UTF-8 string that can be used as the name of the item in a - * menu or list. For example, calling this function on an item that refers to - * "file:///foo/bar.txt" will yield "bar.txt". - * - * Return value: A newly-allocated string in UTF-8 encoding; free it with - * g_free(). - **/ -gchar * -egg_recent_item_get_short_name (const EggRecentItem *item) -{ - GnomeVFSURI *uri; - char *short_name; - gboolean valid; - - g_return_val_if_fail (item != NULL, NULL); - - if (item->uri == NULL) - return NULL; - - uri = gnome_vfs_uri_new (item->uri); - if (uri == NULL) - return NULL; - - short_name = gnome_vfs_uri_extract_short_name (uri); - valid = FALSE; - - if (strcmp (gnome_vfs_uri_get_scheme (uri), "file") == 0) { - char *tmp; - - tmp = g_filename_to_utf8 (short_name, -1, NULL, NULL, NULL); - if (tmp) { - g_free (short_name); - short_name = tmp; - valid = TRUE; - } - } - - if (!valid) { - char *tmp; - - tmp = make_valid_utf8 (short_name); - g_assert (tmp != NULL); - g_free (short_name); - short_name = tmp; - } - - gnome_vfs_uri_unref (uri); - - return short_name; -} - -void -egg_recent_item_set_mime_type (EggRecentItem *item, const gchar *mime) -{ - g_free (item->mime_type); - item->mime_type = NULL; - - if (mime && mime[0]) { - item->mime_type_is_explicit = TRUE; - item->mime_type = g_strdup (mime); - } else { - item->mime_type_is_explicit = FALSE; - } -} - -gchar * -egg_recent_item_get_mime_type (EggRecentItem *item) -{ - egg_recent_item_update_mime_type (item); - - return g_strdup (item->mime_type); -} - -void -egg_recent_item_set_timestamp (EggRecentItem *item, time_t timestamp) -{ - if (timestamp == (time_t) -1) - time (×tamp); - - item->timestamp = timestamp; -} - -time_t -egg_recent_item_get_timestamp (const EggRecentItem *item) -{ - return item->timestamp; -} - -G_CONST_RETURN GList * -egg_recent_item_get_groups (const EggRecentItem *item) -{ - return item->groups; -} - -gboolean -egg_recent_item_in_group (const EggRecentItem *item, const gchar *group_name) -{ - GList *tmp; - - tmp = item->groups; - while (tmp != NULL) { - gchar *val = (gchar *)tmp->data; - - if (strcmp (group_name, val) == 0) - return TRUE; - - tmp = tmp->next; - } - - return FALSE; -} - -void -egg_recent_item_add_group (EggRecentItem *item, const gchar *group_name) -{ - g_return_if_fail (group_name != NULL); - - if (!egg_recent_item_in_group (item, group_name)) - item->groups = g_list_append (item->groups, g_strdup (group_name)); -} - -void -egg_recent_item_remove_group (EggRecentItem *item, const gchar *group_name) -{ - GList *tmp; - - g_return_if_fail (group_name != NULL); - - tmp = item->groups; - while (tmp != NULL) { - gchar *val = (gchar *)tmp->data; - - if (strcmp (group_name, val) == 0) { - item->groups = g_list_remove (item->groups, - val); - g_free (val); - break; - } - - tmp = tmp->next; - } -} - -void -egg_recent_item_set_private (EggRecentItem *item, gboolean priv) -{ - item->private_data = priv; -} - -gboolean -egg_recent_item_get_private (const EggRecentItem *item) -{ - return item->private_data; -} - -GType -egg_recent_item_get_type (void) -{ - static GType boxed_type = 0; - - if (!boxed_type) { - boxed_type = g_boxed_type_register_static ("EggRecentItem", - (GBoxedCopyFunc)egg_recent_item_ref, - (GBoxedFreeFunc)egg_recent_item_unref); - } - - return boxed_type; -} diff --git a/glabels2/src/recent-files/egg-recent-item.h b/glabels2/src/recent-files/egg-recent-item.h deleted file mode 100644 index 00f8fb84..00000000 --- a/glabels2/src/recent-files/egg-recent-item.h +++ /dev/null @@ -1,80 +0,0 @@ - -#ifndef __EGG_RECENT_ITEM_H__ -#define __EGG_RECENT_ITEM_H__ - -#include -#include -#include - -G_BEGIN_DECLS - -#define EGG_TYPE_RECENT_ITEM (egg_recent_item_get_type ()) - -#define EGG_RECENT_ITEM_LIST_UNREF(list) \ - g_list_foreach (list, (GFunc)egg_recent_item_unref, NULL); \ - g_list_free (list); - -typedef struct _EggRecentItem EggRecentItem; - -struct _EggRecentItem { - /* do not access any of these directly */ - gchar *uri; - gchar *mime_type; - time_t timestamp; - - gboolean private_data; - - GList *groups; - - int refcount; - - guint mime_type_is_explicit : 1; -}; - -GType egg_recent_item_get_type (void) G_GNUC_CONST; - -/* constructors */ -EggRecentItem * egg_recent_item_new (void); - -EggRecentItem * egg_recent_item_ref (EggRecentItem *item); -EggRecentItem * egg_recent_item_unref (EggRecentItem *item); - -/* automatically fetches the mime type, etc */ -EggRecentItem * egg_recent_item_new_from_uri (const gchar *uri); - -gboolean egg_recent_item_set_uri (EggRecentItem *item, const gchar *uri); -gchar * egg_recent_item_get_uri (const EggRecentItem *item); -gchar * egg_recent_item_get_uri_utf8 (const EggRecentItem *item); -gchar * egg_recent_item_get_uri_for_display (const EggRecentItem *item); -gchar * egg_recent_item_get_short_name (const EggRecentItem *item); - -void egg_recent_item_set_mime_type (EggRecentItem *item, const gchar *mime); -gchar * egg_recent_item_get_mime_type (EggRecentItem *item); - -void egg_recent_item_set_timestamp (EggRecentItem *item, time_t timestamp); -time_t egg_recent_item_get_timestamp (const EggRecentItem *item); - -G_CONST_RETURN gchar *egg_recent_item_peek_uri (const EggRecentItem *item); - - -/* groups */ -G_CONST_RETURN GList * egg_recent_item_get_groups (const EggRecentItem *item); - -gboolean egg_recent_item_in_group (const EggRecentItem *item, - const gchar *group_name); - -void egg_recent_item_add_group (EggRecentItem *item, - const gchar *group_name); - -void egg_recent_item_remove_group (EggRecentItem *item, - const gchar *group_name); - -void egg_recent_item_set_private (EggRecentItem *item, - gboolean priv); - -gboolean egg_recent_item_get_private (const EggRecentItem *item); - - -G_END_DECLS - -#endif /* __EGG_RECENT_ITEM_H__ */ diff --git a/glabels2/src/recent-files/egg-recent-model.c b/glabels2/src/recent-files/egg-recent-model.c deleted file mode 100644 index 201aec00..00000000 --- a/glabels2/src/recent-files/egg-recent-model.c +++ /dev/null @@ -1,1781 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - * - * Authors: - * James Willcox - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "egg-recent-model.h" -#include "egg-recent-item.h" - -#define EGG_RECENT_MODEL_FILE_PATH "/.recently-used" -#define EGG_RECENT_MODEL_BUFFER_SIZE 8192 - -#define EGG_RECENT_MODEL_MAX_ITEMS 500 -#define EGG_RECENT_MODEL_DEFAULT_LIMIT 10 -#define EGG_RECENT_MODEL_TIMEOUT_LENGTH 200 - -#define EGG_RECENT_MODEL_KEY_DIR "/desktop/gnome/recent_files" -#define EGG_RECENT_MODEL_DEFAULT_LIMIT_KEY EGG_RECENT_MODEL_KEY_DIR "/default_limit" -#define EGG_RECENT_MODEL_EXPIRE_KEY EGG_RECENT_MODEL_KEY_DIR "/expire" - -struct _EggRecentModelPrivate { - GSList *mime_filter_values; /* list of mime types we allow */ - GSList *group_filter_values; /* list of groups we allow */ - GSList *scheme_filter_values; /* list of URI schemes we allow */ - - EggRecentModelSort sort_type; /* type of sorting to be done */ - - int limit; /* soft limit for length of the list */ - int expire_days; /* number of days to hold an item */ - - char *path; /* path to the file we store stuff in */ - - GHashTable *monitors; - - GnomeVFSMonitorHandle *monitor; - - GConfClient *client; - gboolean use_default_limit; - - guint limit_change_notify_id; - guint expiration_change_notify_id; - - guint changed_timeout; -}; - -/* signals */ -enum { - CHANGED, - LAST_SIGNAL -}; - -static GType model_signals[LAST_SIGNAL] = { 0 }; - -/* properties */ -enum { - PROP_BOGUS, - PROP_MIME_FILTERS, - PROP_GROUP_FILTERS, - PROP_SCHEME_FILTERS, - PROP_SORT_TYPE, - PROP_LIMIT -}; - -typedef struct { - GSList *states; - GList *items; - EggRecentItem *current_item; -}ParseInfo; - -typedef enum { - STATE_START, - STATE_RECENT_FILES, - STATE_RECENT_ITEM, - STATE_URI, - STATE_MIME_TYPE, - STATE_TIMESTAMP, - STATE_PRIVATE, - STATE_GROUPS, - STATE_GROUP -} ParseState; - -typedef struct _ChangedData { - EggRecentModel *model; - GList *list; -}ChangedData; - -#define TAG_RECENT_FILES "RecentFiles" -#define TAG_RECENT_ITEM "RecentItem" -#define TAG_URI "URI" -#define TAG_MIME_TYPE "Mime-Type" -#define TAG_TIMESTAMP "Timestamp" -#define TAG_PRIVATE "Private" -#define TAG_GROUPS "Groups" -#define TAG_GROUP "Group" - -static void start_element_handler (GMarkupParseContext *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer user_data, - GError **error); - -static void end_element_handler (GMarkupParseContext *context, - const gchar *element_name, - gpointer user_data, - GError **error); - -static void text_handler (GMarkupParseContext *context, - const gchar *text, - gsize text_len, - gpointer user_data, - GError **error); - -static void error_handler (GMarkupParseContext *context, - GError *error, - gpointer user_data); - -static GMarkupParser parser = {start_element_handler, end_element_handler, - text_handler, - NULL, - error_handler}; - -static gboolean -egg_recent_model_string_match (const GSList *list, const gchar *str) -{ - const GSList *tmp; - - if (list == NULL || str == NULL) - return TRUE; - - tmp = list; - - while (tmp) { - if (g_pattern_match_string (tmp->data, str)) - return TRUE; - - tmp = tmp->next; - } - - return FALSE; -} - -static gboolean -egg_recent_model_write_raw (EggRecentModel *model, FILE *file, - const gchar *content) -{ - int len; - int fd; - struct stat sbuf; - - rewind (file); - - len = strlen (content); - fd = fileno (file); - - if (fstat (fd, &sbuf) < 0) - g_warning ("Couldn't stat XML document."); - - if ((off_t)len < sbuf.st_size) { - ftruncate (fd, len); - } - - if (fputs (content, file) == EOF) - return FALSE; - - fsync (fd); - rewind (file); - - return TRUE; -} - -static GList * -egg_recent_model_delete_from_list (GList *list, - const gchar *uri) -{ - GList *tmp; - - if (!uri) - return list; - - tmp = list; - - while (tmp) { - EggRecentItem *item = tmp->data; - GList *next; - - next = tmp->next; - - if (!strcmp (egg_recent_item_peek_uri (item), uri)) { - egg_recent_item_unref (item); - - list = g_list_remove_link (list, tmp); - g_list_free_1 (tmp); - } - - tmp = next; - } - - return list; -} - -static void -egg_recent_model_add_new_groups (EggRecentItem *item, - EggRecentItem *upd_item) -{ - const GList *tmp; - - tmp = egg_recent_item_get_groups (upd_item); - - while (tmp) { - char *group = tmp->data; - - if (!egg_recent_item_in_group (item, group)) - egg_recent_item_add_group (item, group); - - tmp = tmp->next; - } -} - -static gboolean -egg_recent_model_update_item (GList *items, EggRecentItem *upd_item) -{ - GList *tmp; - const char *uri; - - uri = egg_recent_item_peek_uri (upd_item); - - tmp = items; - - while (tmp) { - EggRecentItem *item = tmp->data; - - if (gnome_vfs_uris_match (egg_recent_item_peek_uri (item), uri)) { - egg_recent_item_set_timestamp (item, (time_t) -1); - - egg_recent_model_add_new_groups (item, upd_item); - - return TRUE; - } - - tmp = tmp->next; - } - - return FALSE; -} - -static gchar * -egg_recent_model_read_raw (EggRecentModel *model, FILE *file) -{ - GString *string; - char buf[EGG_RECENT_MODEL_BUFFER_SIZE]; - - rewind (file); - - string = g_string_new (NULL); - while (fgets (buf, EGG_RECENT_MODEL_BUFFER_SIZE, file)) { - string = g_string_append (string, buf); - } - - rewind (file); - - return g_string_free (string, FALSE); -} - - - -static void -parse_info_init (ParseInfo *info) -{ - info->states = g_slist_prepend (NULL, STATE_START); - info->items = NULL; -} - -static void -parse_info_free (ParseInfo *info) -{ - g_slist_free (info->states); -} - -static void -push_state (ParseInfo *info, - ParseState state) -{ - info->states = g_slist_prepend (info->states, GINT_TO_POINTER (state)); -} - -static void -pop_state (ParseInfo *info) -{ - g_return_if_fail (info->states != NULL); - - info->states = g_slist_remove (info->states, info->states->data); -} - -static ParseState -peek_state (ParseInfo *info) -{ - g_return_val_if_fail (info->states != NULL, STATE_START); - - return GPOINTER_TO_INT (info->states->data); -} - -#define ELEMENT_IS(name) (strcmp (element_name, (name)) == 0) - -static void -start_element_handler (GMarkupParseContext *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer user_data, - GError **error) -{ - ParseInfo *info = (ParseInfo *)user_data; - - if (ELEMENT_IS (TAG_RECENT_FILES)) - push_state (info, STATE_RECENT_FILES); - else if (ELEMENT_IS (TAG_RECENT_ITEM)) { - info->current_item = egg_recent_item_new (); - push_state (info, STATE_RECENT_ITEM); - } else if (ELEMENT_IS (TAG_URI)) - push_state (info, STATE_URI); - else if (ELEMENT_IS (TAG_MIME_TYPE)) - push_state (info, STATE_MIME_TYPE); - else if (ELEMENT_IS (TAG_TIMESTAMP)) - push_state (info, STATE_TIMESTAMP); - else if (ELEMENT_IS (TAG_PRIVATE)) { - push_state (info, STATE_PRIVATE); - egg_recent_item_set_private (info->current_item, TRUE); - } else if (ELEMENT_IS (TAG_GROUPS)) - push_state (info, STATE_GROUPS); - else if (ELEMENT_IS (TAG_GROUP)) - push_state (info, STATE_GROUP); -} - -static gint -list_compare_func_mru (gpointer a, gpointer b) -{ - EggRecentItem *item_a = (EggRecentItem *)a; - EggRecentItem *item_b = (EggRecentItem *)b; - - return item_a->timestamp < item_b->timestamp; -} - -static gint -list_compare_func_lru (gpointer a, gpointer b) -{ - EggRecentItem *item_a = (EggRecentItem *)a; - EggRecentItem *item_b = (EggRecentItem *)b; - - return item_a->timestamp > item_b->timestamp; -} - - - -static void -end_element_handler (GMarkupParseContext *context, - const gchar *element_name, - gpointer user_data, - GError **error) -{ - ParseInfo *info = (ParseInfo *)user_data; - - switch (peek_state (info)) { - case STATE_RECENT_ITEM: - info->items = g_list_append (info->items, - info->current_item); - if (info->current_item->uri == NULL || - strlen (info->current_item->uri) == 0) - g_warning ("URI NOT LOADED"); - break; - default: - break; - } - - pop_state (info); -} - -static void -text_handler (GMarkupParseContext *context, - const gchar *text, - gsize text_len, - gpointer user_data, - GError **error) -{ - ParseInfo *info = (ParseInfo *)user_data; - - switch (peek_state (info)) { - case STATE_START: - case STATE_RECENT_FILES: - case STATE_RECENT_ITEM: - case STATE_PRIVATE: - case STATE_GROUPS: - break; - case STATE_URI: - egg_recent_item_set_uri (info->current_item, text); - break; - case STATE_MIME_TYPE: - egg_recent_item_set_mime_type (info->current_item, - text); - break; - case STATE_TIMESTAMP: - egg_recent_item_set_timestamp (info->current_item, - (time_t)atoi (text)); - break; - case STATE_GROUP: - egg_recent_item_add_group (info->current_item, - text); - break; - } - -} - -static void -error_handler (GMarkupParseContext *context, - GError *error, - gpointer user_data) -{ - g_warning ("Error in parse: %s", error->message); -} - -static void -egg_recent_model_enforce_limit (GList *list, int limit) -{ - int len; - GList *end; - - /* limit < 0 means unlimited */ - if (limit <= 0) - return; - - len = g_list_length (list); - - if (len > limit) { - GList *next; - - end = g_list_nth (list, limit-1); - next = end->next; - - end->next = NULL; - - EGG_RECENT_ITEM_LIST_UNREF (next); - } -} - -static GList * -egg_recent_model_sort (EggRecentModel *model, GList *list) -{ - switch (model->priv->sort_type) { - case EGG_RECENT_MODEL_SORT_MRU: - list = g_list_sort (list, - (GCompareFunc)list_compare_func_mru); - break; - case EGG_RECENT_MODEL_SORT_LRU: - list = g_list_sort (list, - (GCompareFunc)list_compare_func_lru); - break; - case EGG_RECENT_MODEL_SORT_NONE: - break; - } - - return list; -} - -static gboolean -egg_recent_model_group_match (EggRecentItem *item, GSList *groups) -{ - GSList *tmp; - - tmp = groups; - - while (tmp != NULL) { - const gchar * group = (const gchar *)tmp->data; - - if (egg_recent_item_in_group (item, group)) - return TRUE; - - tmp = tmp->next; - } - - return FALSE; -} - -static GList * -egg_recent_model_filter (EggRecentModel *model, - GList *list) -{ - EggRecentItem *item; - GList *newlist = NULL; - gchar *mime_type; - gchar *uri; - - g_return_val_if_fail (list != NULL, NULL); - - while (list) { - gboolean pass_mime_test = FALSE; - gboolean pass_group_test = FALSE; - gboolean pass_scheme_test = FALSE; - item = (EggRecentItem *)list->data; - list = list->next; - - uri = egg_recent_item_get_uri (item); - - /* filter by mime type */ - if (model->priv->mime_filter_values != NULL) { - mime_type = egg_recent_item_get_mime_type (item); - - if (egg_recent_model_string_match - (model->priv->mime_filter_values, - mime_type)) - pass_mime_test = TRUE; - - g_free (mime_type); - } else - pass_mime_test = TRUE; - - /* filter by group */ - if (pass_mime_test && model->priv->group_filter_values != NULL) { - if (egg_recent_model_group_match - (item, model->priv->group_filter_values)) - pass_group_test = TRUE; - } else if (egg_recent_item_get_private (item)) { - pass_group_test = FALSE; - } else - pass_group_test = TRUE; - - /* filter by URI scheme */ - if (pass_mime_test && pass_group_test && - model->priv->scheme_filter_values != NULL) { - gchar *scheme; - - scheme = gnome_vfs_get_uri_scheme (uri); - - if (egg_recent_model_string_match - (model->priv->scheme_filter_values, scheme)) - pass_scheme_test = TRUE; - - g_free (scheme); - } else - pass_scheme_test = TRUE; - - if (pass_mime_test && pass_group_test && pass_scheme_test) - newlist = g_list_prepend (newlist, item); - - g_free (uri); - } - - if (newlist) { - newlist = g_list_reverse (newlist); - g_list_free (list); - } - - - return newlist; -} - - - -#if 0 -static void -egg_recent_model_monitor_list_cb (GnomeVFSMonitorHandle *handle, - const gchar *monitor_uri, - const gchar *info_uri, - GnomeVFSMonitorEventType event_type, - gpointer user_data) -{ - EggRecentModel *model; - - model = EGG_RECENT_MODEL (user_data); - - if (event_type == GNOME_VFS_MONITOR_EVENT_DELETED) { - egg_recent_model_delete (model, monitor_uri); - g_hash_table_remove (model->priv->monitors, monitor_uri); - } -} - - - -static void -egg_recent_model_monitor_list (EggRecentModel *model, GList *list) -{ - GList *tmp; - - tmp = list; - while (tmp) { - EggRecentItem *item = (EggRecentItem *)tmp->data; - GnomeVFSMonitorHandle *handle; - GnomeVFSResult res; - gchar *uri; - - tmp = tmp->next; - - uri = egg_recent_item_get_uri (item); - if (g_hash_table_lookup (model->priv->monitors, uri)) { - /* already monitoring this one */ - g_free (uri); - continue; - } - - res = gnome_vfs_monitor_add (&handle, uri, - GNOME_VFS_MONITOR_FILE, - egg_recent_model_monitor_list_cb, - model); - - if (res == GNOME_VFS_OK) - g_hash_table_insert (model->priv->monitors, uri, handle); - else - g_free (uri); - } -} -#endif - - -static gboolean -egg_recent_model_changed_timeout (EggRecentModel *model) -{ - egg_recent_model_changed (model); - - return FALSE; -} - -static void -egg_recent_model_monitor_cb (GnomeVFSMonitorHandle *handle, - const gchar *monitor_uri, - const gchar *info_uri, - GnomeVFSMonitorEventType event_type, - gpointer user_data) -{ - EggRecentModel *model; - - g_return_if_fail (user_data != NULL); - g_return_if_fail (EGG_IS_RECENT_MODEL (user_data)); - model = EGG_RECENT_MODEL (user_data); - - if (event_type == GNOME_VFS_MONITOR_EVENT_CHANGED) { - if (model->priv->changed_timeout > 0) { - g_source_remove (model->priv->changed_timeout); - } - - model->priv->changed_timeout = g_timeout_add ( - EGG_RECENT_MODEL_TIMEOUT_LENGTH, - (GSourceFunc)egg_recent_model_changed_timeout, - model); - } -} - -static void -egg_recent_model_monitor (EggRecentModel *model, gboolean should_monitor) -{ - if (should_monitor && model->priv->monitor == NULL) { - char *uri; - - uri = gnome_vfs_get_uri_from_local_path (model->priv->path); - - gnome_vfs_monitor_add (&model->priv->monitor, - uri, - GNOME_VFS_MONITOR_FILE, - egg_recent_model_monitor_cb, - model); - - g_free (uri); - - /* if the above fails, don't worry about it. - * local notifications will still happen - */ - - } else if (!should_monitor && model->priv->monitor != NULL) { - gnome_vfs_monitor_cancel (model->priv->monitor); - model->priv->monitor = NULL; - } -} - -static void -egg_recent_model_set_limit_internal (EggRecentModel *model, int limit) -{ - model->priv->limit = limit; - - if (limit <= 0) - egg_recent_model_monitor (model, FALSE); - else { - egg_recent_model_monitor (model, TRUE); - egg_recent_model_changed (model); - } -} - -static GList * -egg_recent_model_read (EggRecentModel *model, FILE *file) -{ - GList *list=NULL; - gchar *content; - GMarkupParseContext *ctx; - ParseInfo info; - GError *error; - - content = egg_recent_model_read_raw (model, file); - - if (strlen (content) <= 0) { - g_free (content); - return NULL; - } - - parse_info_init (&info); - - ctx = g_markup_parse_context_new (&parser, 0, &info, NULL); - - error = NULL; - if (!g_markup_parse_context_parse (ctx, content, strlen (content), - &error)) { - g_warning (error->message); - g_error_free (error); - error = NULL; - goto out; - } - - error = NULL; - if (!g_markup_parse_context_end_parse (ctx, &error)) - goto out; - - g_markup_parse_context_free (ctx); -out: - list = info.items; - - parse_info_free (&info); - - g_free (content); - - /* - g_print ("Total items: %d\n", g_list_length (list)); - */ - - return list; -} - - -static gboolean -egg_recent_model_write (EggRecentModel *model, FILE *file, GList *list) -{ - GString *string; - gchar *data; - EggRecentItem *item; - const GList *groups; - int i; - int ret; - - string = g_string_new ("\n"); - string = g_string_append (string, "<" TAG_RECENT_FILES ">\n"); - - i=0; - while (list) { - gchar *uri; - gchar *mime_type; - gchar *escaped_uri; - time_t timestamp; - item = (EggRecentItem *)list->data; - - - uri = egg_recent_item_get_uri_utf8 (item); - escaped_uri = g_markup_escape_text (uri, - strlen (uri)); - g_free (uri); - - mime_type = egg_recent_item_get_mime_type (item); - timestamp = egg_recent_item_get_timestamp (item); - - string = g_string_append (string, " <" TAG_RECENT_ITEM ">\n"); - - g_string_append_printf (string, - " <" TAG_URI ">%s\n", escaped_uri); - - if (mime_type) - g_string_append_printf (string, - " <" TAG_MIME_TYPE ">%s\n", mime_type); - else - g_string_append_printf (string, - " <" TAG_MIME_TYPE ">\n"); - - - g_string_append_printf (string, - " <" TAG_TIMESTAMP ">%d\n", (int)timestamp); - - if (egg_recent_item_get_private (item)) - string = g_string_append (string, - " <" TAG_PRIVATE "/>\n"); - - /* write the groups */ - string = g_string_append (string, - " <" TAG_GROUPS ">\n"); - groups = egg_recent_item_get_groups (item); - - if (groups == NULL && egg_recent_item_get_private (item)) - g_warning ("Item with URI \"%s\" marked as private, but" - " does not belong to any groups.\n", uri); - - while (groups) { - const gchar *group = (const gchar *)groups->data; - gchar *escaped_group; - - escaped_group = g_markup_escape_text (group, strlen(group)); - - g_string_append_printf (string, - " <" TAG_GROUP ">%s\n", - escaped_group); - - g_free (escaped_group); - - groups = groups->next; - } - - string = g_string_append (string, " \n"); - - string = g_string_append (string, - " \n"); - - g_free (mime_type); - g_free (escaped_uri); - - list = list->next; - i++; - } - - string = g_string_append (string, ""); - - data = g_string_free (string, FALSE); - - ret = egg_recent_model_write_raw (model, file, data); - - g_free (data); - - return ret; -} - -static FILE * -egg_recent_model_open_file (EggRecentModel *model) -{ - FILE *file; - mode_t prev_umask; - - file = fopen (model->priv->path, "r+"); - if (file == NULL) { - /* be paranoid */ - prev_umask = umask (077); - - file = fopen (model->priv->path, "w+"); - - umask (prev_umask); - - g_return_val_if_fail (file != NULL, NULL); - } - - return file; -} - -static gboolean -egg_recent_model_lock_file (FILE *file) -{ - int fd; - gint try = 5; - - rewind (file); - fd = fileno (file); - - /* Attempt to lock the file 5 times, - * waiting a random interval (< 1 second) - * in between attempts. - * We should really be doing asynchronous - * locking, but requires substantially larger - * changes. - */ - - while (try > 0) - { - int rand_interval; - - if (lockf (fd, F_TLOCK, 0) == 0) - return TRUE; - - rand_interval = 1 + (int) (10.0 * rand()/(RAND_MAX + 1.0)); - - g_usleep (100000 * rand_interval); - - --try; - } - - return FALSE; -} - -static gboolean -egg_recent_model_unlock_file (FILE *file) -{ - int fd; - - rewind (file); - fd = fileno (file); - - return (lockf (fd, F_ULOCK, 0) == 0) ? TRUE : FALSE; -} - -static void -egg_recent_model_finalize (GObject *object) -{ - EggRecentModel *model = EGG_RECENT_MODEL (object); - - egg_recent_model_monitor (model, FALSE); - - - g_slist_foreach (model->priv->mime_filter_values, - (GFunc) g_pattern_spec_free, NULL); - g_slist_free (model->priv->mime_filter_values); - model->priv->mime_filter_values = NULL; - - g_slist_foreach (model->priv->scheme_filter_values, - (GFunc) g_pattern_spec_free, NULL); - g_slist_free (model->priv->scheme_filter_values); - model->priv->scheme_filter_values = NULL; - - g_slist_foreach (model->priv->group_filter_values, - (GFunc) g_free, NULL); - g_slist_free (model->priv->group_filter_values); - model->priv->group_filter_values = NULL; - - - if (model->priv->limit_change_notify_id) - gconf_client_notify_remove (model->priv->client, - model->priv->limit_change_notify_id); - model->priv->expiration_change_notify_id = 0; - - if (model->priv->expiration_change_notify_id) - gconf_client_notify_remove (model->priv->client, - model->priv->expiration_change_notify_id); - model->priv->expiration_change_notify_id = 0; - - g_object_unref (model->priv->client); - model->priv->client = NULL; - - - g_free (model->priv->path); - model->priv->path = NULL; - - g_hash_table_destroy (model->priv->monitors); - model->priv->monitors = NULL; - - - g_free (model->priv); -} - -static void -egg_recent_model_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EggRecentModel *model = EGG_RECENT_MODEL (object); - - switch (prop_id) - { - case PROP_MIME_FILTERS: - model->priv->mime_filter_values = - (GSList *)g_value_get_pointer (value); - break; - - case PROP_GROUP_FILTERS: - model->priv->group_filter_values = - (GSList *)g_value_get_pointer (value); - break; - - case PROP_SCHEME_FILTERS: - model->priv->scheme_filter_values = - (GSList *)g_value_get_pointer (value); - break; - - case PROP_SORT_TYPE: - model->priv->sort_type = g_value_get_int (value); - break; - - case PROP_LIMIT: - egg_recent_model_set_limit (model, - g_value_get_int (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -egg_recent_model_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - EggRecentModel *model = EGG_RECENT_MODEL (object); - - switch (prop_id) - { - case PROP_MIME_FILTERS: - g_value_set_pointer (value, model->priv->mime_filter_values); - break; - - case PROP_GROUP_FILTERS: - g_value_set_pointer (value, model->priv->group_filter_values); - break; - - case PROP_SCHEME_FILTERS: - g_value_set_pointer (value, model->priv->scheme_filter_values); - break; - - case PROP_SORT_TYPE: - g_value_set_int (value, model->priv->sort_type); - break; - - case PROP_LIMIT: - g_value_set_int (value, model->priv->limit); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -egg_recent_model_class_init (EggRecentModelClass * klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->set_property = egg_recent_model_set_property; - object_class->get_property = egg_recent_model_get_property; - object_class->finalize = egg_recent_model_finalize; - - model_signals[CHANGED] = g_signal_new ("changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EggRecentModelClass, changed), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - - - g_object_class_install_property (object_class, - PROP_MIME_FILTERS, - g_param_spec_pointer ("mime-filters", - "Mime Filters", - "List of mime types to be allowed.", - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_GROUP_FILTERS, - g_param_spec_pointer ("group-filters", - "Group Filters", - "List of groups to be allowed.", - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_SCHEME_FILTERS, - g_param_spec_pointer ("scheme-filters", - "Scheme Filters", - "List of URI schemes to be allowed.", - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_SORT_TYPE, - g_param_spec_int ("sort-type", - "Sort Type", - "Type of sorting to be done.", - 0, EGG_RECENT_MODEL_SORT_NONE, - EGG_RECENT_MODEL_SORT_MRU, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_LIMIT, - g_param_spec_int ("limit", - "Limit", - "Max number of items allowed.", - -1, EGG_RECENT_MODEL_MAX_ITEMS, - EGG_RECENT_MODEL_DEFAULT_LIMIT, - G_PARAM_READWRITE)); - - klass->changed = NULL; -} - - - -static void -egg_recent_model_limit_changed (GConfClient *client, guint cnxn_id, - GConfEntry *entry, gpointer user_data) -{ - EggRecentModel *model; - GConfValue *value; - - model = EGG_RECENT_MODEL (user_data); - - g_return_if_fail (model != NULL); - - if (model->priv->use_default_limit == FALSE) - return; /* ignore this key */ - - /* the key was unset, and the schema has apparently failed */ - if (entry == NULL) - return; - - value = gconf_entry_get_value (entry); - - if (value->type != GCONF_VALUE_INT) { - g_warning ("Expected GConfValue of type integer, " - "got something else"); - } - - - egg_recent_model_set_limit_internal (model, gconf_value_get_int (value)); -} - -static void -egg_recent_model_expiration_changed (GConfClient *client, guint cnxn_id, - GConfEntry *entry, gpointer user_data) -{ - -} - -static void -egg_recent_model_init (EggRecentModel * model) -{ - if (!gnome_vfs_init ()) { - g_warning ("gnome-vfs initialization failed."); - return; - } - - - model->priv = g_new0 (EggRecentModelPrivate, 1); - - model->priv->path = g_strdup_printf ("%s" EGG_RECENT_MODEL_FILE_PATH, - g_get_home_dir ()); - - model->priv->mime_filter_values = NULL; - model->priv->group_filter_values = NULL; - model->priv->scheme_filter_values = NULL; - - model->priv->client = gconf_client_get_default (); - gconf_client_add_dir (model->priv->client, EGG_RECENT_MODEL_KEY_DIR, - GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - - model->priv->limit_change_notify_id = - gconf_client_notify_add (model->priv->client, - EGG_RECENT_MODEL_DEFAULT_LIMIT_KEY, - egg_recent_model_limit_changed, - model, NULL, NULL); - - model->priv->expiration_change_notify_id = - gconf_client_notify_add (model->priv->client, - EGG_RECENT_MODEL_EXPIRE_KEY, - egg_recent_model_expiration_changed, - model, NULL, NULL); - - model->priv->expire_days = gconf_client_get_int ( - model->priv->client, - EGG_RECENT_MODEL_EXPIRE_KEY, - NULL); - -#if 0 - /* keep this out, for now */ - model->priv->limit = gconf_client_get_int ( - model->priv->client, - EGG_RECENT_MODEL_DEFAULT_LIMIT_KEY, NULL); - model->priv->use_default_limit = TRUE; -#endif - model->priv->limit = EGG_RECENT_MODEL_DEFAULT_LIMIT; - model->priv->use_default_limit = FALSE; - - model->priv->monitors = g_hash_table_new_full ( - g_str_hash, g_str_equal, - (GDestroyNotify) g_free, - (GDestroyNotify) gnome_vfs_monitor_cancel); - - model->priv->monitor = NULL; - egg_recent_model_monitor (model, TRUE); -} - - -/** - * egg_recent_model_new: - * @sort: the type of sorting to use - * @limit: maximum number of items in the list - * - * This creates a new EggRecentModel object. - * - * Returns: a EggRecentModel object - */ -EggRecentModel * -egg_recent_model_new (EggRecentModelSort sort) -{ - EggRecentModel *model; - - model = EGG_RECENT_MODEL (g_object_new (egg_recent_model_get_type (), - "sort-type", sort, NULL)); - - g_return_val_if_fail (model, NULL); - - return model; -} - -/** - * egg_recent_model_add_full: - * @model: A EggRecentModel object. - * @item: A EggRecentItem - * - * This function adds an item to the list of recently used URIs. - * - * Returns: gboolean - */ -gboolean -egg_recent_model_add_full (EggRecentModel * model, EggRecentItem *item) -{ - FILE *file; - GList *list = NULL; - gboolean ret = FALSE; - gboolean updated = FALSE; - char *uri; - time_t t; - - g_return_val_if_fail (model != NULL, FALSE); - g_return_val_if_fail (EGG_IS_RECENT_MODEL (model), FALSE); - - uri = egg_recent_item_get_uri (item); - if (strncmp (uri, "recent-files://", strlen ("recent-files://")) == 0) { - g_free (uri); - return FALSE; - } else { - g_free (uri); - } - - file = egg_recent_model_open_file (model); - g_return_val_if_fail (file != NULL, FALSE); - - time (&t); - egg_recent_item_set_timestamp (item, t); - - if (egg_recent_model_lock_file (file)) { - - /* read existing stuff */ - list = egg_recent_model_read (model, file); - - /* if it's already there, we just update it */ - updated = egg_recent_model_update_item (list, item); - - if (!updated) { - list = g_list_prepend (list, item); - - egg_recent_model_enforce_limit (list, - EGG_RECENT_MODEL_MAX_ITEMS); - } - - /* write new stuff */ - if (!egg_recent_model_write (model, file, list)) - g_warning ("Write failed: %s", strerror (errno)); - - if (!updated) - list = g_list_remove (list, item); - - EGG_RECENT_ITEM_LIST_UNREF (list); - ret = TRUE; - } else { - g_warning ("Failed to lock: %s", strerror (errno)); - fclose (file); - return FALSE; - } - - if (!egg_recent_model_unlock_file (file)) - g_warning ("Failed to unlock: %s", strerror (errno)); - - fclose (file); - - if (model->priv->monitor == NULL) { - /* since monitoring isn't working, at least give a - * local notification - */ - egg_recent_model_changed (model); - } - - return ret; -} - -/** - * egg_recent_model_add: - * @model: A EggRecentModel object. - * @uri: A string URI - * - * This function adds an item to the list of recently used URIs. - * - * Returns: gboolean - */ -gboolean -egg_recent_model_add (EggRecentModel *model, const gchar *uri) -{ - EggRecentItem *item; - gboolean ret = FALSE; - - g_return_val_if_fail (model != NULL, FALSE); - g_return_val_if_fail (uri != NULL, FALSE); - - item = egg_recent_item_new_from_uri (uri); - - g_return_val_if_fail (item != NULL, FALSE); - - ret = egg_recent_model_add_full (model, item); - - egg_recent_item_unref (item); - - return ret; -} - - - -/** - * egg_recent_model_delete: - * @model: A EggRecentModel object. - * @uri: The URI you want to delete. - * - * This function deletes a URI from the file of recently used URIs. - * - * Returns: gboolean - */ -gboolean -egg_recent_model_delete (EggRecentModel * model, const gchar * uri) -{ - FILE *file; - GList *list; - unsigned int length; - gboolean ret = FALSE; - - g_return_val_if_fail (model != NULL, FALSE); - g_return_val_if_fail (EGG_IS_RECENT_MODEL (model), FALSE); - g_return_val_if_fail (uri != NULL, FALSE); - - file = egg_recent_model_open_file (model); - g_return_val_if_fail (file != NULL, FALSE); - - if (egg_recent_model_lock_file (file)) { - list = egg_recent_model_read (model, file); - - if (list == NULL) - goto out; - - length = g_list_length (list); - - list = egg_recent_model_delete_from_list (list, uri); - - if (length == g_list_length (list)) { - /* nothing was deleted */ - EGG_RECENT_ITEM_LIST_UNREF (list); - } else { - egg_recent_model_write (model, file, list); - EGG_RECENT_ITEM_LIST_UNREF (list); - ret = TRUE; - - } - } else { - g_warning ("Failed to lock: %s", strerror (errno)); - return FALSE; - } - -out: - - if (!egg_recent_model_unlock_file (file)) - g_warning ("Failed to unlock: %s", strerror (errno)); - - fclose (file); - - g_hash_table_remove (model->priv->monitors, uri); - - if (model->priv->monitor == NULL && ret) { - /* since monitoring isn't working, at least give a - * local notification - */ - egg_recent_model_changed (model); - } - - return ret; -} - - -/** - * egg_recent_model_get_list: - * @model: A EggRecentModel object. - * - * This function gets the current contents of the file - * - * Returns: a GList - */ -GList * -egg_recent_model_get_list (EggRecentModel *model) -{ - FILE *file; - GList *list=NULL; - - file = egg_recent_model_open_file (model); - g_return_val_if_fail (file != NULL, NULL); - - if (egg_recent_model_lock_file (file)) { - list = egg_recent_model_read (model, file); - - } else { - g_warning ("Failed to lock: %s", strerror (errno)); - fclose (file); - return NULL; - } - - if (!egg_recent_model_unlock_file (file)) - g_warning ("Failed to unlock: %s", strerror (errno)); - - if (list != NULL) { - list = egg_recent_model_filter (model, list); - list = egg_recent_model_sort (model, list); - - egg_recent_model_enforce_limit (list, model->priv->limit); - } - - fclose (file); - - return list; -} - - - -/** - * egg_recent_model_set_limit: - * @model: A EggRecentModel object. - * @limit: The maximum length of the list - * - * This function sets the maximum length of the list. Note: This only affects - * the length of the list emitted in the "changed" signal, not the list stored - * on disk. - * - * Returns: void - */ -void -egg_recent_model_set_limit (EggRecentModel *model, int limit) -{ - model->priv->use_default_limit = FALSE; - - egg_recent_model_set_limit_internal (model, limit); -} - -/** - * egg_recent_model_get_limit: - * @model: A EggRecentModel object. - * - * This function gets the maximum length of the list. - * - * Returns: int - */ -int -egg_recent_model_get_limit (EggRecentModel *model) -{ - return model->priv->limit; -} - - -/** - * egg_recent_model_clear: - * @model: A EggRecentModel object. - * - * This function clears the contents of the file - * - * Returns: void - */ -void -egg_recent_model_clear (EggRecentModel *model) -{ - FILE *file; - int fd; - - file = egg_recent_model_open_file (model); - g_return_if_fail (file != NULL); - - fd = fileno (file); - - if (egg_recent_model_lock_file (file)) { - ftruncate (fd, 0); - } else { - g_warning ("Failed to lock: %s", strerror (errno)); - return; - } - - if (!egg_recent_model_unlock_file (file)) - g_warning ("Failed to unlock: %s", strerror (errno)); - - fclose (file); -} - - -/** - * egg_recent_model_set_filter_mime_types: - * @model: A EggRecentModel object. - * - * Sets which mime types are allowed in the list. - * - * Returns: void - */ -void -egg_recent_model_set_filter_mime_types (EggRecentModel *model, - ...) -{ - va_list valist; - GSList *list = NULL; - gchar *str; - - g_return_if_fail (model != NULL); - - if (model->priv->mime_filter_values != NULL) { - g_slist_foreach (model->priv->mime_filter_values, - (GFunc) g_pattern_spec_free, NULL); - g_slist_free (model->priv->mime_filter_values); - model->priv->mime_filter_values = NULL; - } - - va_start (valist, model); - - str = va_arg (valist, gchar*); - - while (str != NULL) { - list = g_slist_prepend (list, g_pattern_spec_new (str)); - - str = va_arg (valist, gchar*); - } - - va_end (valist); - - model->priv->mime_filter_values = list; -} - -/** - * egg_recent_model_set_filter_groups: - * @model: A EggRecentModel object. - * - * Sets which groups are allowed in the list. - * - * Returns: void - */ -void -egg_recent_model_set_filter_groups (EggRecentModel *model, - ...) -{ - va_list valist; - GSList *list = NULL; - gchar *str; - - g_return_if_fail (model != NULL); - - if (model->priv->group_filter_values != NULL) { - g_slist_foreach (model->priv->group_filter_values, (GFunc)g_free, NULL); - g_slist_free (model->priv->group_filter_values); - model->priv->group_filter_values = NULL; - } - - va_start (valist, model); - - str = va_arg (valist, gchar*); - - while (str != NULL) { - list = g_slist_prepend (list, g_strdup (str)); - - str = va_arg (valist, gchar*); - } - - va_end (valist); - - model->priv->group_filter_values = list; -} - -/** - * egg_recent_model_set_filter_uri_schemes: - * @model: A EggRecentModel object. - * - * Sets which URI schemes (file, http, ftp, etc) are allowed in the list. - * - * Returns: void - */ -void -egg_recent_model_set_filter_uri_schemes (EggRecentModel *model, ...) -{ - va_list valist; - GSList *list = NULL; - gchar *str; - - g_return_if_fail (model != NULL); - - if (model->priv->scheme_filter_values != NULL) { - g_slist_foreach (model->priv->scheme_filter_values, - (GFunc) g_pattern_spec_free, NULL); - g_slist_free (model->priv->scheme_filter_values); - model->priv->scheme_filter_values = NULL; - } - - va_start (valist, model); - - str = va_arg (valist, gchar*); - - while (str != NULL) { - list = g_slist_prepend (list, g_pattern_spec_new (str)); - - str = va_arg (valist, gchar*); - } - - va_end (valist); - - model->priv->scheme_filter_values = list; -} - -/** - * egg_recent_model_set_sort: - * @model: A EggRecentModel object. - * @sort: A EggRecentModelSort type - * - * Sets the type of sorting to be used. - * - * Returns: void - */ -void -egg_recent_model_set_sort (EggRecentModel *model, - EggRecentModelSort sort) -{ - g_return_if_fail (model != NULL); - - model->priv->sort_type = sort; -} - -/** - * egg_recent_model_changed: - * @model: A EggRecentModel object. - * - * This function causes a "changed" signal to be emitted. - * - * Returns: void - */ -void -egg_recent_model_changed (EggRecentModel *model) -{ - GList *list = NULL; - - if (model->priv->limit > 0) { - list = egg_recent_model_get_list (model); - /* egg_recent_model_monitor_list (model, list); */ - - g_signal_emit (G_OBJECT (model), model_signals[CHANGED], 0, - list); - } - - if (list) - EGG_RECENT_ITEM_LIST_UNREF (list); -} - -static void -egg_recent_model_remove_expired_list (EggRecentModel *model, GList *list) -{ - time_t current_time; - time_t day_seconds; - - time (¤t_time); - day_seconds = model->priv->expire_days*24*60*60; - - while (list != NULL) { - EggRecentItem *item = list->data; - time_t timestamp; - - timestamp = egg_recent_item_get_timestamp (item); - - if ((timestamp+day_seconds) < current_time) { - gchar *uri = egg_recent_item_get_uri (item); - egg_recent_model_delete (model, uri); - - g_strdup (uri); - } - - list = list->next; - } -} - - -/** - * egg_recent_model_remove_expired: - * @model: A EggRecentModel object. - * - * Goes through the entire list, and removes any items that are older than - * the user-specified expiration period. - * - * Returns: void - */ -void -egg_recent_model_remove_expired (EggRecentModel *model) -{ - FILE *file; - GList *list=NULL; - - g_return_if_fail (model != NULL); - - file = egg_recent_model_open_file (model); - g_return_if_fail (file != NULL); - - if (egg_recent_model_lock_file (file)) { - list = egg_recent_model_read (model, file); - - } else { - g_warning ("Failed to lock: %s", strerror (errno)); - return; - } - - if (!egg_recent_model_unlock_file (file)) - g_warning ("Failed to unlock: %s", strerror (errno)); - - if (list != NULL) { - egg_recent_model_remove_expired_list (model, list); - EGG_RECENT_ITEM_LIST_UNREF (list); - } - - fclose (file); -} - -/** - * egg_recent_model_get_type: - * - * This returns a GType representing a EggRecentModel object. - * - * Returns: a GType - */ -GType -egg_recent_model_get_type (void) -{ - static GType egg_recent_model_type = 0; - - if(!egg_recent_model_type) { - static const GTypeInfo egg_recent_model_info = { - sizeof (EggRecentModelClass), - NULL, /* base init */ - NULL, /* base finalize */ - (GClassInitFunc)egg_recent_model_class_init, /* class init */ - NULL, /* class finalize */ - NULL, /* class data */ - sizeof (EggRecentModel), - 0, - (GInstanceInitFunc) egg_recent_model_init - }; - - egg_recent_model_type = g_type_register_static (G_TYPE_OBJECT, - "EggRecentModel", - &egg_recent_model_info, 0); - } - - return egg_recent_model_type; -} - diff --git a/glabels2/src/recent-files/egg-recent-model.h b/glabels2/src/recent-files/egg-recent-model.h deleted file mode 100644 index 8c2eb8da..00000000 --- a/glabels2/src/recent-files/egg-recent-model.h +++ /dev/null @@ -1,80 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef __EGG_RECENT_MODEL_H__ -#define __EGG_RECENT_MODEL_H__ - -#include "egg-recent-item.h" - -G_BEGIN_DECLS - -#define EGG_TYPE_RECENT_MODEL (egg_recent_model_get_type ()) -#define EGG_RECENT_MODEL(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, EGG_TYPE_RECENT_MODEL, EggRecentModel) -#define EGG_RECENT_MODEL_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, EGG_TYPE_RECENT_MODEL, EggRecentModelClass) -#define EGG_IS_RECENT_MODEL(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, egg_recent_model_get_type ()) - -typedef struct _EggRecentModel EggRecentModel; -typedef struct _EggRecentModelPrivate EggRecentModelPrivate; -typedef struct _EggRecentModelClass EggRecentModelClass; - -struct _EggRecentModel { - GObject parent_instance; - - EggRecentModelPrivate *priv; -}; - -struct _EggRecentModelClass { - GObjectClass parent_class; - - void (*changed) (EggRecentModel *model, GList *list); -}; - -typedef enum { - EGG_RECENT_MODEL_SORT_MRU, - EGG_RECENT_MODEL_SORT_LRU, - EGG_RECENT_MODEL_SORT_NONE -} EggRecentModelSort; - - -/* Standard group names */ -#define EGG_RECENT_GROUP_LAUNCHERS "Launchers" - - -GType egg_recent_model_get_type (void); - -/* constructors */ -EggRecentModel * egg_recent_model_new (EggRecentModelSort sort); - -/* public methods */ -void egg_recent_model_set_filter_mime_types (EggRecentModel *model, - ...); - -void egg_recent_model_set_filter_groups (EggRecentModel *model, ...); - -void egg_recent_model_set_filter_uri_schemes (EggRecentModel *model, - ...); - -void egg_recent_model_set_sort (EggRecentModel *model, - EggRecentModelSort sort); - -gboolean egg_recent_model_add_full (EggRecentModel *model, - EggRecentItem *item); - -gboolean egg_recent_model_add (EggRecentModel *model, - const gchar *uri); - -gboolean egg_recent_model_delete (EggRecentModel *model, - const gchar *uri); - -void egg_recent_model_clear (EggRecentModel *model); - -GList * egg_recent_model_get_list (EggRecentModel *model); - -void egg_recent_model_changed (EggRecentModel *model); - -void egg_recent_model_set_limit (EggRecentModel *model, int limit); -int egg_recent_model_get_limit (EggRecentModel *model); - -void egg_recent_model_remove_expired (EggRecentModel *model); - -G_END_DECLS - -#endif /* __EGG_RECENT_MODEL_H__ */ diff --git a/glabels2/src/recent-files/egg-recent-util.c b/glabels2/src/recent-files/egg-recent-util.c deleted file mode 100644 index 6780cd1e..00000000 --- a/glabels2/src/recent-files/egg-recent-util.c +++ /dev/null @@ -1,138 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#ifndef USE_STABLE_LIBGNOMEUI -#include -#include -#endif -#include -#include "egg-recent-util.h" - -#define EGG_RECENT_UTIL_HOSTNAME_SIZE 512 - -/* ripped out of gedit2 */ -gchar* -egg_recent_util_escape_underlines (const gchar* text) -{ - GString *str; - gint length; - const gchar *p; - const gchar *end; - - g_return_val_if_fail (text != NULL, NULL); - - length = strlen (text); - - str = g_string_new (""); - - p = text; - end = text + length; - - while (p != end) - { - const gchar *next; - next = g_utf8_next_char (p); - - switch (*p) - { - case '_': - g_string_append (str, "__"); - break; - default: - g_string_append_len (str, p, next - p); - break; - } - - p = next; - } - - return g_string_free (str, FALSE); -} - -#ifndef USE_STABLE_LIBGNOMEUI -static GdkPixbuf * -load_icon_file (char *filename, - guint nominal_size) -{ - GdkPixbuf *pixbuf, *scaled_pixbuf; - guint width, height; - - pixbuf = gdk_pixbuf_new_from_file_at_size (filename, nominal_size, nominal_size, NULL); - - if (pixbuf == NULL) { - return NULL; - } - - width = gdk_pixbuf_get_width (pixbuf); - height = gdk_pixbuf_get_height (pixbuf); - /* if the icon is larger than the nominal size, scale down */ - if (MAX (width, height) > nominal_size) { - if (width > height) { - height = height * nominal_size / width; - width = nominal_size; - } else { - width = width * nominal_size / height; - height = nominal_size; - } - scaled_pixbuf = gdk_pixbuf_scale_simple - (pixbuf, width, height, GDK_INTERP_BILINEAR); - g_object_unref (pixbuf); - pixbuf = scaled_pixbuf; - } - - return pixbuf; -} - -GdkPixbuf * -egg_recent_util_get_icon (GnomeIconTheme *theme, const gchar *uri, - const gchar *mime_type, int size) -{ - gchar *icon; - gchar *filename; - const GnomeIconData *icon_data; - GdkPixbuf *pixbuf; - - icon = gnome_icon_lookup (theme, NULL, uri, NULL, NULL, - mime_type, 0, NULL); - - - g_return_val_if_fail (icon != NULL, NULL); - - filename = gnome_icon_theme_lookup_icon (theme, icon, - size, - &icon_data, - NULL); - g_free (icon); - - if (filename == NULL) { - return NULL; - } - - pixbuf = load_icon_file (filename, size); - g_free (filename); - - - return pixbuf; -} -#endif /* !USE_STABLE_LIBGNOMEUI */ - -gchar * -egg_recent_util_get_unique_id (void) -{ - char hostname[EGG_RECENT_UTIL_HOSTNAME_SIZE]; - time_t the_time; - guint32 rand; - int pid; - - gethostname (hostname, EGG_RECENT_UTIL_HOSTNAME_SIZE); - - time (&the_time); - rand = g_random_int (); - pid = getpid (); - - return g_strdup_printf ("%s-%d-%d-%d", hostname, (int)time, (int)rand, (int)pid); -} diff --git a/glabels2/src/recent-files/egg-recent-util.h b/glabels2/src/recent-files/egg-recent-util.h deleted file mode 100644 index ae8a6411..00000000 --- a/glabels2/src/recent-files/egg-recent-util.h +++ /dev/null @@ -1,23 +0,0 @@ - -#ifndef __EGG_RECENT_UTIL__ -#define __EGG_RECENT_UTIL__ - -#include -#ifndef USE_STABLE_LIBGNOMEUI -#include -#endif - -G_BEGIN_DECLS - -gchar * egg_recent_util_escape_underlines (const gchar *uri); -gchar * egg_recent_util_get_unique_id (void); -#ifndef USE_STABLE_LIBGNOMEUI -GdkPixbuf * egg_recent_util_get_icon (GnomeIconTheme *theme, - const gchar *uri, - const gchar *mime_type, - int size); -#endif - -G_END_DECLS - -#endif /* __EGG_RECENT_UTIL__ */ diff --git a/glabels2/src/recent-files/egg-recent-view-uimanager.c b/glabels2/src/recent-files/egg-recent-view-uimanager.c deleted file mode 100644 index eac90813..00000000 --- a/glabels2/src/recent-files/egg-recent-view-uimanager.c +++ /dev/null @@ -1,738 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/** - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - * - * Authors: - * James Willcox - * Paolo Bacchilega - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include -#ifndef USE_STABLE_LIBGNOMEUI -#include -#endif -#include -#include "egg-recent-model.h" -#include "egg-recent-view.h" -#include "egg-recent-view-uimanager.h" -#include "egg-recent-util.h" -#include "egg-recent-item.h" - -#define EGG_RECENT_NAME_PREFIX "EggRecentAction" -#define EGG_RECENT_ACTION "EggRecentFile" -#define EGG_RECENT_SEPARATOR (NULL) - -struct _EggRecentViewUIManager { - GObject parent_instance; - - GCallback action_callback; - gpointer action_user_data; - - gboolean leading_sep; - gboolean trailing_sep; - - GtkUIManager *uimanager; - GtkActionGroup *action_group; - guint merge_id; - gulong changed_cb_id; - - gchar *path; - - gboolean show_icons; - gboolean show_numbers; -#ifndef USE_STABLE_LIBGNOMEUI - GnomeIconTheme *theme; -#endif - - EggUIManagerTooltipFunc tooltip_func; - gpointer tooltip_func_data; - - EggRecentModel *model; - GConfClient *client; - GtkIconSize icon_size; -}; - - -struct _EggRecentViewUIManagerMenuData { - EggRecentViewUIManager *view; - EggRecentItem *item; -}; - -typedef struct _EggRecentViewUIManagerMenuData EggRecentViewUIManagerMenuData; - -enum { - ACTIVATE, - LAST_SIGNAL -}; - -/* GObject properties */ -enum { - PROP_BOGUS, - PROP_UIMANAGER, - PROP_PATH, - PROP_SHOW_ICONS, - PROP_SHOW_NUMBERS -}; - -static guint view_signals[LAST_SIGNAL] = { 0 }; - -static void -egg_recent_view_uimanager_clear (EggRecentViewUIManager *view) -{ - if (view->merge_id != 0) { - gtk_ui_manager_remove_ui (view->uimanager, view->merge_id); - view->merge_id = 0; - } - - if (view->action_group != NULL) { - gtk_ui_manager_remove_action_group (view->uimanager, view->action_group); - g_object_unref (view->action_group); - view->action_group = NULL; - } - - gtk_ui_manager_ensure_update (view->uimanager); -} - -static void -egg_recent_view_uimanager_set_list (EggRecentViewUIManager *view, GList *list) -{ - GList *scan; - guint index = 1; - - g_return_if_fail (view); - - egg_recent_view_uimanager_clear (view); - - if (view->merge_id == 0) - view->merge_id = gtk_ui_manager_new_merge_id (view->uimanager); - - if (view->action_group == NULL) { - gchar *group = g_strdup_printf ("EggRecentActions%u", - view->merge_id); - view->action_group = gtk_action_group_new (group); - gtk_ui_manager_insert_action_group (view->uimanager, view->action_group, 0); - g_free (group); - } - - if (view->leading_sep) { - gchar *action = g_strdup_printf ("EggRecentLeadingSeparator%u", - view->merge_id); - gtk_ui_manager_add_ui (view->uimanager, - view->merge_id, - view->path, - action, - EGG_RECENT_SEPARATOR, - GTK_UI_MANAGER_AUTO, - FALSE); - g_free (action); - } - - for (scan = list; scan; scan = scan->next, index++) { - EggRecentItem *item = scan->data; - GtkAction *action; - gchar *name; - gchar *uri; - gchar *basename; - gchar *escaped; - gchar *label; - gchar *tooltip = NULL; - - uri = egg_recent_item_get_uri_for_display (item); - if (uri == NULL) - continue; - - name = g_strdup_printf (EGG_RECENT_NAME_PREFIX"%u-%u", - view->merge_id, - index); - - if (view->tooltip_func != NULL) - tooltip = (*view->tooltip_func) (item, view->tooltip_func_data); - - basename = g_path_get_basename (uri); - escaped = egg_recent_util_escape_underlines (basename); - g_free (basename); - g_free (uri); - - if (view->show_numbers) { - if (index >= 10) - label = g_strdup_printf ("%d. %s", - index, - escaped); - else - label = g_strdup_printf ("_%d. %s", - index, - escaped); - g_free (escaped); - } else - label = escaped; - - action = g_object_new (GTK_TYPE_ACTION, - "name", name, - "label", label, - (view->show_icons)? "stock_id": NULL, - GTK_STOCK_OPEN, - NULL); - if (tooltip != NULL) { - g_object_set (action, "tooltip", tooltip, NULL); - g_free (tooltip); - } - egg_recent_item_ref (item); - g_object_set_data_full (G_OBJECT (action), - "egg_recent_uri", - item, - (GFreeFunc) egg_recent_item_unref); - - if (view->action_callback != NULL) { - GClosure *closure; - closure = g_cclosure_new (view->action_callback, view->action_user_data, NULL); - g_signal_connect_closure (action, "activate", closure, FALSE); - } - - gtk_action_group_add_action (view->action_group, action); - g_object_unref (action); - - gtk_ui_manager_add_ui (view->uimanager, - view->merge_id, - view->path, - name, - name, - GTK_UI_MANAGER_AUTO, - FALSE); - - g_free (name); - g_free (label); - } - - if (view->trailing_sep) { - gchar *action = g_strdup_printf ("EggRecentTrailingSeparator%u", - view->merge_id); - gtk_ui_manager_add_ui (view->uimanager, - view->merge_id, - view->path, - action, - EGG_RECENT_SEPARATOR, - GTK_UI_MANAGER_AUTO, - FALSE); - g_free (action); - } -} - -static void -model_changed_cb (EggRecentModel *model, - GList *list, - EggRecentViewUIManager *view) -{ - if (list != NULL) - egg_recent_view_uimanager_set_list (view, list); - else - egg_recent_view_uimanager_clear (view); - gtk_ui_manager_ensure_update (view->uimanager); -} - -static EggRecentModel * -egg_recent_view_uimanager_get_model (EggRecentView *view_parent) -{ - EggRecentViewUIManager *view; - - g_return_val_if_fail (view_parent != NULL, NULL); - view = EGG_RECENT_VIEW_UIMANAGER (view_parent); - return view->model; -} - -static void -egg_recent_view_uimanager_set_model (EggRecentView *view_parent, - EggRecentModel *model) -{ - EggRecentViewUIManager *view; - - g_return_if_fail (view_parent != NULL); - view = EGG_RECENT_VIEW_UIMANAGER (view_parent); - - if (view->model != NULL) { - if (view->changed_cb_id != 0) - g_signal_handler_disconnect (G_OBJECT (view->model), - view->changed_cb_id); - g_object_unref (view->model); - } - - view->model = model; - g_object_ref (view->model); - - view->changed_cb_id = g_signal_connect_object (G_OBJECT (model), - "changed", - G_CALLBACK (model_changed_cb), - view, 0); - - egg_recent_model_changed (view->model); -} - -void -egg_recent_view_uimanager_set_leading_sep (EggRecentViewUIManager *view, - gboolean val) -{ - view->leading_sep = val; - egg_recent_view_uimanager_clear (view); - if (view->model) - egg_recent_model_changed (view->model); -} - -void -egg_recent_view_uimanager_set_trailing_sep (EggRecentViewUIManager *view, - gboolean val) -{ - view->trailing_sep = val; - egg_recent_view_uimanager_clear (view); - if (view->model) - egg_recent_model_changed (view->model); -} - -static void -egg_recent_view_uimanager_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EggRecentViewUIManager *view = EGG_RECENT_VIEW_UIMANAGER (object); - - switch (prop_id) { - case PROP_UIMANAGER: - egg_recent_view_uimanager_set_uimanager (view, (GtkUIManager*)g_value_get_object (value)); - break; - case PROP_PATH: - egg_recent_view_uimanager_set_path (view, g_value_get_string (value)); - break; - case PROP_SHOW_ICONS: - egg_recent_view_uimanager_show_icons (view, g_value_get_boolean (value)); - break; - case PROP_SHOW_NUMBERS: - egg_recent_view_uimanager_show_numbers (view, g_value_get_boolean (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -egg_recent_view_uimanager_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - EggRecentViewUIManager *view = EGG_RECENT_VIEW_UIMANAGER (object); - - switch (prop_id) { - case PROP_UIMANAGER: - g_value_set_object (value, view->uimanager); - break; - case PROP_PATH: - g_value_set_string (value, view->path); - break; - case PROP_SHOW_ICONS: - g_value_set_boolean (value, view->show_icons); - break; - case PROP_SHOW_NUMBERS: - g_value_set_boolean (value, view->show_numbers); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -egg_recent_view_uimanager_finalize (GObject *object) -{ - EggRecentViewUIManager *view = EGG_RECENT_VIEW_UIMANAGER (object); - - if (view->changed_cb_id != 0) { - g_signal_handler_disconnect (G_OBJECT (view->model), - view->changed_cb_id); - view->changed_cb_id = 0; - } - - g_free (view->path); - - egg_recent_view_uimanager_clear (view); - - if (view->action_group != NULL) { - g_object_unref (view->action_group); - view->action_group = NULL; - } - - if (view->uimanager != NULL) { - g_object_unref (view->uimanager); - view->uimanager = NULL; - } - - if (view->model != NULL) { - g_object_unref (view->model); - view->model = NULL; - } - -#ifndef USE_STABLE_LIBGNOMEUI - if (view->theme != NULL) { - g_object_unref (view->theme); - view->theme = NULL; - } -#endif - - if (view->client != NULL) { - g_object_unref (view->client); - view->client = NULL; - } -} - -static void -egg_recent_view_uimanager_class_init (EggRecentViewUIManagerClass * klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - - object_class->set_property = egg_recent_view_uimanager_set_property; - object_class->get_property = egg_recent_view_uimanager_get_property; - object_class->finalize = egg_recent_view_uimanager_finalize; - - view_signals[ACTIVATE] = g_signal_new ("activate", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EggRecentViewUIManagerClass, activate), - NULL, NULL, - g_cclosure_marshal_VOID__BOXED, - G_TYPE_NONE, 1, - EGG_TYPE_RECENT_ITEM); - - g_object_class_install_property (object_class, - PROP_UIMANAGER, - g_param_spec_object ("uimanager", - "UI Manager", - "The UI manager this object will use to update.the UI", - GTK_TYPE_UI_MANAGER, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_PATH, - g_param_spec_string ("path", - "Path", - "The UI path this object will update.", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_SHOW_ICONS, - g_param_spec_boolean ("show-icons", - "Show Icons", - "Whether or not to show icons", - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, - PROP_SHOW_NUMBERS, - g_param_spec_boolean ("show-numbers", - "Show Numbers", - "Whether or not to show numbers", - TRUE, - G_PARAM_READWRITE)); - - klass->activate = NULL; -} - -static void -egg_recent_view_init (EggRecentViewClass *iface) -{ - iface->do_get_model = egg_recent_view_uimanager_get_model; - iface->do_set_model = egg_recent_view_uimanager_set_model; -} - -static void -show_menus_changed_cb (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - EggRecentViewUIManager *view) -{ - GConfValue *value; - - value = gconf_entry_get_value (entry); - g_return_if_fail (value->type == GCONF_VALUE_BOOL); - - egg_recent_view_uimanager_show_icons (view, gconf_value_get_bool (value)); -} - -#ifndef USE_STABLE_LIBGNOMEUI -static void -theme_changed_cb (GnomeIconTheme *theme, - EggRecentViewUIManager *view) -{ - if (view->model != NULL) - egg_recent_model_changed (view->model); -} -#endif - -static void -egg_recent_view_uimanager_init (EggRecentViewUIManager * view) -{ - view->client = gconf_client_get_default (); - - view->show_icons = gconf_client_get_bool (view->client, - "/desktop/gnome/interface/menus_have_icons", - NULL); - - gconf_client_add_dir (view->client, "/desktop/gnome/interface", - GCONF_CLIENT_PRELOAD_NONE, - NULL); - gconf_client_notify_add (view->client, - "/desktop/gnome/interface/menus_have_icons", - (GConfClientNotifyFunc)show_menus_changed_cb, - view, NULL, NULL); - - - view->leading_sep = FALSE; - view->trailing_sep = FALSE; - view->show_numbers = TRUE; - - view->uimanager = NULL; - view->action_group = NULL; - view->merge_id = 0; - view->changed_cb_id = 0; - - view->path = NULL; - -#ifndef USE_STABLE_LIBGNOMEUI - view->theme = gnome_icon_theme_new (); - gnome_icon_theme_set_allow_svg (view->theme, TRUE); - g_signal_connect_object (view->theme, "changed", - G_CALLBACK (theme_changed_cb), view, 0); -#endif - - view->tooltip_func = NULL; - view->tooltip_func_data = NULL; - - view->icon_size = GTK_ICON_SIZE_MENU; -} - -void -egg_recent_view_uimanager_set_icon_size (EggRecentViewUIManager *view, - GtkIconSize icon_size) -{ - if (view->icon_size != icon_size) { - view->icon_size = icon_size; - egg_recent_model_changed (view->model); - } else { - view->icon_size = icon_size; - } -} - -GtkIconSize -egg_recent_view_uimanager_get_icon_size (EggRecentViewUIManager *view) -{ - return view->icon_size; -} - -void -egg_recent_view_uimanager_show_icons (EggRecentViewUIManager *view, - gboolean show) -{ - view->show_icons = show; - if (view->model != NULL) - egg_recent_model_changed (view->model); -} - -void -egg_recent_view_uimanager_show_numbers (EggRecentViewUIManager *view, - gboolean show) -{ - view->show_numbers = show; - if (view->model != NULL) - egg_recent_model_changed (view->model); -} - -void -egg_recent_view_uimanager_set_tooltip_func (EggRecentViewUIManager *view, - EggUIManagerTooltipFunc func, - gpointer user_data) -{ - view->tooltip_func = func; - view->tooltip_func_data = user_data; - if (view->model) - egg_recent_model_changed (view->model); -} - -/** - * egg_recent_view_uimanager_set_uimanager: - * @view: A EggRecentViewUIManager object. - * @uimanager: The ui manager used to put the menu items in. - * - * Use this function to change the ui manager used to update the menu. - * - */ -void -egg_recent_view_uimanager_set_uimanager (EggRecentViewUIManager *view, - GtkUIManager *uimanager) -{ - g_return_if_fail (EGG_IS_RECENT_VIEW_UIMANAGER (view)); - g_return_if_fail (uimanager != NULL); - - if (view->uimanager != NULL) - g_object_unref (view->uimanager); - view->uimanager = uimanager; - g_object_ref (view->uimanager); -} - -/** - * egg_recent_view_uimanager_get_uimanager: - * @view: A EggRecentViewUIManager object. - * - */ -GtkUIManager* -egg_recent_view_uimanager_get_uimanager (EggRecentViewUIManager *view) -{ - g_return_val_if_fail (EGG_IS_RECENT_VIEW_UIMANAGER (view), NULL); - return view->uimanager; -} - -/** - * egg_recent_view_uimanager_set_path: - * @view: A EggRecentViewUIManager object. - * @path: The path to put the menu items in. - * - * Use this function to change the path where the recent - * documents appear in. - * - */ -void -egg_recent_view_uimanager_set_path (EggRecentViewUIManager *view, - const gchar *path) -{ - g_return_if_fail (EGG_IS_RECENT_VIEW_UIMANAGER (view)); - g_return_if_fail (path); - - g_free (view->path); - view->path = g_strdup (path); -} - -/** - * egg_recent_view_uimanager_get_path: - * @view: A EggRecentViewUIManager object. - * - */ -G_CONST_RETURN gchar* -egg_recent_view_uimanager_get_path (EggRecentViewUIManager *view) -{ - g_return_val_if_fail (EGG_IS_RECENT_VIEW_UIMANAGER (view), NULL); - return view->path; -} - -void -egg_recent_view_uimanager_set_action_func (EggRecentViewUIManager *view, - GCallback callback, - gpointer user_data) -{ - g_return_if_fail (EGG_IS_RECENT_VIEW_UIMANAGER (view)); - view->action_callback = callback; - view->action_user_data = user_data; -} - -/** - * egg_recent_view_uimanager_new: - * @appname: The name of your application. - * @limit: The maximum number of items allowed. - * - * This creates a new EggRecentViewUIManager object. - * - * Returns: a EggRecentViewUIManager object - */ -EggRecentViewUIManager * -egg_recent_view_uimanager_new (GtkUIManager *uimanager, - const gchar *path, - GCallback callback, - gpointer user_data) -{ - GObject *view; - - g_return_val_if_fail (uimanager, NULL); - g_return_val_if_fail (path, NULL); - - view = g_object_new (egg_recent_view_uimanager_get_type (), - "uimanager", uimanager, - "path", path, - NULL); - - g_return_val_if_fail (view, NULL); - - egg_recent_view_uimanager_set_action_func (EGG_RECENT_VIEW_UIMANAGER (view), - callback, - user_data); - - return EGG_RECENT_VIEW_UIMANAGER (view); -} - -/** - * egg_recent_view_uimanager_get_type: - * @: - * - * This returns a GType representing a EggRecentViewUIManager object. - * - * Returns: a GType - */ -GType -egg_recent_view_uimanager_get_type (void) -{ - static GType egg_recent_view_uimanager_type = 0; - - if(!egg_recent_view_uimanager_type) { - static const GTypeInfo egg_recent_view_uimanager_info = { - sizeof (EggRecentViewUIManagerClass), - NULL, /* base init */ - NULL, /* base finalize */ - (GClassInitFunc)egg_recent_view_uimanager_class_init, /* class init */ - NULL, /* class finalize */ - NULL, /* class data */ - sizeof (EggRecentViewUIManager), - 0, - (GInstanceInitFunc) egg_recent_view_uimanager_init - }; - - static const GInterfaceInfo view_info = - { - (GInterfaceInitFunc) egg_recent_view_init, - NULL, - NULL - }; - - egg_recent_view_uimanager_type = g_type_register_static (G_TYPE_OBJECT, - "EggRecentViewUIManager", - &egg_recent_view_uimanager_info, 0); - g_type_add_interface_static (egg_recent_view_uimanager_type, - EGG_TYPE_RECENT_VIEW, - &view_info); - } - - return egg_recent_view_uimanager_type; -} - -EggRecentItem* -egg_recent_view_uimanager_get_item (EggRecentViewUIManager *view, - GtkAction *action) -{ - return g_object_get_data (G_OBJECT(action), "egg_recent_uri"); -} diff --git a/glabels2/src/recent-files/egg-recent-view-uimanager.h b/glabels2/src/recent-files/egg-recent-view-uimanager.h deleted file mode 100644 index b6eadfaf..00000000 --- a/glabels2/src/recent-files/egg-recent-view-uimanager.h +++ /dev/null @@ -1,60 +0,0 @@ -/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef __EGG_RECENT_VIEW_UIMANAGER_H__ -#define __EGG_RECENT_VIEW_UIMANAGER_H__ - - -#include -#include "egg-recent-item.h" - -G_BEGIN_DECLS - -#define EGG_RECENT_VIEW_UIMANAGER(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, egg_recent_view_uimanager_get_type (), EggRecentViewUIManager) -#define EGG_RECENT_VIEW_UIMANAGER_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, egg_recent_view_uimanager_get_type (), EggRecentViewUIManagerClass) -#define EGG_IS_RECENT_VIEW_UIMANAGER(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, egg_recent_view_uimanager_get_type ()) - -typedef char* (*EggUIManagerTooltipFunc) (EggRecentItem *item, - gpointer user_data); - -typedef struct _EggRecentViewUIManager EggRecentViewUIManager; -typedef struct _EggRecentViewUIManagerClass EggRecentViewUIManagerClass; - -struct _EggRecentViewUIManagerClass { - GObjectClass parent_class; - void (*activate) (EggRecentViewUIManager *view, EggRecentItem *item); -}; - -GType egg_recent_view_uimanager_get_type (void); -EggRecentViewUIManager *egg_recent_view_uimanager_new (GtkUIManager *uimanager, - const gchar *path, - GCallback callback, - gpointer user_data); -void egg_recent_view_uimanager_set_uimanager (EggRecentViewUIManager *view, - GtkUIManager *uimanager); -GtkUIManager* egg_recent_view_uimanager_get_uimanager (EggRecentViewUIManager *view); -void egg_recent_view_uimanager_set_path (EggRecentViewUIManager *view, - const gchar *path); -G_CONST_RETURN gchar *egg_recent_view_uimanager_get_path (EggRecentViewUIManager *view); -void egg_recent_view_uimanager_set_action_func (EggRecentViewUIManager *view, - GCallback callback, - gpointer user_data); -void egg_recent_view_uimanager_set_leading_sep (EggRecentViewUIManager *view, - gboolean val); -void egg_recent_view_uimanager_set_trailing_sep (EggRecentViewUIManager *view, - gboolean val); -void egg_recent_view_uimanager_show_icons (EggRecentViewUIManager *view, - gboolean show); -void egg_recent_view_uimanager_show_numbers (EggRecentViewUIManager *view, - gboolean show); -void egg_recent_view_uimanager_set_tooltip_func (EggRecentViewUIManager *view, - EggUIManagerTooltipFunc func, - gpointer user_data); -void egg_recent_view_uimanager_set_icon_size (EggRecentViewUIManager *view, - GtkIconSize icon_size); -GtkIconSize egg_recent_view_uimanager_get_icon_size (EggRecentViewUIManager *view); -EggRecentItem *egg_recent_view_uimanager_get_item (EggRecentViewUIManager *view, - GtkAction *action); - -G_END_DECLS - - -#endif /* __EGG_RECENT_VIEW_UIMANAGER_H__ */ diff --git a/glabels2/src/recent-files/egg-recent-view.c b/glabels2/src/recent-files/egg-recent-view.c deleted file mode 100644 index 7794561d..00000000 --- a/glabels2/src/recent-files/egg-recent-view.c +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - * - * Authors: - * James Willcox - */ - - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include "egg-recent-view.h" - - -GtkType -egg_recent_view_get_type (void) -{ - static GtkType view_type = 0; - - if (!view_type) - { - static const GTypeInfo view_info = - { - sizeof (EggRecentViewClass), /* class_size */ - NULL, /* base_init */ - NULL, /* base_finalize */ - }; - - view_type = g_type_register_static (G_TYPE_INTERFACE, - "EggRecentView", - &view_info, 0); - } - - return view_type; -} - -EggRecentModel * -egg_recent_view_get_model (EggRecentView *view) -{ - g_return_val_if_fail (view, NULL); - - return EGG_RECENT_VIEW_GET_CLASS (view)->do_get_model (view); -} - -void -egg_recent_view_set_model (EggRecentView *view, EggRecentModel *model) -{ - g_return_if_fail (view); - g_return_if_fail (model); - - EGG_RECENT_VIEW_GET_CLASS (view)->do_set_model (view, model); -} diff --git a/glabels2/src/recent-files/egg-recent-view.h b/glabels2/src/recent-files/egg-recent-view.h deleted file mode 100644 index 79f03469..00000000 --- a/glabels2/src/recent-files/egg-recent-view.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __EGG_RECENT_VIEW_H__ -#define __EGG_RECENT_VIEW_H__ - - -#include -#include -#include "egg-recent-model.h" -#include "egg-recent-item.h" - -G_BEGIN_DECLS - -#define EGG_TYPE_RECENT_VIEW (egg_recent_view_get_type ()) -#define EGG_RECENT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_RECENT_VIEW, EggRecentView)) -#define EGG_RECENT_VIEW_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), EGG_TYPE_RECENT_VIEW, EggRecentViewClass)) -#define EGG_IS_RECENT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_RECENT_VIEW)) -#define EGG_IS_RECENT_VIEW_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), EGG_TYPE_RECENT_VIEW)) -#define EGG_RECENT_VIEW_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), EGG_TYPE_RECENT_VIEW, EggRecentViewClass)) - - -typedef struct _EggRecentView EggRecentView; -typedef struct _EggRecentViewClass EggRecentViewClass; - -struct _EggRecentViewClass -{ - GTypeInterface base_iface; - - /* vtable, not signals */ - void (* do_set_model) (EggRecentView *view, - EggRecentModel *model); - EggRecentModel * (* do_get_model) (EggRecentView *view); -}; - -GtkType egg_recent_view_get_type (void) G_GNUC_CONST; -void egg_recent_view_set_list (EggRecentView *view, - GSList *list); -void egg_recent_view_clear (EggRecentView *view); -EggRecentModel *egg_recent_view_get_model (EggRecentView *view); -void egg_recent_view_set_model (EggRecentView *view, - EggRecentModel *model); - -G_END_DECLS - -#endif /* __EGG_RECENT_VIEW_H__ */ diff --git a/glabels2/src/recent-files/egg-recent.h b/glabels2/src/recent-files/egg-recent.h deleted file mode 100644 index 8b8153ba..00000000 --- a/glabels2/src/recent-files/egg-recent.h +++ /dev/null @@ -1,6 +0,0 @@ -#include "egg-recent-item.h" -#include "egg-recent-model.h" -#include "egg-recent-view.h" -#include "egg-recent-view-bonobo.h" -#include "egg-recent-view-gtk.h" -#include "egg-recent-view-uimanager.h" diff --git a/glabels2/src/recent-files/update-from-egg.sh b/glabels2/src/recent-files/update-from-egg.sh deleted file mode 100755 index 9be68a9b..00000000 --- a/glabels2/src/recent-files/update-from-egg.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -function die() { - echo $* - exit 1 -} - -if test -z "$EGGDIR"; then - echo "Must set EGGDIR" - exit 1 -fi - -if test -z "$EGGFILES"; then - echo "Must set EGGFILES" - exit 1 -fi - -for FILE in $EGGFILES; do - if cmp -s $EGGDIR/$FILE $FILE; then - echo "File $FILE is unchanged" - else - cp $EGGDIR/$FILE $FILE || die "Could not move $EGGDIR/$FILE to $FILE" - echo "Updated $FILE" - fi -done diff --git a/glabels2/src/recent.c b/glabels2/src/recent.c index 50a150cc..7d1a3f27 100644 --- a/glabels2/src/recent.c +++ b/glabels2/src/recent.c @@ -1,9 +1,11 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + /* * (GLABELS) Label and Business Card Creation program for GNOME * * recent.c: gLabels recent files module * - * Copyright (C) 2001-2002 Jim Evins . + * Copyright (C) 2001-2006 Jim Evins . * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,151 +21,135 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include #include "recent.h" #include +#include #include "prefs.h" - #include "debug.h" -static EggRecentModel *model; +#define GLABELS_MIME_TYPE "application/x-glabels" -/** - * unescape_string: - * @escaped_string: an escaped URI, path, or other string - * @illegal_characters: a string containing a sequence of characters - * considered "illegal", '\0' is automatically in this list. - * - * Decodes escaped characters (i.e. PERCENTxx sequences) in @escaped_string. - * Characters are encoded in PERCENTxy form, where xy is the ASCII hex code - * for character 16x+y. - * - * Return value: a newly allocated string with the unescaped equivalents, - * or %NULL if @escaped_string contained one of the characters - * in @illegal_characters. - * - * this code comes from gnome-vfs-utils.c - **/ +static GtkRecentManager *model; -#define HEX_ESCAPE '%' -static int -hex_to_int (gchar c) -{ - return c >= '0' && c <= '9' ? c - '0' - : c >= 'A' && c <= 'F' ? c - 'A' + 10 - : c >= 'a' && c <= 'f' ? c - 'a' + 10 - : -1; -} -static int -unescape_character (const char *scanner) +/*****************************************************************************/ +/* Initialize recent files model. */ +/*****************************************************************************/ +void +gl_recent_init (void) { - int first_digit; - int second_digit; - - first_digit = hex_to_int (*scanner++); - if (first_digit < 0) { - return -1; - } + gl_debug (DEBUG_RECENT, "START"); - second_digit = hex_to_int (*scanner++); - if (second_digit < 0) { - return -1; - } + model = gtk_recent_manager_get_default (); - return (first_digit << 4) | second_digit; + gl_debug (DEBUG_RECENT, "END"); } -static char * -unescape_string (const gchar *escaped_string, - const gchar *illegal_characters) -{ - const gchar *in; - gchar *out, *result; - gint character; - - if (escaped_string == NULL) { - return NULL; - } - - result = g_malloc (strlen (escaped_string) + 1); - - out = result; - for (in = escaped_string; *in != '\0'; in++) { - character = *in; - if (*in == HEX_ESCAPE) { - character = unescape_character (in + 1); - - /* Check for an illegal character. We consider '\0' illegal here. */ - if (character <= 0 - || (illegal_characters != NULL - && strchr (illegal_characters, (char)character) != NULL)) { - g_free (result); - return NULL; - } - in += 2; - } - *out++ = (char)character; - } - - *out = '\0'; - g_assert (out - result <= strlen (escaped_string)); - return result; - -} +/*****************************************************************************/ +/* Get UTF8 filename from GtkRecentInfo structure. */ +/*****************************************************************************/ gchar * -gl_recent_get_filename (EggRecentItem *item) +gl_recent_get_utf8_filename (GtkRecentInfo *item) { - char *uri, *filename; - char *utf8_filename = NULL; - int prefix_len = strlen ("file://"); - gboolean result = FALSE; + const gchar *uri; + gchar *filename; + gchar *utf8_filename = NULL; - uri = egg_recent_item_get_uri (item); + gl_debug (DEBUG_RECENT, "START"); - if (strlen (uri) > prefix_len) { - filename = unescape_string (uri + prefix_len, ""); - utf8_filename = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL); - g_free (filename); - } - - g_free (uri); + uri = gtk_recent_info_get_uri (item); + + filename = g_filename_from_uri (uri, NULL, NULL); + if ( filename != NULL ) + { + utf8_filename = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL); + g_free (filename); + } return utf8_filename; + gl_debug (DEBUG_RECENT, "END"); } +/*****************************************************************************/ +/* Add file by UTF8 filename to recent model. */ +/*****************************************************************************/ void -gl_recent_add_uri (gchar *uri) +gl_recent_add_utf8_filename (gchar *utf8_filename) { - EggRecentItem *item; - - gl_debug (DEBUG_RECENT, "add_uri = %s", uri); - - item = egg_recent_item_new_from_uri (uri); - egg_recent_item_add_group (item, "glabels"); - egg_recent_model_add_full (model, item); - egg_recent_item_unref (item); -} + GtkRecentData *recent_data; + gchar *filename; + gchar *uri; -EggRecentModel * -gl_recent_get_model (void) -{ - return model; + static gchar *groups[2] = { + "glabels", + NULL + }; + + gl_debug (DEBUG_RECENT, "START"); + + recent_data = g_slice_new (GtkRecentData); + + recent_data->display_name = NULL; + recent_data->description = NULL; + recent_data->mime_type = GLABELS_MIME_TYPE; + recent_data->app_name = (gchar *) g_get_application_name (); + recent_data->app_exec = g_strjoin (" ", g_get_prgname (), "%f", NULL); + recent_data->groups = groups; + recent_data->is_private = FALSE; + + filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL); + if ( filename != NULL ) + { + + uri = g_filename_to_uri (filename, NULL, NULL); + if ( uri != NULL ) + { + + gtk_recent_manager_add_full (model, uri, recent_data); + g_free (uri); + + } + g_free (filename); + + } + + g_free (recent_data->app_exec); + g_slice_free (GtkRecentData, recent_data); + + gl_debug (DEBUG_RECENT, "END"); } -void -gl_recent_init (void) + +/*****************************************************************************/ +/* Create a menu of recent files. */ +/*****************************************************************************/ +GtkWidget * +gl_recent_create_menu (void) { - gl_debug (DEBUG_RECENT, "max_recents = %d", gl_prefs->max_recents); + GtkWidget *recent_menu; + GtkRecentFilter *recent_filter; + + gl_debug (DEBUG_RECENT, "START"); + + recent_menu = + gtk_recent_chooser_menu_new_for_manager (model); + gtk_recent_chooser_menu_set_show_numbers (GTK_RECENT_CHOOSER_MENU (recent_menu), FALSE); + gtk_recent_chooser_set_show_icons (GTK_RECENT_CHOOSER (recent_menu), TRUE); + gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (recent_menu), gl_prefs->max_recents); + gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (recent_menu), GTK_RECENT_SORT_MRU); + gtk_recent_chooser_set_local_only (GTK_RECENT_CHOOSER (recent_menu), TRUE); + + recent_filter = gtk_recent_filter_new (); + gtk_recent_filter_add_mime_type (recent_filter, GLABELS_MIME_TYPE); + gtk_recent_chooser_set_filter (recent_menu, recent_filter); - model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_MRU); - egg_recent_model_set_limit (model, - gl_prefs->max_recents); - egg_recent_model_set_filter_groups (model, "glabels", NULL); - egg_recent_model_set_filter_uri_schemes (model, "file", NULL); + gl_debug (DEBUG_RECENT, "END"); + return recent_menu; } diff --git a/glabels2/src/recent.h b/glabels2/src/recent.h index db61a57c..9a1b36c4 100644 --- a/glabels2/src/recent.h +++ b/glabels2/src/recent.h @@ -1,9 +1,11 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + /* * (GLABELS) Label and Business Card Creation program for GNOME * * recent.h: gLabels recent files module header file * - * Copyright (C) 2001-2002 Jim Evins . + * Copyright (C) 2001-2006 Jim Evins . * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,17 +21,23 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #ifndef __RECENT_H__ #define __RECENT_H__ -#include "recent-files/egg-recent-model.h" +#include +#include G_BEGIN_DECLS -gchar * gl_recent_get_filename (EggRecentItem *item); -void gl_recent_add_uri (gchar *uri); -EggRecentModel * gl_recent_get_model (void); -void gl_recent_init (void); +void gl_recent_init (void); + +gchar *gl_recent_get_utf8_filename (GtkRecentInfo *item); + +void gl_recent_add_utf8_filename (gchar *utf8_filename); + +GtkWidget *gl_recent_create_menu (void); + G_END_DECLS diff --git a/glabels2/src/ui-commands.c b/glabels2/src/ui-commands.c index 7cf91035..db85c54d 100644 --- a/glabels2/src/ui-commands.c +++ b/glabels2/src/ui-commands.c @@ -31,8 +31,6 @@ #include #include #include -#include "recent-files/egg-recent-view.h" -#include "recent-files/egg-recent-view-uimanager.h" #include "view.h" #include "file.h" @@ -125,26 +123,30 @@ gl_ui_cmd_file_open (GtkAction *action, /** File/Open-Recent command. */ /****************************************************************************/ void -gl_ui_cmd_file_open_recent (GtkAction *action, - glWindow *window) +gl_ui_cmd_file_open_recent (GtkRecentChooser *chooser, + glWindow *window) { - EggRecentViewUIManager *recent_view; - EggRecentItem *item; - gchar *utf8_filename; + GtkRecentInfo *item; + gchar *utf8_filename; gl_debug (DEBUG_COMMANDS, "START"); - g_return_if_fail (action && GTK_IS_ACTION(action)); + g_return_if_fail (chooser && GTK_IS_RECENT_CHOOSER(chooser)); g_return_if_fail (window && GL_IS_WINDOW(window)); - recent_view = g_object_get_data (G_OBJECT(window->ui), "recent-view"); - g_return_if_fail (recent_view && EGG_IS_RECENT_VIEW_UIMANAGER (recent_view)); + item = gtk_recent_chooser_get_current_item (chooser); + if (!item) + return; - item = egg_recent_view_uimanager_get_item (recent_view, action); - utf8_filename = gl_recent_get_filename (item); + utf8_filename = gl_recent_get_utf8_filename (item); + gl_debug (DEBUG_COMMANDS, "Selected %s\n", utf8_filename); +#if 1 gl_file_open_recent (utf8_filename, window); +#endif + gtk_recent_info_unref (item); + gl_debug (DEBUG_COMMANDS, "END"); } diff --git a/glabels2/src/ui-commands.h b/glabels2/src/ui-commands.h index 77420785..0d5b05db 100644 --- a/glabels2/src/ui-commands.h +++ b/glabels2/src/ui-commands.h @@ -26,6 +26,7 @@ #define __COMMANDS_H__ #include +#include #include #include "window.h" @@ -43,8 +44,8 @@ void gl_ui_cmd_file_template_designer (GtkAction *action, void gl_ui_cmd_file_open (GtkAction *action, glWindow *window); -void gl_ui_cmd_file_open_recent (GtkAction *action, - glWindow *window); +void gl_ui_cmd_file_open_recent (GtkRecentChooser *chooser, + glWindow *window); void gl_ui_cmd_file_save (GtkAction *action, glWindow *window); diff --git a/glabels2/src/ui.c b/glabels2/src/ui.c index 4465d42b..b7ce5852 100644 --- a/glabels2/src/ui.c +++ b/glabels2/src/ui.c @@ -27,8 +27,11 @@ #include #include -#include "recent-files/egg-recent-view.h" -#include "recent-files/egg-recent-view-uimanager.h" +#include +#include +#include +#include +#include #include #include "ui-util.h" @@ -79,7 +82,7 @@ static void menu_item_select_cb (GtkMenuItem *proxy, static void menu_item_deselect_cb (GtkMenuItem *proxy, glWindow *window); -static char *recent_tooltip_func (EggRecentItem *item, +static char *recent_tooltip_func (GtkRecentInfo *item, gpointer user_data); @@ -92,7 +95,7 @@ static GtkActionEntry entries[] = { /* Menu entries. */ { "FileMenu", NULL, N_("_File") }, - { "FileRecentsMenu", NULL, N_("Recent _Files") }, + { "FileRecentsMenu", NULL, N_("Open Recent _Files") }, { "EditMenu", NULL, N_("_Edit") }, { "ViewMenu", NULL, N_("_View") }, { "ViewMainToolBarMenu", NULL, N_("Customize Main Toolbar") }, @@ -511,9 +514,7 @@ static const gchar *ui_info = " " " " " " -" " -" " -" " +" " " " " " " " @@ -762,7 +763,7 @@ gl_ui_new (glWindow *window) GtkUIManager *ui; GtkActionGroup *actions; GError *error = NULL; - EggRecentViewUIManager *recent_view; + GtkWidget *recent_menu; gl_debug (DEBUG_UI, "START"); @@ -802,16 +803,13 @@ gl_ui_new (glWindow *window) /* Set view grid and markup visibility according to prefs */ set_view_style (ui); - /* add an eggRecentView */ - recent_view = - egg_recent_view_uimanager_new (ui, - "/ui/MenuBar/FileMenu/FileRecentsMenu/FileRecentsPlaceHolder", - G_CALLBACK (gl_ui_cmd_file_open_recent), - window); - egg_recent_view_uimanager_show_icons (recent_view, FALSE); - egg_recent_view_uimanager_set_tooltip_func (recent_view, recent_tooltip_func, NULL); - egg_recent_view_set_model (EGG_RECENT_VIEW (recent_view), gl_recent_get_model ()); - g_object_set_data (G_OBJECT (ui), "recent-view", recent_view); + /* add an Open Recents Submenu */ + recent_menu = gl_recent_create_menu (); + g_signal_connect (G_OBJECT (recent_menu), "item-activated", + G_CALLBACK (gl_ui_cmd_file_open_recent), window); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (ui, "/MenuBar/FileMenu/FileRecentsMenu")), + recent_menu); + gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, FALSE); @@ -830,12 +828,6 @@ gl_ui_unref (GtkUIManager *ui) gl_debug (DEBUG_UI, "START"); - /* Pull out recent view to unreference. */ - recent_view = g_object_get_data (G_OBJECT(ui), "recent-view"); - if (recent_view) { - g_object_unref (recent_view); - } - g_object_unref(ui); gl_debug (DEBUG_UI, "END"); @@ -1190,23 +1182,3 @@ menu_item_deselect_cb (GtkMenuItem *proxy, window->menu_tips_context_id); } -/*---------------------------------------------------------------------------*/ -/** PRIVATE. Tooltip function for recent file menu items. */ -/*---------------------------------------------------------------------------*/ -static char * -recent_tooltip_func (EggRecentItem *item, gpointer user_data) -{ - char *tip; - char *uri_for_display; - - uri_for_display = egg_recent_item_get_uri_for_display (item); - g_return_val_if_fail (uri_for_display != NULL, NULL); - - tip = g_strdup_printf (_("Open '%s'"), uri_for_display); - - g_free (uri_for_display); - - return tip; -} - - -- 2.39.5