From f75f5694d713ead3d2942127ad0dfeb7259a0357 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Fri, 26 Oct 2007 15:29:32 +0000 Subject: Removed 2007-10-26 Carlos Garcia Campos * configure.ac: * cut-n-paste/Makefile.am: * cut-n-paste/recent-files/*: Removed * help/reference/Makefile.am: * shell/Makefile.am: * shell/ev-application.[ch]: (ev_application_shutdown), (ev_application_init): * shell/ev-window.c: (ev_window_add_recent), (ev_window_setup_recent), (ev_window_dispose), (ev_window_init): Bump requirements to gtk+ 2.10.0 and remove egg-recent code. svn path=/trunk/; revision=2722 --- (limited to 'cut-n-paste/recent-files') diff --git a/cut-n-paste/recent-files/Makefile.am b/cut-n-paste/recent-files/Makefile.am deleted file mode 100644 index 8550d78..0000000 --- a/cut-n-paste/recent-files/Makefile.am +++ /dev/null @@ -1,25 +0,0 @@ -INCLUDES = \ - $(LIB_CFLAGS) \ - $(WARN_CFLAGS) - -# $(DISABLE_DEPRECATED) - -EGG_FILES = \ - egg-recent-model.c \ - egg-recent-model.h \ - egg-recent-item.c \ - egg-recent-item.h \ - egg-recent-view.c \ - egg-recent-view.h \ - egg-recent-view-uimanager.c \ - egg-recent-view-uimanager.h \ - egg-recent-util.c \ - egg-recent-util.h - -noinst_LTLIBRARIES = librecent.la - -librecent_la_SOURCES = $(EGG_FILES) - -EGGDIR=$(srcdir)/../../../libegg/libegg/recent-files -regenerate-built-sources: - EGGFILES="$(EGG_FILES)" EGGDIR="$(EGGDIR)" $(top_srcdir)/cut-n-paste/update-from-egg.sh diff --git a/cut-n-paste/recent-files/egg-recent-item.c b/cut-n-paste/recent-files/egg-recent-item.c deleted file mode 100644 index ce4b64e..0000000 --- a/cut-n-paste/recent-files/egg-recent-item.c +++ /dev/null @@ -1,426 +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 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); -} - -static gchar * -get_uri_shortname_for_display (GnomeVFSURI *uri) -{ - gchar *name; - gboolean validated; - - validated = FALSE; - name = gnome_vfs_uri_extract_short_name (uri); - - if (name == NULL) - { - name = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_PASSWORD); - } - else if (g_ascii_strcasecmp (uri->method_string, "file") == 0) - { - gchar *text_uri; - gchar *local_file; - text_uri = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_PASSWORD); - local_file = gnome_vfs_get_local_path_from_uri (text_uri); - - if (local_file != NULL) - { - g_free (name); - name = g_filename_display_basename (local_file); - validated = TRUE; - } - - g_free (local_file); - g_free (text_uri); - } - else if (!gnome_vfs_uri_has_parent (uri)) - { - const gchar *method; - - method = uri->method_string; - - if (name == NULL || - strcmp (name, GNOME_VFS_URI_PATH_STR) == 0) - { - g_free (name); - name = g_strdup (method); - } - else - { - gchar *tmp; - - tmp = name; - name = g_strdup_printf ("%s: %s", method, name); - g_free (tmp); - } - } - - if (!validated && !g_utf8_validate (name, -1, NULL)) - { - gchar *utf8_name; - - utf8_name = make_valid_utf8 (name); - g_free (name); - name = utf8_name; - } - - return name; -} - -/** - * 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; - gchar *short_name; - - 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 = get_uri_shortname_for_display (uri); - - 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/cut-n-paste/recent-files/egg-recent-item.h b/cut-n-paste/recent-files/egg-recent-item.h deleted file mode 100644 index 00f8fb8..0000000 --- a/cut-n-paste/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/cut-n-paste/recent-files/egg-recent-model.c b/cut-n-paste/recent-files/egg-recent-model.c deleted file mode 100644 index c9c255b..0000000 --- a/cut-n-paste/recent-files/egg-recent-model.c +++ /dev/null @@ -1,1963 +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 -#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_POLL_TIME 3 - -/* needed for Darwin */ -#if !HAVE_DECL_LOCKF -int lockf (int filedes, int function, off_t size); -#endif - -#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; - guint poll_timeout; - time_t last_mtime; -}; - -/* 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 { - 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 GObjectClass *parent_class; - -static void egg_recent_model_clear_mime_filter (EggRecentModel *model); -static void egg_recent_model_clear_group_filter (EggRecentModel *model); -static void egg_recent_model_clear_scheme_filter (EggRecentModel *model); - -static GObjectClass *parent_class; - -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; - -#ifndef G_OS_WIN32 - fsync (fd); -#endif - 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 ParseInfo * -parse_info_init (void) -{ - ParseInfo *retval; - - retval = g_new0 (ParseInfo, 1); - retval->states = g_slist_prepend (NULL, STATE_START); - retval->items = NULL; - - return retval; -} - -static void -parse_info_free (ParseInfo *info) -{ - g_slist_free (info->states); - g_free (info); -} - -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 gboolean -valid_element (ParseInfo *info, - int valid_parent_state, - const gchar *element_name, - const gchar *valid_element, - GError **error) -{ - if (peek_state (info) != valid_parent_state) { - g_set_error (error, - G_MARKUP_ERROR, - G_MARKUP_ERROR_INVALID_CONTENT, - "Unexpected tag '%s', tag '%s' expected", - element_name, valid_element); - return FALSE; - } - - return TRUE; -} - -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)) { - if (valid_element (info, STATE_RECENT_FILES, - TAG_RECENT_ITEM, TAG_RECENT_FILES, error)) { - info->current_item = egg_recent_item_new (); - push_state (info, STATE_RECENT_ITEM); - } - } else if (ELEMENT_IS (TAG_URI)) { - if (valid_element (info, STATE_RECENT_ITEM, - TAG_URI, TAG_RECENT_ITEM, error)) { - push_state (info, STATE_URI); - } - } else if (ELEMENT_IS (TAG_MIME_TYPE)) { - if (valid_element (info, STATE_RECENT_ITEM, - TAG_MIME_TYPE, TAG_RECENT_ITEM, error)) { - push_state (info, STATE_MIME_TYPE); - } - } else if (ELEMENT_IS (TAG_TIMESTAMP)) { - if (valid_element (info, STATE_RECENT_ITEM, - TAG_TIMESTAMP, TAG_RECENT_ITEM, error)) { - push_state (info, STATE_TIMESTAMP); - } - } else if (ELEMENT_IS (TAG_PRIVATE)) { - if (valid_element (info, STATE_RECENT_ITEM, - TAG_PRIVATE, TAG_RECENT_ITEM, error)) { - push_state (info, STATE_PRIVATE); - egg_recent_item_set_private (info->current_item, TRUE); - } - } else if (ELEMENT_IS (TAG_GROUPS)) { - if (valid_element (info, STATE_RECENT_ITEM, - TAG_GROUPS, TAG_RECENT_ITEM, error)) { - push_state (info, STATE_GROUPS); - } - } else if (ELEMENT_IS (TAG_GROUP)) { - if (valid_element (info, STATE_GROUPS, - TAG_GROUP, TAG_GROUPS, error)) { - 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: - if (!info->current_item) { - g_warning ("No recent item found\n"); - break; - } - - if (!info->current_item->uri) { - g_warning ("Invalid item found\n"); - break; - } - - info->items = g_list_prepend (info->items, - info->current_item); - info->current_item = NULL; - 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; - gchar *value; - - value = g_strndup (text, text_len); - - 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, value); - break; - case STATE_MIME_TYPE: - egg_recent_item_set_mime_type (info->current_item, value); - break; - case STATE_TIMESTAMP: - egg_recent_item_set_timestamp (info->current_item, - (time_t)atoi (value)); - break; - case STATE_GROUP: - egg_recent_item_add_group (info->current_item, - text); - break; - } - - g_free (value); -} - -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) -{ - GList *newlist = NULL; - GList *l; - gchar *mime_type; - gchar *uri; - - g_return_val_if_fail (list != NULL, NULL); - - for (l = list; l != NULL ; l = l->next) { - EggRecentItem *item = (EggRecentItem *) l->data; - gboolean pass_mime_test = FALSE; - gboolean pass_group_test = FALSE; - gboolean pass_scheme_test = FALSE; - - g_assert (item != NULL); - - 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); - else - egg_recent_item_unref (item); - - g_free (uri); - } - - g_list_free (list); - - return g_list_reverse (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) -{ - model->priv->changed_timeout = 0; - - 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 || - event_type == GNOME_VFS_MONITOR_EVENT_CREATED || - event_type == GNOME_VFS_MONITOR_EVENT_DELETED) { - 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 gboolean -egg_recent_model_poll_timeout (gpointer user_data) -{ - EggRecentModel *model; - struct stat stat_buf; - int stat_res; - - model = EGG_RECENT_MODEL (user_data); - stat_res = stat (model->priv->path, &stat_buf); - - if (!stat_res && stat_buf.st_mtime && - stat_buf.st_mtime != model->priv->last_mtime) { - model->priv->last_mtime = stat_buf.st_mtime; - - 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); - } - return TRUE; -} - -static void -egg_recent_model_monitor (EggRecentModel *model, gboolean should_monitor) -{ - if (should_monitor && model->priv->monitor == NULL) { - char *uri; - GnomeVFSResult result; - - uri = gnome_vfs_get_uri_from_local_path (model->priv->path); - - result = 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 - */ - if (result == GNOME_VFS_ERROR_NOT_SUPPORTED) { - if (model->priv->poll_timeout > 0) - g_source_remove (model->priv->poll_timeout); - - model->priv->poll_timeout = g_timeout_add ( - EGG_RECENT_MODEL_POLL_TIME * 1000, - egg_recent_model_poll_timeout, - model); - } - - } 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; - } - - info = parse_info_init (); - - 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 while parsing the .recently-used file: %s\n", - error->message); - - g_error_free (error); - parse_info_free (info); - - return NULL; - } - - error = NULL; - if (!g_markup_parse_context_end_parse (ctx, &error)) { - g_warning ("Unable to complete parsing of the .recently-used file: %s\n", - error->message); - - g_error_free (error); - g_markup_parse_context_free (ctx); - parse_info_free (info); - - return NULL; - } - - list = g_list_reverse (info->items); - - g_markup_parse_context_free (ctx); - parse_info_free (info); - g_free (content); - - 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, - gboolean for_writing) -{ - FILE *file; - mode_t prev_umask; - - file = fopen (model->priv->path, "r+"); - if (file == NULL && for_writing) { - /* 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) -{ -#ifdef HAVE_LOCKF - 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; -#else - return TRUE; -#endif /* HAVE_LOCKF */ -} - -static gboolean -egg_recent_model_unlock_file (FILE *file) -{ -#ifdef HAVE_LOCKF - int fd; - - rewind (file); - fd = fileno (file); - - return (lockf (fd, F_ULOCK, 0) == 0) ? TRUE : FALSE; -#else - return TRUE; -#endif /* HAVE_LOCKF */ -} - -static void -egg_recent_model_finalize (GObject *object) -{ - EggRecentModel *model = EGG_RECENT_MODEL (object); - - if (model->priv->changed_timeout > 0) { - g_source_remove (model->priv->changed_timeout); - } - - 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; - - if (model->priv->poll_timeout > 0) - g_source_remove (model->priv->poll_timeout); - model->priv->poll_timeout =0; - - g_free (model->priv); - - parent_class->finalize (object); -} - -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: - if (model->priv->mime_filter_values != NULL) - egg_recent_model_clear_mime_filter (model); - - model->priv->mime_filter_values = - (GSList *)g_value_get_pointer (value); - break; - - case PROP_GROUP_FILTERS: - if (model->priv->group_filter_values != NULL) - egg_recent_model_clear_group_filter (model); - - model->priv->group_filter_values = - (GSList *)g_value_get_pointer (value); - break; - - case PROP_SCHEME_FILTERS: - if (model->priv->scheme_filter_values != NULL) - egg_recent_model_clear_scheme_filter (model); - - 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; - - parent_class = g_type_class_peek_parent (klass); - - parent_class = g_type_class_peek_parent (klass); - - 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; - model->priv->poll_timeout = 0; - model->priv->last_mtime = 0; - 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, TRUE); - 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, TRUE); - 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, FALSE); - if (file == NULL) - return 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, TRUE); - 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); - - if (model->priv->monitor == NULL) { - /* since monitoring isn't working, at least give a - * local notification - */ - egg_recent_model_changed (model); - } -} - -static void -egg_recent_model_clear_mime_filter (EggRecentModel *model) -{ - 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; - } -} - -/** - * 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); - - egg_recent_model_clear_mime_filter (model); - - 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; -} - -static void -egg_recent_model_clear_group_filter (EggRecentModel *model) -{ - 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; - } -} - -/** - * 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); - - egg_recent_model_clear_group_filter (model); - - 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; -} - -static void -egg_recent_model_clear_scheme_filter (EggRecentModel *model) -{ - 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; - } -} - -/** - * 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); - - egg_recent_model_clear_scheme_filter (model); - - 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, FALSE); - if (file == NULL) - return; - - 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) { - 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/cut-n-paste/recent-files/egg-recent-model.h b/cut-n-paste/recent-files/egg-recent-model.h deleted file mode 100644 index 8c2eb8d..0000000 --- a/cut-n-paste/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/cut-n-paste/recent-files/egg-recent-util.c b/cut-n-paste/recent-files/egg-recent-util.c deleted file mode 100644 index 4597f03..0000000 --- a/cut-n-paste/recent-files/egg-recent-util.c +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include -#include -#include -#ifndef USE_STABLE_LIBGNOMEUI -#include -#endif -#include -#include -#include -#include -#include "egg-recent-util.h" - -#ifdef G_OS_WIN32 -#include -#endif - -#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); -} - -GdkPixbuf * -egg_recent_util_get_icon (GtkIconTheme *theme, const gchar *uri, - const gchar *mime_type, int size) -{ -#ifndef USE_STABLE_LIBGNOMEUI - gchar *icon; - GdkPixbuf *pixbuf; - - icon = gnome_icon_lookup (theme, NULL, uri, NULL, NULL, - mime_type, 0, NULL); - - g_return_val_if_fail (icon != NULL, NULL); - - pixbuf = gtk_icon_theme_load_icon (theme, icon, size, 0, NULL); - g_free (icon); - - return pixbuf; -#endif - return NULL; -} - -gchar * -egg_recent_util_get_unique_id (void) -{ - char hostname[EGG_RECENT_UTIL_HOSTNAME_SIZE]; - time_t the_time; - guint32 rand; - int pid; - -#ifndef G_OS_WIN32 - gethostname (hostname, EGG_RECENT_UTIL_HOSTNAME_SIZE); -#else - { - DWORD size = EGG_RECENT_UTIL_HOSTNAME_SIZE; - GetComputerName (hostname, &size); - } -#endif - - 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/cut-n-paste/recent-files/egg-recent-util.h b/cut-n-paste/recent-files/egg-recent-util.h deleted file mode 100644 index 82c4a71..0000000 --- a/cut-n-paste/recent-files/egg-recent-util.h +++ /dev/null @@ -1,18 +0,0 @@ - -#ifndef __EGG_RECENT_UTIL__ -#define __EGG_RECENT_UTIL__ - -#include - -G_BEGIN_DECLS - -gchar * egg_recent_util_escape_underlines (const gchar *uri); -gchar * egg_recent_util_get_unique_id (void); -GdkPixbuf * egg_recent_util_get_icon (GtkIconTheme *theme, - const gchar *uri, - const gchar *mime_type, - int size); - -G_END_DECLS - -#endif /* __EGG_RECENT_UTIL__ */ diff --git a/cut-n-paste/recent-files/egg-recent-view-uimanager.c b/cut-n-paste/recent-files/egg-recent-view-uimanager.c deleted file mode 100644 index b8e3d4d..0000000 --- a/cut-n-paste/recent-files/egg-recent-view-uimanager.c +++ /dev/null @@ -1,878 +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) - -#ifndef EGG_COMPILATION -#include -#else -#define _(x) (x) -#define N_(x) (x) -#endif - -#define DEFAULT_LABEL_WIDTH_CHARS 30 - -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; - - gint label_width; -}; - - -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, - PROP_LABEL_WIDTH -}; - -static guint view_signals[LAST_SIGNAL] = { 0 }; - -static void -connect_proxy_cb (GtkActionGroup *action_group, - GtkAction *action, - GtkWidget *proxy, - EggRecentViewUIManager *view) -{ - if (GTK_IS_MENU_ITEM (proxy)) - { - GtkWidget *label; - - label = GTK_BIN (proxy)->child; - - gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END); - gtk_label_set_max_width_chars (GTK_LABEL (label), view->label_width); - } -} - -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); - g_signal_connect (view->action_group, "connect-proxy", - G_CALLBACK (connect_proxy_cb), view); - gtk_ui_manager_insert_action_group (view->uimanager, - view->action_group, -1); - 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); - - if (!tooltip) - tooltip = g_strdup_printf (_("Open ā€œ%sā€"), uri); - - basename = egg_recent_item_get_short_name (item); - 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 -egg_recent_view_uimanager_set_empty_list (EggRecentViewUIManager *view) -{ - gboolean is_embedded; - - 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); - g_signal_connect (view->action_group, "connect-proxy", - G_CALLBACK (connect_proxy_cb), view); - gtk_ui_manager_insert_action_group (view->uimanager, - view->action_group, -1); - g_free (group); - } - - if (view->leading_sep) { - gchar *sep_action = g_strdup_printf ("EggRecentLeadingSeparator%u", - view->merge_id); - gtk_ui_manager_add_ui (view->uimanager, - view->merge_id, - view->path, - sep_action, - EGG_RECENT_SEPARATOR, - GTK_UI_MANAGER_AUTO, - FALSE); - g_free (sep_action); - } - - is_embedded = (view->leading_sep && view->trailing_sep); - - if (is_embedded) { - GtkAction *action; - gchar *name; - - name = g_strdup_printf (EGG_RECENT_NAME_PREFIX "%u-0", view->merge_id); - - action = g_object_new (GTK_TYPE_ACTION, - "name", name, - "label", _("Empty"), - "sensitive", FALSE, - NULL); - - 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); - } - - if (view->trailing_sep) { - gchar *sep_action = g_strdup_printf ("EggRecentTrailingSeparator%u", - view->merge_id); - gtk_ui_manager_add_ui (view->uimanager, - view->merge_id, - view->path, - sep_action, - EGG_RECENT_SEPARATOR, - GTK_UI_MANAGER_AUTO, - FALSE); - g_free (sep_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_set_empty_list (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; - case PROP_LABEL_WIDTH: - egg_recent_view_uimanager_set_label_width (view, g_value_get_int (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; - case PROP_LABEL_WIDTH: - g_value_set_int (value, view->label_width); - 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; - } - - G_OBJECT_CLASS (egg_recent_view_uimanager_parent_class)->finalize (object); -} - -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)); - g_object_class_install_property (object_class, - PROP_LABEL_WIDTH, - g_param_spec_int ("label-width", - "Label Width", - "The desired width of the menu label, in characters", - -1, - G_MAXINT, - DEFAULT_LABEL_WIDTH_CHARS, - 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; - view->label_width = DEFAULT_LABEL_WIDTH_CHARS; -} - -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_label_width (EggRecentViewUIManager *view, - gint chars) -{ - g_return_if_fail (EGG_IS_RECENT_VIEW_UIMANAGER (view)); - view->label_width = chars; -} - -gint -egg_recent_view_uimanager_get_label_width (EggRecentViewUIManager *view) -{ - g_return_val_if_fail (EGG_IS_RECENT_VIEW_UIMANAGER (view), DEFAULT_LABEL_WIDTH_CHARS); - return view->label_width; -} - -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); -} - -GType -egg_recent_view_uimanager_get_type (void) -{ - static GType egg_recent_view_uimanager_type = 0; - - if(!egg_recent_view_uimanager_type) { - 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 - }; - - 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/cut-n-paste/recent-files/egg-recent-view-uimanager.h b/cut-n-paste/recent-files/egg-recent-view-uimanager.h deleted file mode 100644 index 8aed413..0000000 --- a/cut-n-paste/recent-files/egg-recent-view-uimanager.h +++ /dev/null @@ -1,63 +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); -void egg_recent_view_uimanager_set_label_width (EggRecentViewUIManager *view, - gint chars); -gint egg_recent_view_uimanager_get_label_width (EggRecentViewUIManager *view); - -G_END_DECLS - - -#endif /* __EGG_RECENT_VIEW_UIMANAGER_H__ */ diff --git a/cut-n-paste/recent-files/egg-recent-view.c b/cut-n-paste/recent-files/egg-recent-view.c deleted file mode 100644 index 2918de5..0000000 --- a/cut-n-paste/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) - { - 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/cut-n-paste/recent-files/egg-recent-view.h b/cut-n-paste/recent-files/egg-recent-view.h deleted file mode 100644 index 79f0346..0000000 --- a/cut-n-paste/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__ */ -- cgit v0.9.1