+2007-01-03 Jim Evins <evins@snaught.com>
+
+ * 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 <evins@snaught.com>
* configure.in:
src/pixmaps/Makefile
src/stock-pixmaps/Makefile
src/mygal/Makefile
-src/recent-files/Makefile
data/Makefile
data/templates/Makefile
data/pixmaps/Makefile
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
$(GLABELS_LIBS) \
../libglabels/libglabels.la \
mygal/libmygal.la \
- recent-files/librecent.la \
$(LIB_BARCODE_DIR)/libbarcode.la \
$(LIB_IEC16022_DIR)/libiec16022.la
gchar *filename;
GtkWidget *dialog;
gint ret;
- EggRecentModel *recent;
gl_debug (DEBUG_FILE, "START");
gchar *abs_filename;
glLabel *label;
glXMLLabelStatus status;
- EggRecentModel *recent;
gint ret;
GtkWidget *new_window;
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);
glXMLLabelStatus status;
GError *error = NULL;
gchar *filename = NULL;
- EggRecentModel *recent;
gl_debug (DEBUG_FILE, "");
{
gl_debug (DEBUG_FILE, "OK");
- gl_recent_add_uri (filename);
+ gl_recent_add_utf8_filename (filename);
g_free (filename);
gchar *raw_filename, *filename, *full_filename;
GtkWidget *dialog;
glXMLLabelStatus status;
- EggRecentModel *recent;
gboolean *saved_flag;
gboolean cancel_flag = FALSE;
*saved_flag = TRUE;
- gl_recent_add_uri (filename);
+ gl_recent_add_utf8_filename (filename);
if (save_path != NULL)
g_free (save_path);
+++ /dev/null
-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)
-
+++ /dev/null
-/* -*- 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 <jwillcox@cs.indiana.edu>
- */
-
-
-#include <stdio.h>
-#include <string.h>
-#include <glib.h>
-#include <libgnomevfs/gnome-vfs.h>
-#include <libgnomevfs/gnome-vfs-mime-utils.h>
-#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;
-}
+++ /dev/null
-
-#ifndef __EGG_RECENT_ITEM_H__
-#define __EGG_RECENT_ITEM_H__
-
-#include <time.h>
-#include <glib.h>
-#include <glib-object.h>
-
-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__ */
+++ /dev/null
-/* -*- 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 <jwillcox@cs.indiana.edu>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/time.h>
-#include <time.h>
-#include <gtk/gtk.h>
-#include <libgnomevfs/gnome-vfs.h>
-#include <libgnomevfs/gnome-vfs-mime-utils.h>
-#include <gconf/gconf-client.h>
-#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 ("<?xml version=\"1.0\"?>\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</" TAG_URI ">\n", escaped_uri);
-
- if (mime_type)
- g_string_append_printf (string,
- " <" TAG_MIME_TYPE ">%s</" TAG_MIME_TYPE ">\n", mime_type);
- else
- g_string_append_printf (string,
- " <" TAG_MIME_TYPE "></" TAG_MIME_TYPE ">\n");
-
-
- g_string_append_printf (string,
- " <" TAG_TIMESTAMP ">%d</" TAG_TIMESTAMP ">\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</" TAG_GROUP ">\n",
- escaped_group);
-
- g_free (escaped_group);
-
- groups = groups->next;
- }
-
- string = g_string_append (string, " </" TAG_GROUPS ">\n");
-
- string = g_string_append (string,
- " </" TAG_RECENT_ITEM ">\n");
-
- g_free (mime_type);
- g_free (escaped_uri);
-
- list = list->next;
- i++;
- }
-
- string = g_string_append (string, "</" TAG_RECENT_FILES ">");
-
- 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;
-}
-
+++ /dev/null
-/* 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__ */
+++ /dev/null
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gtk/gtk.h>
-#include <time.h>
-#include <unistd.h>
-#include <sys/types.h>
-#ifndef USE_STABLE_LIBGNOMEUI
-#include <libgnomeui/gnome-icon-theme.h>
-#include <libgnomeui/gnome-icon-lookup.h>
-#endif
-#include <math.h>
-#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);
-}
+++ /dev/null
-
-#ifndef __EGG_RECENT_UTIL__
-#define __EGG_RECENT_UTIL__
-
-#include <gtk/gtk.h>
-#ifndef USE_STABLE_LIBGNOMEUI
-#include <libgnomeui/gnome-icon-theme.h>
-#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__ */
+++ /dev/null
-/* -*- 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 <jwillcox@cs.indiana.edu>
- * Paolo Bacchilega <paobac@cvs.gnome.org>
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <gtk/gtk.h>
-#include <libgnomevfs/gnome-vfs.h>
-#ifndef USE_STABLE_LIBGNOMEUI
-#include <libgnomeui/gnome-icon-theme.h>
-#endif
-#include <gconf/gconf-client.h>
-#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");
-}
+++ /dev/null
-/* 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 <gtk/gtk.h>
-#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__ */
+++ /dev/null
-/* -*- 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 <jwillcox@cs.indiana.edu>
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <gtk/gtk.h>
-#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);
-}
+++ /dev/null
-#ifndef __EGG_RECENT_VIEW_H__
-#define __EGG_RECENT_VIEW_H__
-
-
-#include <gdk/gdk.h>
-#include <gtk/gtkwidget.h>
-#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__ */
+++ /dev/null
-#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"
+++ /dev/null
-#!/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
+/* -*- 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 <evins@snaught.com>.
+ * Copyright (C) 2001-2006 Jim Evins <evins@snaught.com>.
*
* 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
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+
#include <config.h>
#include "recent.h"
#include <string.h>
+#include <gtk/gtkrecentchoosermenu.h>
#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;
}
+/* -*- 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 <evins@snaught.com>.
+ * Copyright (C) 2001-2006 Jim Evins <evins@snaught.com>.
*
* 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
* 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 <gtk/gtkrecentmanager.h>
+#include <gtk/gtkwidget.h>
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
#include <gtk/gtkaboutdialog.h>
#include <libgnome/gnome-help.h>
#include <libgnome/gnome-url.h>
-#include "recent-files/egg-recent-view.h"
-#include "recent-files/egg-recent-view-uimanager.h"
#include "view.h"
#include "file.h"
/** 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");
}
#define __COMMANDS_H__
#include <gtk/gtkaction.h>
+#include <gtk/gtkrecentchooser.h>
#include <gtk/gtktoggleaction.h>
#include "window.h"
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);
#include <glib/gi18n.h>
#include <gconf/gconf-client.h>
-#include "recent-files/egg-recent-view.h"
-#include "recent-files/egg-recent-view-uimanager.h"
+#include <gtk/gtkrecentchoosermenu.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkstock.h>
+#include <gtk/gtktoolbar.h>
+#include <gtk/gtkstatusbar.h>
#include <string.h>
#include "ui-util.h"
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);
/* 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") },
" <menu action='FileMenu'>"
" <menuitem action='FileNew' />"
" <menuitem action='FileOpen' />"
-" <menu action='FileRecentsMenu'>"
-" <placeholder name='FileRecentsPlaceHolder' />"
-" </menu>"
+" <menuitem action='FileRecentsMenu' />"
" <separator />"
" <menuitem action='FileSave' />"
" <menuitem action='FileSaveAs' />"
GtkUIManager *ui;
GtkActionGroup *actions;
GError *error = NULL;
- EggRecentViewUIManager *recent_view;
+ GtkWidget *recent_menu;
gl_debug (DEBUG_UI, "START");
/* 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);
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");
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;
-}
-
-