summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormaciag.artur <maciag.artur@0805d722-a2c2-11dd-9b86-41075523de00>2008-11-02 00:06:34 +0000
committermaciag.artur <maciag.artur@0805d722-a2c2-11dd-9b86-41075523de00>2008-11-02 00:06:34 +0000
commitd81016d4baa9d5ce8d5ab5f050abb83edbc3dfa7 (patch)
treead1f0c2502e499d46b457bd90419ccf86db34b2a
parentgit-svn-id: http://piczu-overlay.googlecode.com/svn/trunk@8 0805d722-a2c2-11d... (diff)
downloadpiczu-d81016d4baa9d5ce8d5ab5f050abb83edbc3dfa7.tar.gz
piczu-d81016d4baa9d5ce8d5ab5f050abb83edbc3dfa7.tar.bz2
piczu-d81016d4baa9d5ce8d5ab5f050abb83edbc3dfa7.zip
gnome-main-menu and depends
git-svn-id: http://piczu-overlay.googlecode.com/svn/trunk@9 0805d722-a2c2-11dd-9b86-41075523de00
-rw-r--r--gnome-base/gnome-desktop/Manifest15
-rw-r--r--gnome-base/gnome-desktop/files/digest-gnome-desktop-2.18.1-r13
-rw-r--r--gnome-base/gnome-desktop/files/digest-gnome-desktop-2.18.33
-rw-r--r--gnome-base/gnome-desktop/files/digest-gnome-desktop-2.20.03
-rw-r--r--gnome-base/gnome-desktop/files/digest-gnome-desktop-2.20.23
-rw-r--r--gnome-base/gnome-desktop/files/gnome-desktop-recently-used-apps.patch2701
-rw-r--r--gnome-base/gnome-desktop/gnome-desktop-2.18.1-r1.ebuild48
-rw-r--r--gnome-base/gnome-desktop/gnome-desktop-2.18.3.ebuild51
-rw-r--r--gnome-base/gnome-desktop/gnome-desktop-2.20.0.ebuild52
-rw-r--r--gnome-base/gnome-desktop/gnome-desktop-2.20.2.ebuild52
-rw-r--r--gnome-base/gnome-desktop/gnome-desktop-2.24.1.ebuild45
-rw-r--r--gnome-base/gnome-main-menu/Manifest12
-rw-r--r--gnome-base/gnome-main-menu/files/01-gnome-main-menu-autogen-noconfigure.patch9
-rw-r--r--gnome-base/gnome-main-menu/files/02-configure.in-remove-gtk-doc.patch11
-rw-r--r--gnome-base/gnome-main-menu/files/03-tracker-search.patch13
-rw-r--r--gnome-base/gnome-main-menu/files/04-disable-search.patch13
-rw-r--r--gnome-base/gnome-main-menu/files/digest-gnome-main-menu-99990
-rw-r--r--gnome-base/gnome-main-menu/files/gnome-main-menu-gentooifications.patch30
-rw-r--r--gnome-base/gnome-main-menu/files/gnome-main-menu-shutdown-add.patch29
-rw-r--r--gnome-base/gnome-main-menu/files/gnome-session-shutdown.desktop11
-rw-r--r--gnome-base/gnome-main-menu/gnome-main-menu-0.9.10.ebuild64
-rw-r--r--gnome-base/gnome-main-menu/gnome-main-menu-9999.ebuild83
-rw-r--r--gnome-base/gnome-mount/Manifest2
-rw-r--r--gnome-base/gnome-mount/gnome-mount-0.8.ebuild36
-rw-r--r--gnome-base/gnome-panel/Manifest20
-rw-r--r--gnome-base/gnome-panel/files/digest-gnome-panel-2.18.13
-rw-r--r--gnome-base/gnome-panel/files/digest-gnome-panel-2.18.1-r13
-rw-r--r--gnome-base/gnome-panel/files/digest-gnome-panel-2.18.33
-rw-r--r--gnome-base/gnome-panel/files/digest-gnome-panel-2.20.0.13
-rw-r--r--gnome-base/gnome-panel/files/digest-gnome-panel-2.20.23
-rw-r--r--gnome-base/gnome-panel/files/gnome-panel-alt-f1-slab.patch47
-rw-r--r--gnome-base/gnome-panel/files/gnome-panel-recently-used-apps.patch196
-rw-r--r--gnome-base/gnome-panel/gnome-panel-2.18.1-r1.ebuild72
-rw-r--r--gnome-base/gnome-panel/gnome-panel-2.18.3.ebuild72
-rw-r--r--gnome-base/gnome-panel/gnome-panel-2.20.0.1.ebuild74
-rw-r--r--gnome-base/gnome-panel/gnome-panel-2.20.2-r1.ebuild75
-rw-r--r--gnome-base/gnome-panel/gnome-panel-2.20.2.ebuild73
-rw-r--r--gnome-base/gnome-panel/gnome-panel-2.22.2.ebuild80
-rw-r--r--gnome-base/gnome-panel/gnome-panel-2.24.1.ebuild83
39 files changed, 4096 insertions, 0 deletions
diff --git a/gnome-base/gnome-desktop/Manifest b/gnome-base/gnome-desktop/Manifest
new file mode 100644
index 0000000..421f41e
--- /dev/null
+++ b/gnome-base/gnome-desktop/Manifest
@@ -0,0 +1,15 @@
+AUX gnome-desktop-recently-used-apps.patch 64868 RMD160 02231803ef31044d88cd808bc61007c9195870ec SHA1 a2b7103ad56a584a1faa7d247ea2cd0dc201a4c8 SHA256 7f35d6549a3b1b48cac1223d76d4ef508e5f0e9dba7bc6ebe8c035f7d1c89885
+DIST gnome-desktop-2.18.1.tar.bz2 1265304 RMD160 f521135c8c60ab27febcb50daaaaed932ace9de1 SHA1 9a707f0ac97103e5464cb03fe14429754778563f SHA256 6c3ccd1804ca7d7119e3e16220bc6b4081b12e09808bbe642db402f2a45cd642
+DIST gnome-desktop-2.18.3.tar.bz2 1306654 RMD160 fb3cc9047ab4678607e9cae6cc18f0803b03ace3 SHA1 e466fb1619423d185772d0052562a2e66dc2e01e SHA256 8997a2ceca2dbb28fb402e23ea5f255b68c59ea4f932b253e2843bfe62af7c64
+DIST gnome-desktop-2.20.0.tar.bz2 1353685 RMD160 74cf96610e6fe81a964cc1487f26d2a5babf7600 SHA1 6bfb7a44d324f0d2a10d5185770e43bbc2378fc8 SHA256 363ecfe56738d840dcfa1333dc8401e63a253a21031b673ebd3df6ac722d58bf
+DIST gnome-desktop-2.20.2.tar.bz2 1367184 RMD160 a2458129cb68f8d0c5f6f88894b98415d5d44719 SHA1 064751161705aa61fc456ed3ffadaa366dba3e9d SHA256 b9788e08b8a5be8305cb2ab5583497720e24f4f9d011561af6de75b6f6c68709
+DIST gnome-desktop-2.24.1.tar.bz2 1508429 RMD160 980538be5fb4ebeff0e66a89dc2a051f679b86af SHA1 d4b396df792c5bd1b496ff3e89949b1d4d2d048e SHA256 ec7beb0886dfaeebb506b2f0e6e255b4254b3ca812ab6f69a6cafb3d9e492a40
+EBUILD gnome-desktop-2.18.1-r1.ebuild 1355 RMD160 f9eba119a1a30918a9b725117e003d666be48c2f SHA1 ab7024b74aec2a81353bae192df44860d821a151 SHA256 b598b69331562442b7b3278e57dc6408e407039831833cf5976cdda097f8ad34
+EBUILD gnome-desktop-2.18.3.ebuild 1420 RMD160 533405c0fd685efefd66389e20f9ab6b1af96fa4 SHA1 ad587b992d0c10f707cd7bdbb61f425968e2e139 SHA256 f3bb95a681596244a236c325e5aed226d40ff9e34d3d45fa4be9ecdfe205373f
+EBUILD gnome-desktop-2.20.0.ebuild 1334 RMD160 939a4c1b44cd05cc9e892e5496b8e3ac76eb6aa1 SHA1 8605ca2fbf0f080763b3e18f85358023c9f919f6 SHA256 3335c34046e893e9ac52c26bf3156ee461dd7911ac287a1ba5ba79a6ab344edb
+EBUILD gnome-desktop-2.20.2.ebuild 1336 RMD160 127d3b893ae5d6acd8066d756a7e8650d0f3ec5d SHA1 b9ee149a5f14d26f288bb5f04506397d03f7c40f SHA256 60f27ec50a79366c979af08476d1c737d2ea373252dcaa43809ecf9d1e44932b
+EBUILD gnome-desktop-2.24.1.ebuild 1119 RMD160 07bc34dc97aed8d5af06bade06178c676a6c05a3 SHA1 76b5538a532e37328557c83218657170051f885b SHA256 e32cdcb7bb8c3ca4245d541bbc72dead8a28e64a67804f9fcfeb181ae59d6f38
+MISC gnome-desktop-2.18.3.ebuild~ 1422 RMD160 0bca443d4d164fcd0896b20dd8730f6b9c2f8d77 SHA1 682adb3038d2fec048bf0be9d6f4d399e80b68b4 SHA256 7b1dd73109e0964e001e9198930a6a49987406c382bfc99c5d05ed98c36f2ebc
+MISC gnome-desktop-2.20.0.ebuild~ 1250 RMD160 fdc2eba5a0191626e1a4784dbefa467c53ce9324 SHA1 ef3691bc36351d0a1cc5064622b1e9b6652d7289 SHA256 ddea26969d04849253b9a8a621228cbf23fe1a16305dcea515429b09449535bc
+MISC gnome-desktop-2.20.2.ebuild~ 1334 RMD160 939a4c1b44cd05cc9e892e5496b8e3ac76eb6aa1 SHA1 8605ca2fbf0f080763b3e18f85358023c9f919f6 SHA256 3335c34046e893e9ac52c26bf3156ee461dd7911ac287a1ba5ba79a6ab344edb
+MISC gnome-desktop-2.24.1.ebuild~ 1197 RMD160 ff1ca1568ccd46cdc3405dc14623b553b7b4fbfc SHA1 af302aafced42b66fccd53e2ef2caf9571d9aa66 SHA256 c1a11a97920a5dd43f5675cd3667f242fa0fc26f37a5b58c2b73675ab93716f8
diff --git a/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.18.1-r1 b/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.18.1-r1
new file mode 100644
index 0000000..36759cf
--- /dev/null
+++ b/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.18.1-r1
@@ -0,0 +1,3 @@
+MD5 a40df2ac6e73e38451f031ac99e9eb6e gnome-desktop-2.18.1.tar.bz2 1265304
+RMD160 f521135c8c60ab27febcb50daaaaed932ace9de1 gnome-desktop-2.18.1.tar.bz2 1265304
+SHA256 6c3ccd1804ca7d7119e3e16220bc6b4081b12e09808bbe642db402f2a45cd642 gnome-desktop-2.18.1.tar.bz2 1265304
diff --git a/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.18.3 b/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.18.3
new file mode 100644
index 0000000..03046f1
--- /dev/null
+++ b/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.18.3
@@ -0,0 +1,3 @@
+MD5 98de3b7d0da690da8b94cddc74f3914b gnome-desktop-2.18.3.tar.bz2 1306654
+RMD160 fb3cc9047ab4678607e9cae6cc18f0803b03ace3 gnome-desktop-2.18.3.tar.bz2 1306654
+SHA256 8997a2ceca2dbb28fb402e23ea5f255b68c59ea4f932b253e2843bfe62af7c64 gnome-desktop-2.18.3.tar.bz2 1306654
diff --git a/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.20.0 b/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.20.0
new file mode 100644
index 0000000..ccc98d2
--- /dev/null
+++ b/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.20.0
@@ -0,0 +1,3 @@
+MD5 530244e27a4a2426f833561c4b573a42 gnome-desktop-2.20.0.tar.bz2 1353685
+RMD160 74cf96610e6fe81a964cc1487f26d2a5babf7600 gnome-desktop-2.20.0.tar.bz2 1353685
+SHA256 363ecfe56738d840dcfa1333dc8401e63a253a21031b673ebd3df6ac722d58bf gnome-desktop-2.20.0.tar.bz2 1353685
diff --git a/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.20.2 b/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.20.2
new file mode 100644
index 0000000..3166a43
--- /dev/null
+++ b/gnome-base/gnome-desktop/files/digest-gnome-desktop-2.20.2
@@ -0,0 +1,3 @@
+MD5 fa6bfd95606a34fb381a233082ddd5ac gnome-desktop-2.20.2.tar.bz2 1367184
+RMD160 a2458129cb68f8d0c5f6f88894b98415d5d44719 gnome-desktop-2.20.2.tar.bz2 1367184
+SHA256 b9788e08b8a5be8305cb2ab5583497720e24f4f9d011561af6de75b6f6c68709 gnome-desktop-2.20.2.tar.bz2 1367184
diff --git a/gnome-base/gnome-desktop/files/gnome-desktop-recently-used-apps.patch b/gnome-base/gnome-desktop/files/gnome-desktop-recently-used-apps.patch
new file mode 100644
index 0000000..23d3881
--- /dev/null
+++ b/gnome-base/gnome-desktop/files/gnome-desktop-recently-used-apps.patch
@@ -0,0 +1,2701 @@
+diff -uprN gnome-desktop-2.16.1-pristine/libgnome-desktop/Makefile.am gnome-desktop-2.16.1/libgnome-desktop/Makefile.am
+--- gnome-desktop-2.16.1-pristine/libgnome-desktop/Makefile.am 2006-06-04 07:53:09.000000000 -0400
++++ gnome-desktop-2.16.1/libgnome-desktop/Makefile.am 2006-10-23 16:19:45.000000000 -0400
+@@ -17,9 +17,13 @@ lib_LTLIBRARIES = libgnome-desktop-2.la
+
+ noinst_PROGRAMS = test-ditem test-hint test-ditem-edit
+
+-libgnome_desktop_2_la_SOURCES = \
+- gnome-desktop-item.c \
+- gnome-ditem-edit.c \
++libgnome_desktop_2_la_SOURCES = \
++ gnome-desktop-item.c \
++ gnome-ditem-edit.c \
++ egg-recent-item.h \
++ egg-recent-item.c \
++ egg-recent-model.h \
++ egg-recent-model.c \
+ gnome-hint.c
+
+ libgnome_desktop_2_la_LIBADD = \
+diff -uprN gnome-desktop-2.16.1-pristine/libgnome-desktop/egg-recent-item.c gnome-desktop-2.16.1/libgnome-desktop/egg-recent-item.c
+--- gnome-desktop-2.16.1-pristine/libgnome-desktop/egg-recent-item.c 1969-12-31 19:00:00.000000000 -0500
++++ gnome-desktop-2.16.1/libgnome-desktop/egg-recent-item.c 2006-10-23 16:19:45.000000000 -0400
+@@ -0,0 +1,426 @@
++/* -*- 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 void
++egg_recent_item_update_mime_type (EggRecentItem *item)
++{
++ if (!item->mime_type_is_explicit) {
++ g_free (item->mime_type);
++ item->mime_type = NULL;
++
++ if (item->uri)
++ item->mime_type = gnome_vfs_get_mime_type (item->uri);
++
++ if (!item->mime_type)
++ item->mime_type = g_strdup (GNOME_VFS_MIME_TYPE_UNKNOWN);
++ }
++}
++
++gboolean
++egg_recent_item_set_uri (EggRecentItem *item, const gchar *uri)
++{
++ gchar *utf8_uri;
++
++ /* if G_BROKEN_FILENAMES is not set, this should succede */
++ if (g_utf8_validate (uri, -1, NULL)) {
++ item->uri = gnome_vfs_make_uri_from_input (uri);
++ } else {
++ utf8_uri = g_filename_to_utf8 (uri, -1, NULL, NULL, NULL);
++
++ if (utf8_uri == NULL) {
++ g_warning ("Couldn't convert URI to UTF-8");
++ return FALSE;
++ }
++
++ if (g_utf8_validate (utf8_uri, -1, NULL)) {
++ item->uri = gnome_vfs_make_uri_from_input (utf8_uri);
++ } else {
++ g_free (utf8_uri);
++ return FALSE;
++ }
++
++ g_free (utf8_uri);
++ }
++
++ return TRUE;
++}
++
++gchar *
++egg_recent_item_get_uri (const EggRecentItem *item)
++{
++ return g_strdup (item->uri);
++}
++
++G_CONST_RETURN gchar *
++egg_recent_item_peek_uri (const EggRecentItem *item)
++{
++ return item->uri;
++}
++
++gchar *
++egg_recent_item_get_uri_utf8 (const EggRecentItem *item)
++{
++ /* this could fail, but it's not likely, since we've already done it
++ * once in set_uri()
++ */
++ return g_filename_to_utf8 (item->uri, -1, NULL, NULL, NULL);
++}
++
++gchar *
++egg_recent_item_get_uri_for_display (const EggRecentItem *item)
++{
++ return gnome_vfs_format_uri_for_display (item->uri);
++}
++
++/* Stolen from gnome_vfs_make_valid_utf8() */
++static char *
++make_valid_utf8 (const char *name)
++{
++ GString *string;
++ const char *remainder, *invalid;
++ int remaining_bytes, valid_bytes;
++
++ string = NULL;
++ remainder = name;
++ remaining_bytes = name ? strlen (name) : 0;
++
++ while (remaining_bytes != 0) {
++ if (g_utf8_validate (remainder, remaining_bytes, &invalid))
++ break;
++
++ valid_bytes = invalid - remainder;
++
++ if (string == NULL)
++ string = g_string_sized_new (remaining_bytes);
++
++ g_string_append_len (string, remainder, valid_bytes);
++ g_string_append_c (string, '?');
++
++ remaining_bytes -= valid_bytes + 1;
++ remainder = invalid + 1;
++ }
++
++ if (string == NULL)
++ return g_strdup (name);
++
++ g_string_append (string, remainder);
++/* g_string_append (string, _(" (invalid file name)")); */
++ g_assert (g_utf8_validate (string->str, -1, NULL));
++
++ return g_string_free (string, FALSE);
++}
++
++static gchar *
++get_uri_shortname_for_display (GnomeVFSURI *uri)
++{
++ gchar *name;
++ gboolean validated;
++
++ validated = FALSE;
++ name = gnome_vfs_uri_extract_short_name (uri);
++
++ if (name == NULL)
++ {
++ name = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_PASSWORD);
++ }
++ else if (g_ascii_strcasecmp (uri->method_string, "file") == 0)
++ {
++ gchar *text_uri;
++ gchar *local_file;
++ text_uri = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_PASSWORD);
++ local_file = gnome_vfs_get_local_path_from_uri (text_uri);
++
++ if (local_file != NULL)
++ {
++ g_free (name);
++ name = g_filename_display_basename (local_file);
++ validated = TRUE;
++ }
++
++ g_free (local_file);
++ g_free (text_uri);
++ }
++ else if (!gnome_vfs_uri_has_parent (uri))
++ {
++ const gchar *method;
++
++ method = uri->method_string;
++
++ if (name == NULL ||
++ strcmp (name, GNOME_VFS_URI_PATH_STR) == 0)
++ {
++ g_free (name);
++ name = g_strdup (method);
++ }
++ else
++ {
++ gchar *tmp;
++
++ tmp = name;
++ name = g_strdup_printf ("%s: %s", method, name);
++ g_free (tmp);
++ }
++ }
++
++ if (!validated && !g_utf8_validate (name, -1, NULL))
++ {
++ gchar *utf8_name;
++
++ utf8_name = make_valid_utf8 (name);
++ g_free (name);
++ name = utf8_name;
++ }
++
++ return name;
++}
++
++/**
++ * egg_recent_item_get_short_name:
++ * @item: an #EggRecentItem
++ *
++ * Computes a valid UTF-8 string that can be used as the name of the item in a
++ * menu or list. For example, calling this function on an item that refers to
++ * "file:///foo/bar.txt" will yield "bar.txt".
++ *
++ * Return value: A newly-allocated string in UTF-8 encoding; free it with
++ * g_free().
++ **/
++gchar *
++egg_recent_item_get_short_name (const EggRecentItem *item)
++{
++ GnomeVFSURI *uri;
++ gchar *short_name;
++
++ g_return_val_if_fail (item != NULL, NULL);
++
++ if (item->uri == NULL)
++ return NULL;
++
++ uri = gnome_vfs_uri_new (item->uri);
++ if (uri == NULL)
++ return NULL;
++
++ short_name = get_uri_shortname_for_display (uri);
++
++ gnome_vfs_uri_unref (uri);
++
++ return short_name;
++}
++
++void
++egg_recent_item_set_mime_type (EggRecentItem *item, const gchar *mime)
++{
++ g_free (item->mime_type);
++ item->mime_type = NULL;
++
++ if (mime && mime[0]) {
++ item->mime_type_is_explicit = TRUE;
++ item->mime_type = g_strdup (mime);
++ } else {
++ item->mime_type_is_explicit = FALSE;
++ }
++}
++
++gchar *
++egg_recent_item_get_mime_type (EggRecentItem *item)
++{
++ egg_recent_item_update_mime_type (item);
++
++ return g_strdup (item->mime_type);
++}
++
++void
++egg_recent_item_set_timestamp (EggRecentItem *item, time_t timestamp)
++{
++ if (timestamp == (time_t) -1)
++ time (&timestamp);
++
++ item->timestamp = timestamp;
++}
++
++time_t
++egg_recent_item_get_timestamp (const EggRecentItem *item)
++{
++ return item->timestamp;
++}
++
++G_CONST_RETURN GList *
++egg_recent_item_get_groups (const EggRecentItem *item)
++{
++ return item->groups;
++}
++
++gboolean
++egg_recent_item_in_group (const EggRecentItem *item, const gchar *group_name)
++{
++ GList *tmp;
++
++ tmp = item->groups;
++ while (tmp != NULL) {
++ gchar *val = (gchar *)tmp->data;
++
++ if (strcmp (group_name, val) == 0)
++ return TRUE;
++
++ tmp = tmp->next;
++ }
++
++ return FALSE;
++}
++
++void
++egg_recent_item_add_group (EggRecentItem *item, const gchar *group_name)
++{
++ g_return_if_fail (group_name != NULL);
++
++ if (!egg_recent_item_in_group (item, group_name))
++ item->groups = g_list_append (item->groups, g_strdup (group_name));
++}
++
++void
++egg_recent_item_remove_group (EggRecentItem *item, const gchar *group_name)
++{
++ GList *tmp;
++
++ g_return_if_fail (group_name != NULL);
++
++ tmp = item->groups;
++ while (tmp != NULL) {
++ gchar *val = (gchar *)tmp->data;
++
++ if (strcmp (group_name, val) == 0) {
++ item->groups = g_list_remove (item->groups,
++ val);
++ g_free (val);
++ break;
++ }
++
++ tmp = tmp->next;
++ }
++}
++
++void
++egg_recent_item_set_private (EggRecentItem *item, gboolean priv)
++{
++ item->private_data = priv;
++}
++
++gboolean
++egg_recent_item_get_private (const EggRecentItem *item)
++{
++ return item->private_data;
++}
++
++GType
++egg_recent_item_get_type (void)
++{
++ static GType boxed_type = 0;
++
++ if (!boxed_type) {
++ boxed_type = g_boxed_type_register_static ("EggRecentItem",
++ (GBoxedCopyFunc)egg_recent_item_ref,
++ (GBoxedFreeFunc)egg_recent_item_unref);
++ }
++
++ return boxed_type;
++}
+diff -uprN gnome-desktop-2.16.1-pristine/libgnome-desktop/egg-recent-item.h gnome-desktop-2.16.1/libgnome-desktop/egg-recent-item.h
+--- gnome-desktop-2.16.1-pristine/libgnome-desktop/egg-recent-item.h 1969-12-31 19:00:00.000000000 -0500
++++ gnome-desktop-2.16.1/libgnome-desktop/egg-recent-item.h 2006-10-23 16:19:45.000000000 -0400
+@@ -0,0 +1,80 @@
++
++#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__ */
+diff -uprN gnome-desktop-2.16.1-pristine/libgnome-desktop/egg-recent-model.c gnome-desktop-2.16.1/libgnome-desktop/egg-recent-model.c
+--- gnome-desktop-2.16.1-pristine/libgnome-desktop/egg-recent-model.c 1969-12-31 19:00:00.000000000 -0500
++++ gnome-desktop-2.16.1/libgnome-desktop/egg-recent-model.c 2006-10-23 16:19:45.000000000 -0400
+@@ -0,0 +1,1965 @@
++/* -*- 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 <sys/stat.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>
++
++#define EGG_ENABLE_RECENT_FILES
++#include "egg-recent-model.h"
++#include "egg-recent-item.h"
++
++#define EGG_RECENT_MODEL_FILE_PATH "/.recently-used"
++#define EGG_RECENT_MODEL_BUFFER_SIZE 8192
++
++#define EGG_RECENT_MODEL_MAX_ITEMS 500
++#define EGG_RECENT_MODEL_DEFAULT_LIMIT 10
++#define EGG_RECENT_MODEL_TIMEOUT_LENGTH 200
++#define EGG_RECENT_MODEL_POLL_TIME 3
++
++/* needed for Darwin */
++#if !HAVE_DECL_LOCKF
++int lockf (int filedes, int function, off_t size);
++#endif
++
++#define EGG_RECENT_MODEL_KEY_DIR "/desktop/gnome/recent_files"
++#define EGG_RECENT_MODEL_DEFAULT_LIMIT_KEY EGG_RECENT_MODEL_KEY_DIR "/default_limit"
++#define EGG_RECENT_MODEL_EXPIRE_KEY EGG_RECENT_MODEL_KEY_DIR "/expire"
++
++struct _EggRecentModelPrivate {
++ GSList *mime_filter_values; /* list of mime types we allow */
++ GSList *group_filter_values; /* list of groups we allow */
++ GSList *scheme_filter_values; /* list of URI schemes we allow */
++
++ EggRecentModelSort sort_type; /* type of sorting to be done */
++
++ int limit; /* soft limit for length of the list */
++ int expire_days; /* number of days to hold an item */
++
++ char *path; /* path to the file we store stuff in */
++
++ GHashTable *monitors;
++
++ GnomeVFSMonitorHandle *monitor;
++
++ GConfClient *client;
++ gboolean use_default_limit;
++
++ guint limit_change_notify_id;
++ guint expiration_change_notify_id;
++
++ guint changed_timeout;
++ guint poll_timeout;
++ time_t last_mtime;
++};
++
++/* signals */
++enum {
++ CHANGED,
++ LAST_SIGNAL
++};
++
++static GType model_signals[LAST_SIGNAL] = { 0 };
++
++/* properties */
++enum {
++ PROP_BOGUS,
++ PROP_MIME_FILTERS,
++ PROP_GROUP_FILTERS,
++ PROP_SCHEME_FILTERS,
++ PROP_SORT_TYPE,
++ PROP_LIMIT
++};
++
++typedef struct {
++ GSList *states;
++ GList *items;
++ EggRecentItem *current_item;
++} ParseInfo;
++
++typedef enum {
++ STATE_START,
++ STATE_RECENT_FILES,
++ STATE_RECENT_ITEM,
++ STATE_URI,
++ STATE_MIME_TYPE,
++ STATE_TIMESTAMP,
++ STATE_PRIVATE,
++ STATE_GROUPS,
++ STATE_GROUP
++} ParseState;
++
++typedef struct {
++ EggRecentModel *model;
++ GList *list;
++} ChangedData;
++
++#define TAG_RECENT_FILES "RecentFiles"
++#define TAG_RECENT_ITEM "RecentItem"
++#define TAG_URI "URI"
++#define TAG_MIME_TYPE "Mime-Type"
++#define TAG_TIMESTAMP "Timestamp"
++#define TAG_PRIVATE "Private"
++#define TAG_GROUPS "Groups"
++#define TAG_GROUP "Group"
++
++static void start_element_handler (GMarkupParseContext *context,
++ const gchar *element_name,
++ const gchar **attribute_names,
++ const gchar **attribute_values,
++ gpointer user_data,
++ GError **error);
++
++static void end_element_handler (GMarkupParseContext *context,
++ const gchar *element_name,
++ gpointer user_data,
++ GError **error);
++
++static void text_handler (GMarkupParseContext *context,
++ const gchar *text,
++ gsize text_len,
++ gpointer user_data,
++ GError **error);
++
++static void error_handler (GMarkupParseContext *context,
++ GError *error,
++ gpointer user_data);
++
++static GMarkupParser parser = {start_element_handler, end_element_handler,
++ text_handler,
++ NULL,
++ error_handler};
++
++static GObjectClass *parent_class;
++
++static void egg_recent_model_clear_mime_filter (EggRecentModel *model);
++static void egg_recent_model_clear_group_filter (EggRecentModel *model);
++static void egg_recent_model_clear_scheme_filter (EggRecentModel *model);
++
++static GObjectClass *parent_class;
++
++static gboolean
++egg_recent_model_string_match (const GSList *list, const gchar *str)
++{
++ const GSList *tmp;
++
++ if (list == NULL || str == NULL)
++ return TRUE;
++
++ tmp = list;
++
++ while (tmp) {
++ if (g_pattern_match_string (tmp->data, str))
++ return TRUE;
++
++ tmp = tmp->next;
++ }
++
++ return FALSE;
++}
++
++static gboolean
++egg_recent_model_write_raw (EggRecentModel *model, FILE *file,
++ const gchar *content)
++{
++ int len;
++ int fd;
++ struct stat sbuf;
++
++ rewind (file);
++
++ len = strlen (content);
++ fd = fileno (file);
++
++ if (fstat (fd, &sbuf) < 0)
++ g_warning ("Couldn't stat XML document.");
++
++ if ((off_t)len < sbuf.st_size) {
++ ftruncate (fd, len);
++ }
++
++ if (fputs (content, file) == EOF)
++ return FALSE;
++
++#ifndef G_OS_WIN32
++ fsync (fd);
++#endif
++ rewind (file);
++
++ return TRUE;
++}
++
++static GList *
++egg_recent_model_delete_from_list (GList *list,
++ const gchar *uri)
++{
++ GList *tmp;
++
++ if (!uri)
++ return list;
++
++ tmp = list;
++
++ while (tmp) {
++ EggRecentItem *item = tmp->data;
++ GList *next;
++
++ next = tmp->next;
++
++ if (!strcmp (egg_recent_item_peek_uri (item), uri)) {
++ egg_recent_item_unref (item);
++
++ list = g_list_remove_link (list, tmp);
++ g_list_free_1 (tmp);
++ }
++
++ tmp = next;
++ }
++
++ return list;
++}
++
++static void
++egg_recent_model_add_new_groups (EggRecentItem *item,
++ EggRecentItem *upd_item)
++{
++ const GList *tmp;
++
++ tmp = egg_recent_item_get_groups (upd_item);
++
++ while (tmp) {
++ char *group = tmp->data;
++
++ if (!egg_recent_item_in_group (item, group))
++ egg_recent_item_add_group (item, group);
++
++ tmp = tmp->next;
++ }
++}
++
++static gboolean
++egg_recent_model_update_item (GList *items, EggRecentItem *upd_item)
++{
++ GList *tmp;
++ const char *uri;
++
++ uri = egg_recent_item_peek_uri (upd_item);
++
++ tmp = items;
++
++ while (tmp) {
++ EggRecentItem *item = tmp->data;
++
++ if (gnome_vfs_uris_match (egg_recent_item_peek_uri (item), uri)) {
++ egg_recent_item_set_timestamp (item, (time_t) -1);
++
++ egg_recent_model_add_new_groups (item, upd_item);
++
++ return TRUE;
++ }
++
++ tmp = tmp->next;
++ }
++
++ return FALSE;
++}
++
++static gchar *
++egg_recent_model_read_raw (EggRecentModel *model, FILE *file)
++{
++ GString *string;
++ char buf[EGG_RECENT_MODEL_BUFFER_SIZE];
++
++ rewind (file);
++
++ string = g_string_new (NULL);
++ while (fgets (buf, EGG_RECENT_MODEL_BUFFER_SIZE, file)) {
++ string = g_string_append (string, buf);
++ }
++
++ rewind (file);
++
++ return g_string_free (string, FALSE);
++}
++
++
++
++static ParseInfo *
++parse_info_init (void)
++{
++ ParseInfo *retval;
++
++ retval = g_new0 (ParseInfo, 1);
++ retval->states = g_slist_prepend (NULL, STATE_START);
++ retval->items = NULL;
++
++ return retval;
++}
++
++static void
++parse_info_free (ParseInfo *info)
++{
++ g_slist_free (info->states);
++ g_free (info);
++}
++
++static void
++push_state (ParseInfo *info,
++ ParseState state)
++{
++ info->states = g_slist_prepend (info->states, GINT_TO_POINTER (state));
++}
++
++static void
++pop_state (ParseInfo *info)
++{
++ g_return_if_fail (info->states != NULL);
++
++ info->states = g_slist_remove (info->states, info->states->data);
++}
++
++static ParseState
++peek_state (ParseInfo *info)
++{
++ g_return_val_if_fail (info->states != NULL, STATE_START);
++
++ return GPOINTER_TO_INT (info->states->data);
++}
++
++#define ELEMENT_IS(name) (strcmp (element_name, (name)) == 0)
++
++static gboolean
++valid_element (ParseInfo *info,
++ int valid_parent_state,
++ const gchar *element_name,
++ const gchar *valid_element,
++ GError **error)
++{
++ if (peek_state (info) != valid_parent_state) {
++ g_set_error (error,
++ G_MARKUP_ERROR,
++ G_MARKUP_ERROR_INVALID_CONTENT,
++ "Unexpected tag '%s', tag '%s' expected",
++ element_name, valid_element);
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
++static void
++start_element_handler (GMarkupParseContext *context,
++ const gchar *element_name,
++ const gchar **attribute_names,
++ const gchar **attribute_values,
++ gpointer user_data,
++ GError **error)
++{
++ ParseInfo *info = (ParseInfo *)user_data;
++
++ if (ELEMENT_IS (TAG_RECENT_FILES))
++ push_state (info, STATE_RECENT_FILES);
++ else if (ELEMENT_IS (TAG_RECENT_ITEM)) {
++ if (valid_element (info, STATE_RECENT_FILES,
++ TAG_RECENT_ITEM, TAG_RECENT_FILES, error)) {
++ info->current_item = egg_recent_item_new ();
++ push_state (info, STATE_RECENT_ITEM);
++ }
++ } else if (ELEMENT_IS (TAG_URI)) {
++ if (valid_element (info, STATE_RECENT_ITEM,
++ TAG_URI, TAG_RECENT_ITEM, error)) {
++ push_state (info, STATE_URI);
++ }
++ } else if (ELEMENT_IS (TAG_MIME_TYPE)) {
++ if (valid_element (info, STATE_RECENT_ITEM,
++ TAG_MIME_TYPE, TAG_RECENT_ITEM, error)) {
++ push_state (info, STATE_MIME_TYPE);
++ }
++ } else if (ELEMENT_IS (TAG_TIMESTAMP)) {
++ if (valid_element (info, STATE_RECENT_ITEM,
++ TAG_TIMESTAMP, TAG_RECENT_ITEM, error)) {
++ push_state (info, STATE_TIMESTAMP);
++ }
++ } else if (ELEMENT_IS (TAG_PRIVATE)) {
++ if (valid_element (info, STATE_RECENT_ITEM,
++ TAG_PRIVATE, TAG_RECENT_ITEM, error)) {
++ push_state (info, STATE_PRIVATE);
++ egg_recent_item_set_private (info->current_item, TRUE);
++ }
++ } else if (ELEMENT_IS (TAG_GROUPS)) {
++ if (valid_element (info, STATE_RECENT_ITEM,
++ TAG_GROUPS, TAG_RECENT_ITEM, error)) {
++ push_state (info, STATE_GROUPS);
++ }
++ } else if (ELEMENT_IS (TAG_GROUP)) {
++ if (valid_element (info, STATE_GROUPS,
++ TAG_GROUP, TAG_GROUPS, error)) {
++ push_state (info, STATE_GROUP);
++ }
++ }
++}
++
++static gint
++list_compare_func_mru (gpointer a, gpointer b)
++{
++ EggRecentItem *item_a = (EggRecentItem *)a;
++ EggRecentItem *item_b = (EggRecentItem *)b;
++
++ return item_a->timestamp < item_b->timestamp;
++}
++
++static gint
++list_compare_func_lru (gpointer a, gpointer b)
++{
++ EggRecentItem *item_a = (EggRecentItem *)a;
++ EggRecentItem *item_b = (EggRecentItem *)b;
++
++ return item_a->timestamp > item_b->timestamp;
++}
++
++
++
++static void
++end_element_handler (GMarkupParseContext *context,
++ const gchar *element_name,
++ gpointer user_data,
++ GError **error)
++{
++ ParseInfo *info = (ParseInfo *)user_data;
++
++ switch (peek_state (info)) {
++ case STATE_RECENT_ITEM:
++ if (!info->current_item) {
++ g_warning ("No recent item found\n");
++ break;
++ }
++
++ if (!info->current_item->uri) {
++ g_warning ("Invalid item found\n");
++ break;
++ }
++
++ info->items = g_list_prepend (info->items,
++ info->current_item);
++ info->current_item = NULL;
++ break;
++ default:
++ break;
++ }
++
++ pop_state (info);
++}
++
++static void
++text_handler (GMarkupParseContext *context,
++ const gchar *text,
++ gsize text_len,
++ gpointer user_data,
++ GError **error)
++{
++ ParseInfo *info = (ParseInfo *)user_data;
++ gchar *value;
++
++ value = g_strndup (text, text_len);
++
++ switch (peek_state (info)) {
++ case STATE_START:
++ case STATE_RECENT_FILES:
++ case STATE_RECENT_ITEM:
++ case STATE_PRIVATE:
++ case STATE_GROUPS:
++ break;
++ case STATE_URI:
++ egg_recent_item_set_uri (info->current_item, value);
++ break;
++ case STATE_MIME_TYPE:
++ egg_recent_item_set_mime_type (info->current_item, value);
++ break;
++ case STATE_TIMESTAMP:
++ egg_recent_item_set_timestamp (info->current_item,
++ (time_t)atoi (value));
++ break;
++ case STATE_GROUP:
++ egg_recent_item_add_group (info->current_item,
++ text);
++ break;
++ }
++
++ g_free (value);
++}
++
++static void
++error_handler (GMarkupParseContext *context,
++ GError *error,
++ gpointer user_data)
++{
++ g_warning ("Error in parse: %s", error->message);
++}
++
++static void
++egg_recent_model_enforce_limit (GList *list, int limit)
++{
++ int len;
++ GList *end;
++
++ /* limit < 0 means unlimited */
++ if (limit <= 0)
++ return;
++
++ len = g_list_length (list);
++
++ if (len > limit) {
++ GList *next;
++
++ end = g_list_nth (list, limit-1);
++ next = end->next;
++
++ end->next = NULL;
++
++ EGG_RECENT_ITEM_LIST_UNREF (next);
++ }
++}
++
++static GList *
++egg_recent_model_sort (EggRecentModel *model, GList *list)
++{
++ switch (model->priv->sort_type) {
++ case EGG_RECENT_MODEL_SORT_MRU:
++ list = g_list_sort (list,
++ (GCompareFunc)list_compare_func_mru);
++ break;
++ case EGG_RECENT_MODEL_SORT_LRU:
++ list = g_list_sort (list,
++ (GCompareFunc)list_compare_func_lru);
++ break;
++ case EGG_RECENT_MODEL_SORT_NONE:
++ break;
++ }
++
++ return list;
++}
++
++static gboolean
++egg_recent_model_group_match (EggRecentItem *item, GSList *groups)
++{
++ GSList *tmp;
++
++ tmp = groups;
++
++ while (tmp != NULL) {
++ const gchar * group = (const gchar *)tmp->data;
++
++ if (egg_recent_item_in_group (item, group))
++ return TRUE;
++
++ tmp = tmp->next;
++ }
++
++ return FALSE;
++}
++
++static GList *
++egg_recent_model_filter (EggRecentModel *model, GList *list)
++{
++ GList *newlist = NULL;
++ GList *l;
++ gchar *mime_type;
++ gchar *uri;
++
++ g_return_val_if_fail (list != NULL, NULL);
++
++ for (l = list; l != NULL ; l = l->next) {
++ EggRecentItem *item = (EggRecentItem *) l->data;
++ gboolean pass_mime_test = FALSE;
++ gboolean pass_group_test = FALSE;
++ gboolean pass_scheme_test = FALSE;
++
++ g_assert (item != NULL);
++
++ uri = egg_recent_item_get_uri (item);
++
++ /* filter by mime type */
++ if (model->priv->mime_filter_values != NULL) {
++ mime_type = egg_recent_item_get_mime_type (item);
++
++ if (egg_recent_model_string_match
++ (model->priv->mime_filter_values,
++ mime_type))
++ pass_mime_test = TRUE;
++
++ g_free (mime_type);
++ } else
++ pass_mime_test = TRUE;
++
++ /* filter by group */
++ if (pass_mime_test && model->priv->group_filter_values != NULL) {
++ if (egg_recent_model_group_match
++ (item, model->priv->group_filter_values))
++ pass_group_test = TRUE;
++ } else if (egg_recent_item_get_private (item)) {
++ pass_group_test = FALSE;
++ } else
++ pass_group_test = TRUE;
++
++ /* filter by URI scheme */
++ if (pass_mime_test && pass_group_test &&
++ model->priv->scheme_filter_values != NULL) {
++ gchar *scheme;
++
++ scheme = gnome_vfs_get_uri_scheme (uri);
++
++ if (egg_recent_model_string_match
++ (model->priv->scheme_filter_values, scheme))
++ pass_scheme_test = TRUE;
++
++ g_free (scheme);
++ } else
++ pass_scheme_test = TRUE;
++
++ if (pass_mime_test && pass_group_test && pass_scheme_test)
++ newlist = g_list_prepend (newlist, item);
++ else
++ egg_recent_item_unref (item);
++
++ g_free (uri);
++ }
++
++ g_list_free (list);
++
++ return g_list_reverse (newlist);
++}
++
++
++
++#if 0
++static void
++egg_recent_model_monitor_list_cb (GnomeVFSMonitorHandle *handle,
++ const gchar *monitor_uri,
++ const gchar *info_uri,
++ GnomeVFSMonitorEventType event_type,
++ gpointer user_data)
++{
++ EggRecentModel *model;
++
++ model = EGG_RECENT_MODEL (user_data);
++
++ if (event_type == GNOME_VFS_MONITOR_EVENT_DELETED) {
++ egg_recent_model_delete (model, monitor_uri);
++ g_hash_table_remove (model->priv->monitors, monitor_uri);
++ }
++}
++
++
++
++static void
++egg_recent_model_monitor_list (EggRecentModel *model, GList *list)
++{
++ GList *tmp;
++
++ tmp = list;
++ while (tmp) {
++ EggRecentItem *item = (EggRecentItem *)tmp->data;
++ GnomeVFSMonitorHandle *handle;
++ GnomeVFSResult res;
++ gchar *uri;
++
++ tmp = tmp->next;
++
++ uri = egg_recent_item_get_uri (item);
++ if (g_hash_table_lookup (model->priv->monitors, uri)) {
++ /* already monitoring this one */
++ g_free (uri);
++ continue;
++ }
++
++ res = gnome_vfs_monitor_add (&handle, uri,
++ GNOME_VFS_MONITOR_FILE,
++ egg_recent_model_monitor_list_cb,
++ model);
++
++ if (res == GNOME_VFS_OK)
++ g_hash_table_insert (model->priv->monitors, uri, handle);
++ else
++ g_free (uri);
++ }
++}
++#endif
++
++
++static gboolean
++egg_recent_model_changed_timeout (EggRecentModel *model)
++{
++ model->priv->changed_timeout = 0;
++
++ egg_recent_model_changed (model);
++
++ return FALSE;
++}
++
++static void
++egg_recent_model_monitor_cb (GnomeVFSMonitorHandle *handle,
++ const gchar *monitor_uri,
++ const gchar *info_uri,
++ GnomeVFSMonitorEventType event_type,
++ gpointer user_data)
++{
++ EggRecentModel *model;
++
++ g_return_if_fail (user_data != NULL);
++ g_return_if_fail (EGG_IS_RECENT_MODEL (user_data));
++ model = EGG_RECENT_MODEL (user_data);
++
++ if (event_type == GNOME_VFS_MONITOR_EVENT_CHANGED ||
++ event_type == GNOME_VFS_MONITOR_EVENT_CREATED ||
++ event_type == GNOME_VFS_MONITOR_EVENT_DELETED) {
++ if (model->priv->changed_timeout > 0) {
++ g_source_remove (model->priv->changed_timeout);
++ }
++
++ model->priv->changed_timeout = g_timeout_add (
++ EGG_RECENT_MODEL_TIMEOUT_LENGTH,
++ (GSourceFunc)egg_recent_model_changed_timeout,
++ model);
++ }
++}
++
++static gboolean
++egg_recent_model_poll_timeout (gpointer user_data)
++{
++ EggRecentModel *model;
++ struct stat stat_buf;
++ int stat_res;
++
++ model = EGG_RECENT_MODEL (user_data);
++ stat_res = stat (model->priv->path, &stat_buf);
++
++ if (!stat_res && stat_buf.st_mtime &&
++ stat_buf.st_mtime != model->priv->last_mtime) {
++ model->priv->last_mtime = stat_buf.st_mtime;
++
++ if (model->priv->changed_timeout > 0)
++ g_source_remove (model->priv->changed_timeout);
++
++ model->priv->changed_timeout = g_timeout_add (
++ EGG_RECENT_MODEL_TIMEOUT_LENGTH,
++ (GSourceFunc)egg_recent_model_changed_timeout,
++ model);
++ }
++ return TRUE;
++}
++
++static void
++egg_recent_model_monitor (EggRecentModel *model, gboolean should_monitor)
++{
++ if (should_monitor && model->priv->monitor == NULL) {
++ char *uri;
++ GnomeVFSResult result;
++
++ uri = gnome_vfs_get_uri_from_local_path (model->priv->path);
++
++ result = gnome_vfs_monitor_add (&model->priv->monitor,
++ uri,
++ GNOME_VFS_MONITOR_FILE,
++ egg_recent_model_monitor_cb,
++ model);
++
++ g_free (uri);
++
++ /* if the above fails, don't worry about it.
++ * local notifications will still happen
++ */
++ if (result == GNOME_VFS_ERROR_NOT_SUPPORTED) {
++ if (model->priv->poll_timeout > 0)
++ g_source_remove (model->priv->poll_timeout);
++
++ model->priv->poll_timeout = g_timeout_add (
++ EGG_RECENT_MODEL_POLL_TIME * 1000,
++ egg_recent_model_poll_timeout,
++ model);
++ }
++
++ } else if (!should_monitor && model->priv->monitor != NULL) {
++ gnome_vfs_monitor_cancel (model->priv->monitor);
++ model->priv->monitor = NULL;
++ }
++}
++
++static void
++egg_recent_model_set_limit_internal (EggRecentModel *model, int limit)
++{
++ model->priv->limit = limit;
++
++ if (limit <= 0)
++ egg_recent_model_monitor (model, FALSE);
++ else {
++ egg_recent_model_monitor (model, TRUE);
++ egg_recent_model_changed (model);
++ }
++}
++
++static GList *
++egg_recent_model_read (EggRecentModel *model, FILE *file)
++{
++ GList *list=NULL;
++ gchar *content;
++ GMarkupParseContext *ctx;
++ ParseInfo *info;
++ GError *error;
++
++ content = egg_recent_model_read_raw (model, file);
++
++ if (strlen (content) <= 0) {
++ g_free (content);
++ return NULL;
++ }
++
++ info = parse_info_init ();
++
++ ctx = g_markup_parse_context_new (&parser, 0, info, NULL);
++
++ error = NULL;
++ if (!g_markup_parse_context_parse (ctx, content, strlen (content), &error)) {
++ g_warning ("Error while parsing the .recently-used file: %s\n",
++ error->message);
++
++ g_error_free (error);
++ parse_info_free (info);
++
++ return NULL;
++ }
++
++ error = NULL;
++ if (!g_markup_parse_context_end_parse (ctx, &error)) {
++ g_warning ("Unable to complete parsing of the .recently-used file: %s\n",
++ error->message);
++
++ g_error_free (error);
++ g_markup_parse_context_free (ctx);
++ parse_info_free (info);
++
++ return NULL;
++ }
++
++ list = g_list_reverse (info->items);
++
++ g_markup_parse_context_free (ctx);
++ parse_info_free (info);
++ g_free (content);
++
++ return list;
++}
++
++
++static gboolean
++egg_recent_model_write (EggRecentModel *model, FILE *file, GList *list)
++{
++ GString *string;
++ gchar *data;
++ EggRecentItem *item;
++ const GList *groups;
++ int i;
++ int ret;
++
++ string = g_string_new ("<?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,
++ gboolean for_writing)
++{
++ FILE *file;
++ mode_t prev_umask;
++
++ file = fopen (model->priv->path, "r+");
++ if (file == NULL && for_writing) {
++ /* be paranoid */
++ prev_umask = umask (077);
++
++ file = fopen (model->priv->path, "w+");
++
++ umask (prev_umask);
++
++ g_return_val_if_fail (file != NULL, NULL);
++ }
++
++ return file;
++}
++
++static gboolean
++egg_recent_model_lock_file (FILE *file)
++{
++#ifdef HAVE_LOCKF
++ int fd;
++ gint try = 5;
++
++ rewind (file);
++ fd = fileno (file);
++
++ /* Attempt to lock the file 5 times,
++ * waiting a random interval (< 1 second)
++ * in between attempts.
++ * We should really be doing asynchronous
++ * locking, but requires substantially larger
++ * changes.
++ */
++
++ while (try > 0)
++ {
++ int rand_interval;
++
++ if (lockf (fd, F_TLOCK, 0) == 0)
++ return TRUE;
++
++ rand_interval = 1 + (int) (10.0 * rand()/(RAND_MAX + 1.0));
++
++ g_usleep (100000 * rand_interval);
++
++ --try;
++ }
++
++ return FALSE;
++#else
++ return TRUE;
++#endif /* HAVE_LOCKF */
++}
++
++static gboolean
++egg_recent_model_unlock_file (FILE *file)
++{
++#ifdef HAVE_LOCKF
++ int fd;
++
++ rewind (file);
++ fd = fileno (file);
++
++ return (lockf (fd, F_ULOCK, 0) == 0) ? TRUE : FALSE;
++#else
++ return TRUE;
++#endif /* HAVE_LOCKF */
++}
++
++static void
++egg_recent_model_finalize (GObject *object)
++{
++ EggRecentModel *model = EGG_RECENT_MODEL (object);
++
++ if (model->priv->changed_timeout > 0) {
++ g_source_remove (model->priv->changed_timeout);
++ }
++
++ egg_recent_model_monitor (model, FALSE);
++
++
++ g_slist_foreach (model->priv->mime_filter_values,
++ (GFunc) g_pattern_spec_free, NULL);
++ g_slist_free (model->priv->mime_filter_values);
++ model->priv->mime_filter_values = NULL;
++
++ g_slist_foreach (model->priv->scheme_filter_values,
++ (GFunc) g_pattern_spec_free, NULL);
++ g_slist_free (model->priv->scheme_filter_values);
++ model->priv->scheme_filter_values = NULL;
++
++ g_slist_foreach (model->priv->group_filter_values,
++ (GFunc) g_free, NULL);
++ g_slist_free (model->priv->group_filter_values);
++ model->priv->group_filter_values = NULL;
++
++
++ if (model->priv->limit_change_notify_id)
++ gconf_client_notify_remove (model->priv->client,
++ model->priv->limit_change_notify_id);
++ model->priv->expiration_change_notify_id = 0;
++
++ if (model->priv->expiration_change_notify_id)
++ gconf_client_notify_remove (model->priv->client,
++ model->priv->expiration_change_notify_id);
++ model->priv->expiration_change_notify_id = 0;
++
++ g_object_unref (model->priv->client);
++ model->priv->client = NULL;
++
++
++ g_free (model->priv->path);
++ model->priv->path = NULL;
++
++ g_hash_table_destroy (model->priv->monitors);
++ model->priv->monitors = NULL;
++
++ if (model->priv->poll_timeout > 0)
++ g_source_remove (model->priv->poll_timeout);
++ model->priv->poll_timeout =0;
++
++ g_free (model->priv);
++
++ parent_class->finalize (object);
++}
++
++static void
++egg_recent_model_set_property (GObject *object,
++ guint prop_id,
++ const GValue *value,
++ GParamSpec *pspec)
++{
++ EggRecentModel *model = EGG_RECENT_MODEL (object);
++
++ switch (prop_id)
++ {
++ case PROP_MIME_FILTERS:
++ if (model->priv->mime_filter_values != NULL)
++ egg_recent_model_clear_mime_filter (model);
++
++ model->priv->mime_filter_values =
++ (GSList *)g_value_get_pointer (value);
++ break;
++
++ case PROP_GROUP_FILTERS:
++ if (model->priv->group_filter_values != NULL)
++ egg_recent_model_clear_group_filter (model);
++
++ model->priv->group_filter_values =
++ (GSList *)g_value_get_pointer (value);
++ break;
++
++ case PROP_SCHEME_FILTERS:
++ if (model->priv->scheme_filter_values != NULL)
++ egg_recent_model_clear_scheme_filter (model);
++
++ model->priv->scheme_filter_values =
++ (GSList *)g_value_get_pointer (value);
++ break;
++
++ case PROP_SORT_TYPE:
++ model->priv->sort_type = g_value_get_int (value);
++ break;
++
++ case PROP_LIMIT:
++ egg_recent_model_set_limit (model,
++ g_value_get_int (value));
++ break;
++
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
++egg_recent_model_get_property (GObject *object,
++ guint prop_id,
++ GValue *value,
++ GParamSpec *pspec)
++{
++ EggRecentModel *model = EGG_RECENT_MODEL (object);
++
++ switch (prop_id)
++ {
++ case PROP_MIME_FILTERS:
++ g_value_set_pointer (value, model->priv->mime_filter_values);
++ break;
++
++ case PROP_GROUP_FILTERS:
++ g_value_set_pointer (value, model->priv->group_filter_values);
++ break;
++
++ case PROP_SCHEME_FILTERS:
++ g_value_set_pointer (value, model->priv->scheme_filter_values);
++ break;
++
++ case PROP_SORT_TYPE:
++ g_value_set_int (value, model->priv->sort_type);
++ break;
++
++ case PROP_LIMIT:
++ g_value_set_int (value, model->priv->limit);
++ break;
++
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
++egg_recent_model_class_init (EggRecentModelClass * klass)
++{
++ GObjectClass *object_class;
++
++ parent_class = g_type_class_peek_parent (klass);
++
++ parent_class = g_type_class_peek_parent (klass);
++
++ object_class = G_OBJECT_CLASS (klass);
++ object_class->set_property = egg_recent_model_set_property;
++ object_class->get_property = egg_recent_model_get_property;
++ object_class->finalize = egg_recent_model_finalize;
++
++ model_signals[CHANGED] = g_signal_new ("changed",
++ G_OBJECT_CLASS_TYPE (object_class),
++ G_SIGNAL_RUN_LAST,
++ G_STRUCT_OFFSET (EggRecentModelClass, changed),
++ NULL, NULL,
++ g_cclosure_marshal_VOID__POINTER,
++ G_TYPE_NONE, 1,
++ G_TYPE_POINTER);
++
++
++ g_object_class_install_property (object_class,
++ PROP_MIME_FILTERS,
++ g_param_spec_pointer ("mime-filters",
++ "Mime Filters",
++ "List of mime types to be allowed.",
++ G_PARAM_READWRITE));
++
++ g_object_class_install_property (object_class,
++ PROP_GROUP_FILTERS,
++ g_param_spec_pointer ("group-filters",
++ "Group Filters",
++ "List of groups to be allowed.",
++ G_PARAM_READWRITE));
++
++ g_object_class_install_property (object_class,
++ PROP_SCHEME_FILTERS,
++ g_param_spec_pointer ("scheme-filters",
++ "Scheme Filters",
++ "List of URI schemes to be allowed.",
++ G_PARAM_READWRITE));
++
++ g_object_class_install_property (object_class,
++ PROP_SORT_TYPE,
++ g_param_spec_int ("sort-type",
++ "Sort Type",
++ "Type of sorting to be done.",
++ 0, EGG_RECENT_MODEL_SORT_NONE,
++ EGG_RECENT_MODEL_SORT_MRU,
++ G_PARAM_READWRITE));
++
++ g_object_class_install_property (object_class,
++ PROP_LIMIT,
++ g_param_spec_int ("limit",
++ "Limit",
++ "Max number of items allowed.",
++ -1, EGG_RECENT_MODEL_MAX_ITEMS,
++ EGG_RECENT_MODEL_DEFAULT_LIMIT,
++ G_PARAM_READWRITE));
++
++ klass->changed = NULL;
++}
++
++
++
++static void
++egg_recent_model_limit_changed (GConfClient *client, guint cnxn_id,
++ GConfEntry *entry, gpointer user_data)
++{
++ EggRecentModel *model;
++ GConfValue *value;
++
++ model = EGG_RECENT_MODEL (user_data);
++
++ g_return_if_fail (model != NULL);
++
++ if (model->priv->use_default_limit == FALSE)
++ return; /* ignore this key */
++
++ /* the key was unset, and the schema has apparently failed */
++ if (entry == NULL)
++ return;
++
++ value = gconf_entry_get_value (entry);
++
++ if (value->type != GCONF_VALUE_INT) {
++ g_warning ("Expected GConfValue of type integer, "
++ "got something else");
++ }
++
++
++ egg_recent_model_set_limit_internal (model, gconf_value_get_int (value));
++}
++
++static void
++egg_recent_model_expiration_changed (GConfClient *client, guint cnxn_id,
++ GConfEntry *entry, gpointer user_data)
++{
++
++}
++
++static void
++egg_recent_model_init (EggRecentModel * model)
++{
++ if (!gnome_vfs_init ()) {
++ g_warning ("gnome-vfs initialization failed.");
++ return;
++ }
++
++
++ model->priv = g_new0 (EggRecentModelPrivate, 1);
++
++ model->priv->path = g_strdup_printf ("%s" EGG_RECENT_MODEL_FILE_PATH,
++ g_get_home_dir ());
++
++ model->priv->mime_filter_values = NULL;
++ model->priv->group_filter_values = NULL;
++ model->priv->scheme_filter_values = NULL;
++
++ model->priv->client = gconf_client_get_default ();
++ gconf_client_add_dir (model->priv->client, EGG_RECENT_MODEL_KEY_DIR,
++ GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
++
++ model->priv->limit_change_notify_id =
++ gconf_client_notify_add (model->priv->client,
++ EGG_RECENT_MODEL_DEFAULT_LIMIT_KEY,
++ egg_recent_model_limit_changed,
++ model, NULL, NULL);
++
++ model->priv->expiration_change_notify_id =
++ gconf_client_notify_add (model->priv->client,
++ EGG_RECENT_MODEL_EXPIRE_KEY,
++ egg_recent_model_expiration_changed,
++ model, NULL, NULL);
++
++ model->priv->expire_days = gconf_client_get_int (
++ model->priv->client,
++ EGG_RECENT_MODEL_EXPIRE_KEY,
++ NULL);
++
++#if 0
++ /* keep this out, for now */
++ model->priv->limit = gconf_client_get_int (
++ model->priv->client,
++ EGG_RECENT_MODEL_DEFAULT_LIMIT_KEY, NULL);
++ model->priv->use_default_limit = TRUE;
++#endif
++ model->priv->limit = EGG_RECENT_MODEL_DEFAULT_LIMIT;
++ model->priv->use_default_limit = FALSE;
++
++ model->priv->monitors = g_hash_table_new_full (
++ g_str_hash, g_str_equal,
++ (GDestroyNotify) g_free,
++ (GDestroyNotify) gnome_vfs_monitor_cancel);
++
++ model->priv->monitor = NULL;
++ model->priv->poll_timeout = 0;
++ model->priv->last_mtime = 0;
++ egg_recent_model_monitor (model, TRUE);
++}
++
++
++/**
++ * egg_recent_model_new:
++ * @sort: the type of sorting to use
++ * @limit: maximum number of items in the list
++ *
++ * This creates a new EggRecentModel object.
++ *
++ * Returns: a EggRecentModel object
++ */
++EggRecentModel *
++egg_recent_model_new (EggRecentModelSort sort)
++{
++ EggRecentModel *model;
++
++ model = EGG_RECENT_MODEL (g_object_new (egg_recent_model_get_type (),
++ "sort-type", sort, NULL));
++
++ g_return_val_if_fail (model, NULL);
++
++ return model;
++}
++
++/**
++ * egg_recent_model_add_full:
++ * @model: A EggRecentModel object.
++ * @item: A EggRecentItem
++ *
++ * This function adds an item to the list of recently used URIs.
++ *
++ * Returns: gboolean
++ */
++gboolean
++egg_recent_model_add_full (EggRecentModel * model, EggRecentItem *item)
++{
++ FILE *file;
++ GList *list = NULL;
++ gboolean ret = FALSE;
++ gboolean updated = FALSE;
++ char *uri;
++ time_t t;
++
++ g_return_val_if_fail (model != NULL, FALSE);
++ g_return_val_if_fail (EGG_IS_RECENT_MODEL (model), FALSE);
++
++ uri = egg_recent_item_get_uri (item);
++ if (strncmp (uri, "recent-files://", strlen ("recent-files://")) == 0) {
++ g_free (uri);
++ return FALSE;
++ } else {
++ g_free (uri);
++ }
++
++ file = egg_recent_model_open_file (model, TRUE);
++ g_return_val_if_fail (file != NULL, FALSE);
++
++ time (&t);
++ egg_recent_item_set_timestamp (item, t);
++
++ if (egg_recent_model_lock_file (file)) {
++
++ /* read existing stuff */
++ list = egg_recent_model_read (model, file);
++
++ /* if it's already there, we just update it */
++ updated = egg_recent_model_update_item (list, item);
++
++ if (!updated) {
++ list = g_list_prepend (list, item);
++
++ egg_recent_model_enforce_limit (list,
++ EGG_RECENT_MODEL_MAX_ITEMS);
++ }
++
++ /* write new stuff */
++ if (!egg_recent_model_write (model, file, list))
++ g_warning ("Write failed: %s", strerror (errno));
++
++ if (!updated)
++ list = g_list_remove (list, item);
++
++ EGG_RECENT_ITEM_LIST_UNREF (list);
++ ret = TRUE;
++ } else {
++ g_warning ("Failed to lock: %s", strerror (errno));
++ fclose (file);
++ return FALSE;
++ }
++
++ if (!egg_recent_model_unlock_file (file))
++ g_warning ("Failed to unlock: %s", strerror (errno));
++
++ fclose (file);
++
++ if (model->priv->monitor == NULL) {
++ /* since monitoring isn't working, at least give a
++ * local notification
++ */
++ egg_recent_model_changed (model);
++ }
++
++ return ret;
++}
++
++/**
++ * egg_recent_model_add:
++ * @model: A EggRecentModel object.
++ * @uri: A string URI
++ *
++ * This function adds an item to the list of recently used URIs.
++ *
++ * Returns: gboolean
++ */
++gboolean
++egg_recent_model_add (EggRecentModel *model, const gchar *uri)
++{
++ EggRecentItem *item;
++ gboolean ret = FALSE;
++
++ g_return_val_if_fail (model != NULL, FALSE);
++ g_return_val_if_fail (uri != NULL, FALSE);
++
++ item = egg_recent_item_new_from_uri (uri);
++
++ g_return_val_if_fail (item != NULL, FALSE);
++
++ ret = egg_recent_model_add_full (model, item);
++
++ egg_recent_item_unref (item);
++
++ return ret;
++}
++
++
++
++/**
++ * egg_recent_model_delete:
++ * @model: A EggRecentModel object.
++ * @uri: The URI you want to delete.
++ *
++ * This function deletes a URI from the file of recently used URIs.
++ *
++ * Returns: gboolean
++ */
++gboolean
++egg_recent_model_delete (EggRecentModel * model, const gchar * uri)
++{
++ FILE *file;
++ GList *list;
++ unsigned int length;
++ gboolean ret = FALSE;
++
++ g_return_val_if_fail (model != NULL, FALSE);
++ g_return_val_if_fail (EGG_IS_RECENT_MODEL (model), FALSE);
++ g_return_val_if_fail (uri != NULL, FALSE);
++
++ file = egg_recent_model_open_file (model, TRUE);
++ g_return_val_if_fail (file != NULL, FALSE);
++
++ if (egg_recent_model_lock_file (file)) {
++ list = egg_recent_model_read (model, file);
++
++ if (list == NULL)
++ goto out;
++
++ length = g_list_length (list);
++
++ list = egg_recent_model_delete_from_list (list, uri);
++
++ if (length == g_list_length (list)) {
++ /* nothing was deleted */
++ EGG_RECENT_ITEM_LIST_UNREF (list);
++ } else {
++ egg_recent_model_write (model, file, list);
++ EGG_RECENT_ITEM_LIST_UNREF (list);
++ ret = TRUE;
++
++ }
++ } else {
++ g_warning ("Failed to lock: %s", strerror (errno));
++ return FALSE;
++ }
++
++out:
++
++ if (!egg_recent_model_unlock_file (file))
++ g_warning ("Failed to unlock: %s", strerror (errno));
++
++ fclose (file);
++
++ g_hash_table_remove (model->priv->monitors, uri);
++
++ if (model->priv->monitor == NULL && ret) {
++ /* since monitoring isn't working, at least give a
++ * local notification
++ */
++ egg_recent_model_changed (model);
++ }
++
++ return ret;
++}
++
++
++/**
++ * egg_recent_model_get_list:
++ * @model: A EggRecentModel object.
++ *
++ * This function gets the current contents of the file
++ *
++ * Returns: a GList
++ */
++GList *
++egg_recent_model_get_list (EggRecentModel *model)
++{
++ FILE *file;
++ GList *list = NULL;
++
++ file = egg_recent_model_open_file (model, FALSE);
++ if (file == NULL)
++ return NULL;
++
++ if (egg_recent_model_lock_file (file))
++ list = egg_recent_model_read (model, file);
++ else {
++ g_warning ("Failed to lock: %s", strerror (errno));
++ fclose (file);
++ return NULL;
++ }
++
++ if (!egg_recent_model_unlock_file (file))
++ g_warning ("Failed to unlock: %s", strerror (errno));
++
++ if (list != NULL) {
++ list = egg_recent_model_filter (model, list);
++ list = egg_recent_model_sort (model, list);
++
++ egg_recent_model_enforce_limit (list, model->priv->limit);
++ }
++
++ fclose (file);
++
++ return list;
++}
++
++
++
++/**
++ * egg_recent_model_set_limit:
++ * @model: A EggRecentModel object.
++ * @limit: The maximum length of the list
++ *
++ * This function sets the maximum length of the list. Note: This only affects
++ * the length of the list emitted in the "changed" signal, not the list stored
++ * on disk.
++ *
++ * Returns: void
++ */
++void
++egg_recent_model_set_limit (EggRecentModel *model, int limit)
++{
++ model->priv->use_default_limit = FALSE;
++
++ egg_recent_model_set_limit_internal (model, limit);
++}
++
++/**
++ * egg_recent_model_get_limit:
++ * @model: A EggRecentModel object.
++ *
++ * This function gets the maximum length of the list.
++ *
++ * Returns: int
++ */
++int
++egg_recent_model_get_limit (EggRecentModel *model)
++{
++ return model->priv->limit;
++}
++
++
++/**
++ * egg_recent_model_clear:
++ * @model: A EggRecentModel object.
++ *
++ * This function clears the contents of the file
++ *
++ * Returns: void
++ */
++void
++egg_recent_model_clear (EggRecentModel *model)
++{
++ FILE *file;
++ int fd;
++
++ file = egg_recent_model_open_file (model, TRUE);
++ g_return_if_fail (file != NULL);
++
++ fd = fileno (file);
++
++ if (egg_recent_model_lock_file (file)) {
++ ftruncate (fd, 0);
++ } else {
++ g_warning ("Failed to lock: %s", strerror (errno));
++ return;
++ }
++
++ if (!egg_recent_model_unlock_file (file))
++ g_warning ("Failed to unlock: %s", strerror (errno));
++
++ fclose (file);
++
++ if (model->priv->monitor == NULL) {
++ /* since monitoring isn't working, at least give a
++ * local notification
++ */
++ egg_recent_model_changed (model);
++ }
++}
++
++static void
++egg_recent_model_clear_mime_filter (EggRecentModel *model)
++{
++ g_return_if_fail (model != NULL);
++
++ if (model->priv->mime_filter_values != NULL) {
++ g_slist_foreach (model->priv->mime_filter_values,
++ (GFunc) g_pattern_spec_free, NULL);
++ g_slist_free (model->priv->mime_filter_values);
++ model->priv->mime_filter_values = NULL;
++ }
++}
++
++/**
++ * egg_recent_model_set_filter_mime_types:
++ * @model: A EggRecentModel object.
++ *
++ * Sets which mime types are allowed in the list.
++ *
++ * Returns: void
++ */
++void
++egg_recent_model_set_filter_mime_types (EggRecentModel *model,
++ ...)
++{
++ va_list valist;
++ GSList *list = NULL;
++ gchar *str;
++
++ g_return_if_fail (model != NULL);
++
++ egg_recent_model_clear_mime_filter (model);
++
++ va_start (valist, model);
++
++ str = va_arg (valist, gchar*);
++
++ while (str != NULL) {
++ list = g_slist_prepend (list, g_pattern_spec_new (str));
++
++ str = va_arg (valist, gchar*);
++ }
++
++ va_end (valist);
++
++ model->priv->mime_filter_values = list;
++}
++
++static void
++egg_recent_model_clear_group_filter (EggRecentModel *model)
++{
++ g_return_if_fail (model != NULL);
++
++ if (model->priv->group_filter_values != NULL) {
++ g_slist_foreach (model->priv->group_filter_values, (GFunc)g_free, NULL);
++ g_slist_free (model->priv->group_filter_values);
++ model->priv->group_filter_values = NULL;
++ }
++}
++
++/**
++ * egg_recent_model_set_filter_groups:
++ * @model: A EggRecentModel object.
++ *
++ * Sets which groups are allowed in the list.
++ *
++ * Returns: void
++ */
++void
++egg_recent_model_set_filter_groups (EggRecentModel *model,
++ ...)
++{
++ va_list valist;
++ GSList *list = NULL;
++ gchar *str;
++
++ g_return_if_fail (model != NULL);
++
++ egg_recent_model_clear_group_filter (model);
++
++ va_start (valist, model);
++
++ str = va_arg (valist, gchar*);
++
++ while (str != NULL) {
++ list = g_slist_prepend (list, g_strdup (str));
++
++ str = va_arg (valist, gchar*);
++ }
++
++ va_end (valist);
++
++ model->priv->group_filter_values = list;
++}
++
++static void
++egg_recent_model_clear_scheme_filter (EggRecentModel *model)
++{
++ g_return_if_fail (model != NULL);
++
++ if (model->priv->scheme_filter_values != NULL) {
++ g_slist_foreach (model->priv->scheme_filter_values,
++ (GFunc) g_pattern_spec_free, NULL);
++ g_slist_free (model->priv->scheme_filter_values);
++ model->priv->scheme_filter_values = NULL;
++ }
++}
++
++/**
++ * egg_recent_model_set_filter_uri_schemes:
++ * @model: A EggRecentModel object.
++ *
++ * Sets which URI schemes (file, http, ftp, etc) are allowed in the list.
++ *
++ * Returns: void
++ */
++void
++egg_recent_model_set_filter_uri_schemes (EggRecentModel *model, ...)
++{
++ va_list valist;
++ GSList *list = NULL;
++ gchar *str;
++
++ g_return_if_fail (model != NULL);
++
++ egg_recent_model_clear_scheme_filter (model);
++
++ va_start (valist, model);
++
++ str = va_arg (valist, gchar*);
++
++ while (str != NULL) {
++ list = g_slist_prepend (list, g_pattern_spec_new (str));
++
++ str = va_arg (valist, gchar*);
++ }
++
++ va_end (valist);
++
++ model->priv->scheme_filter_values = list;
++}
++
++/**
++ * egg_recent_model_set_sort:
++ * @model: A EggRecentModel object.
++ * @sort: A EggRecentModelSort type
++ *
++ * Sets the type of sorting to be used.
++ *
++ * Returns: void
++ */
++void
++egg_recent_model_set_sort (EggRecentModel *model,
++ EggRecentModelSort sort)
++{
++ g_return_if_fail (model != NULL);
++
++ model->priv->sort_type = sort;
++}
++
++/**
++ * egg_recent_model_changed:
++ * @model: A EggRecentModel object.
++ *
++ * This function causes a "changed" signal to be emitted.
++ *
++ * Returns: void
++ */
++void
++egg_recent_model_changed (EggRecentModel *model)
++{
++ GList *list = NULL;
++
++ if (model->priv->limit > 0) {
++ list = egg_recent_model_get_list (model);
++ /* egg_recent_model_monitor_list (model, list); */
++
++ g_signal_emit (G_OBJECT (model), model_signals[CHANGED], 0,
++ list);
++ }
++
++ if (list)
++ EGG_RECENT_ITEM_LIST_UNREF (list);
++}
++
++static void
++egg_recent_model_remove_expired_list (EggRecentModel *model, GList *list)
++{
++ time_t current_time;
++ time_t day_seconds;
++
++ time (&current_time);
++ day_seconds = model->priv->expire_days*24*60*60;
++
++ while (list != NULL) {
++ EggRecentItem *item = list->data;
++ time_t timestamp;
++
++ timestamp = egg_recent_item_get_timestamp (item);
++
++ if ((timestamp+day_seconds) < current_time) {
++ gchar *uri = egg_recent_item_get_uri (item);
++ egg_recent_model_delete (model, uri);
++
++ g_strdup (uri);
++ }
++
++ list = list->next;
++ }
++}
++
++
++/**
++ * egg_recent_model_remove_expired:
++ * @model: A EggRecentModel object.
++ *
++ * Goes through the entire list, and removes any items that are older than
++ * the user-specified expiration period.
++ *
++ * Returns: void
++ */
++void
++egg_recent_model_remove_expired (EggRecentModel *model)
++{
++ FILE *file;
++ GList *list=NULL;
++
++ g_return_if_fail (model != NULL);
++
++ file = egg_recent_model_open_file (model, FALSE);
++ if (file == NULL)
++ return;
++
++ if (egg_recent_model_lock_file (file)) {
++ list = egg_recent_model_read (model, file);
++
++ } else {
++ g_warning ("Failed to lock: %s", strerror (errno));
++ return;
++ }
++
++ if (!egg_recent_model_unlock_file (file))
++ g_warning ("Failed to unlock: %s", strerror (errno));
++
++ if (list != NULL) {
++ egg_recent_model_remove_expired_list (model, list);
++ EGG_RECENT_ITEM_LIST_UNREF (list);
++ }
++
++ fclose (file);
++}
++
++/**
++ * egg_recent_model_get_type:
++ *
++ * This returns a GType representing a EggRecentModel object.
++ *
++ * Returns: a GType
++ */
++GType
++egg_recent_model_get_type (void)
++{
++ static GType egg_recent_model_type = 0;
++
++ if(!egg_recent_model_type) {
++ static const GTypeInfo egg_recent_model_info = {
++ sizeof (EggRecentModelClass),
++ NULL, /* base init */
++ NULL, /* base finalize */
++ (GClassInitFunc)egg_recent_model_class_init, /* class init */
++ NULL, /* class finalize */
++ NULL, /* class data */
++ sizeof (EggRecentModel),
++ 0,
++ (GInstanceInitFunc) egg_recent_model_init
++ };
++
++ egg_recent_model_type = g_type_register_static (G_TYPE_OBJECT,
++ "EggRecentModel",
++ &egg_recent_model_info, 0);
++ }
++
++ return egg_recent_model_type;
++}
++
+diff -uprN gnome-desktop-2.16.1-pristine/libgnome-desktop/egg-recent-model.h gnome-desktop-2.16.1/libgnome-desktop/egg-recent-model.h
+--- gnome-desktop-2.16.1-pristine/libgnome-desktop/egg-recent-model.h 1969-12-31 19:00:00.000000000 -0500
++++ gnome-desktop-2.16.1/libgnome-desktop/egg-recent-model.h 2006-10-23 16:19:45.000000000 -0400
+@@ -0,0 +1,84 @@
++/* 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"
++
++#ifndef EGG_ENABLE_RECENT_FILES
++#error "EggRecent has been DEPRECATED by the new recent files code inside GTK 2.9.0. Use EGG_ENABLE_RECENT_FILES to compile this code, but you are using it at your own risk."
++#endif
++
++G_BEGIN_DECLS
++
++#define EGG_TYPE_RECENT_MODEL (egg_recent_model_get_type ())
++#define EGG_RECENT_MODEL(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, EGG_TYPE_RECENT_MODEL, EggRecentModel)
++#define EGG_RECENT_MODEL_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, EGG_TYPE_RECENT_MODEL, EggRecentModelClass)
++#define EGG_IS_RECENT_MODEL(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, egg_recent_model_get_type ())
++
++typedef struct _EggRecentModel EggRecentModel;
++typedef struct _EggRecentModelPrivate EggRecentModelPrivate;
++typedef struct _EggRecentModelClass EggRecentModelClass;
++
++struct _EggRecentModel {
++ GObject parent_instance;
++
++ EggRecentModelPrivate *priv;
++};
++
++struct _EggRecentModelClass {
++ GObjectClass parent_class;
++
++ void (*changed) (EggRecentModel *model, GList *list);
++};
++
++typedef enum {
++ EGG_RECENT_MODEL_SORT_MRU,
++ EGG_RECENT_MODEL_SORT_LRU,
++ EGG_RECENT_MODEL_SORT_NONE
++} EggRecentModelSort;
++
++
++/* Standard group names */
++#define EGG_RECENT_GROUP_LAUNCHERS "Launchers"
++
++
++GType egg_recent_model_get_type (void);
++
++/* constructors */
++EggRecentModel * egg_recent_model_new (EggRecentModelSort sort);
++
++/* public methods */
++void egg_recent_model_set_filter_mime_types (EggRecentModel *model,
++ ...);
++
++void egg_recent_model_set_filter_groups (EggRecentModel *model, ...);
++
++void egg_recent_model_set_filter_uri_schemes (EggRecentModel *model,
++ ...);
++
++void egg_recent_model_set_sort (EggRecentModel *model,
++ EggRecentModelSort sort);
++
++gboolean egg_recent_model_add_full (EggRecentModel *model,
++ EggRecentItem *item);
++
++gboolean egg_recent_model_add (EggRecentModel *model,
++ const gchar *uri);
++
++gboolean egg_recent_model_delete (EggRecentModel *model,
++ const gchar *uri);
++
++void egg_recent_model_clear (EggRecentModel *model);
++
++GList * egg_recent_model_get_list (EggRecentModel *model);
++
++void egg_recent_model_changed (EggRecentModel *model);
++
++void egg_recent_model_set_limit (EggRecentModel *model, int limit);
++int egg_recent_model_get_limit (EggRecentModel *model);
++
++void egg_recent_model_remove_expired (EggRecentModel *model);
++
++G_END_DECLS
++
++#endif /* __EGG_RECENT_MODEL_H__ */
+diff -uprN gnome-desktop-2.16.1-pristine/libgnome-desktop/gnome-desktop-item.c gnome-desktop-2.16.1/libgnome-desktop/gnome-desktop-item.c
+--- gnome-desktop-2.16.1-pristine/libgnome-desktop/gnome-desktop-item.c 2006-08-05 07:59:08.000000000 -0400
++++ gnome-desktop-2.16.1/libgnome-desktop/gnome-desktop-item.c 2006-10-23 17:15:41.000000000 -0400
+@@ -59,6 +59,16 @@
+ #include <gtk/gtk.h>
+ #endif
+
++#include <gtk/gtkversion.h>
++#if GTK_CHECK_VERSION (2,10,0)
++# define USE_GTK_RECENT_MANAGER
++# include <gtk/gtkrecentmanager.h>
++#else
++# include "egg-recent-item.h"
++# define EGG_ENABLE_RECENT_FILES
++# include "egg-recent-model.h"
++#endif
++
+ #define sure_string(s) ((s)!=NULL?(s):"")
+
+ struct _GnomeDesktopItem {
+@@ -128,6 +138,8 @@ static gboolean ditem_save (Gno
+ const char *uri,
+ GError **error);
+
++static void update_recently_used_apps (const GnomeDesktopItem *item);
++
+ static int
+ readbuf_getc (ReadBuf *rb)
+ {
+@@ -2103,6 +2115,8 @@ gnome_desktop_item_launch_on_screen_with
+ (flags & GNOME_DESKTOP_ITEM_LAUNCH_APPEND_PATHS),
+ error);
+
++ update_recently_used_apps (item);
++
+ return ret;
+ }
+
+@@ -4098,3 +4112,71 @@ gnome_desktop_item_error_quark (void)
+
+ return q;
+ }
++
++static void
++update_recently_used_apps (const GnomeDesktopItem *item)
++{
++#ifdef USE_GTK_RECENT_MANAGER
++ GtkRecentManager *manager;
++ GtkRecentData recent_data;
++#else
++ EggRecentModel *model;
++ EggRecentItem *recent_item;
++#endif
++
++
++ if (! item)
++ return;
++
++#ifdef USE_GTK_RECENT_MANAGER
++ manager = gtk_recent_manager_get_default ();
++
++ if (! manager)
++ return;
++
++ recent_data.display_name = NULL;
++ recent_data.description = NULL;
++ recent_data.mime_type = g_strdup ("application/x-desktop");
++ recent_data.is_private = TRUE;
++
++ recent_data.app_name = g_strdup (g_get_application_name ());
++ if (! recent_data.app_name)
++ recent_data.app_name = g_strdup ("libgnomedesktop");
++
++ recent_data.app_exec = g_strdup (gnome_desktop_item_get_string (item, GNOME_DESKTOP_ITEM_EXEC));
++ if (! recent_data.app_exec)
++ recent_data.app_exec = g_strdup ("gnome-open %u");
++
++ recent_data.groups = g_new0 (gchar *, 2);
++ recent_data.groups [0] = g_strdup ("recently-used-apps");
++ recent_data.groups [1] = NULL;
++
++ gtk_recent_manager_add_full (manager, gnome_desktop_item_get_location (item), & recent_data);
++
++ g_free (recent_data.mime_type);
++ g_free (recent_data.app_name);
++ g_free (recent_data.app_exec);
++ g_free (recent_data.groups [0]);
++ g_free (recent_data.groups);
++
++#else
++
++ model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_MRU);
++
++ if (! model)
++ return;
++
++ recent_item = egg_recent_item_new_from_uri (gnome_desktop_item_get_location (item));
++
++ if (recent_item) {
++ egg_recent_item_add_group (recent_item, "recently-used-apps");
++ egg_recent_item_set_private (recent_item, TRUE);
++
++ egg_recent_model_add_full (model, recent_item);
++
++ egg_recent_item_unref (recent_item);
++ }
++
++ g_object_unref (G_OBJECT (model));
++#endif
++}
diff --git a/gnome-base/gnome-desktop/gnome-desktop-2.18.1-r1.ebuild b/gnome-base/gnome-desktop/gnome-desktop-2.18.1-r1.ebuild
new file mode 100644
index 0000000..7790fd1
--- /dev/null
+++ b/gnome-base/gnome-desktop/gnome-desktop-2.18.1-r1.ebuild
@@ -0,0 +1,48 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-desktop/gnome-desktop-2.18.1.ebuild,v 1.1 2007/04/17 02:58:08 compnerd Exp $
+
+inherit eutils gnome2
+
+DESCRIPTION="Libraries for the gnome desktop that is not part of the UI"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd"
+IUSE="doc"
+
+RDEPEND=">=dev-libs/libxml2-2.4.20
+ >=x11-libs/gtk+-2.8
+ >=dev-libs/glib-2.8
+ >=gnome-base/libgnomecanvas-2
+ >=gnome-base/libgnomeui-2.6
+ >=gnome-base/gnome-vfs-2
+ >=x11-libs/startup-notification-0.5
+ !gnome-base/gnome-core"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ sys-devel/gettext
+ >=dev-util/intltool-0.35
+ >=dev-util/pkgconfig-0.9
+ >=app-text/gnome-doc-utils-0.3.2
+ doc? ( >=dev-util/gtk-doc-1.4 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="${G2CONF} --with-gnome-distributor=Gentoo --disable-scrollkeeper"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ epatch ${FILESDIR}/gnome-desktop-recently-used-apps.patch
+
+ # Fix bug 16853 by building gnome-about with IEEE to prevent
+ # floating point exceptions on alpha
+ if use alpha; then
+ sed -i '/^CFLAGS/s/$/ -mieee/' ${S}/gnome-about/Makefile.in \
+ || die "sed failed (2)"
+ fi
+}
diff --git a/gnome-base/gnome-desktop/gnome-desktop-2.18.3.ebuild b/gnome-base/gnome-desktop/gnome-desktop-2.18.3.ebuild
new file mode 100644
index 0000000..86d163b
--- /dev/null
+++ b/gnome-base/gnome-desktop/gnome-desktop-2.18.3.ebuild
@@ -0,0 +1,51 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-desktop/gnome-desktop-2.18.3.ebuild,v 1.5 2007/09/22 14:50:42 dertobi123 Exp $
+
+inherit eutils gnome2
+
+DESCRIPTION="Libraries for the gnome desktop that is not part of the UI"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha amd64 ~arm ~hppa ~ia64 ppc ppc64 ~sh ~sparc x86 ~x86-fbsd"
+IUSE="doc slab"
+
+RDEPEND=">=dev-libs/libxml2-2.4.20
+ >=x11-libs/gtk+-2.8
+ >=dev-libs/glib-2.8
+ >=gnome-base/libgnomecanvas-2
+ >=gnome-base/libgnomeui-2.6
+ >=gnome-base/gnome-vfs-2
+ >=x11-libs/startup-notification-0.5
+ !gnome-base/gnome-core
+ slab? ( gnome-base/gnome-main-menu )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ sys-devel/gettext
+ >=dev-util/intltool-0.35
+ >=dev-util/pkgconfig-0.9
+ >=app-text/gnome-doc-utils-0.3.2
+ doc? ( >=dev-util/gtk-doc-1.4 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="${G2CONF} --with-gnome-distributor=Gentoo --disable-scrollkeeper"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ if use slab; then
+ epatch ${FILESDIR}/gnome-desktop-recently-used-apps.patch
+ fi
+
+ # Fix bug 16853 by building gnome-about with IEEE to prevent
+ # floating point exceptions on alpha
+ if use alpha; then
+ sed -i '/^CFLAGS/s/$/ -mieee/' ${S}/gnome-about/Makefile.in \
+ || die "sed failed (2)"
+ fi
+}
diff --git a/gnome-base/gnome-desktop/gnome-desktop-2.20.0.ebuild b/gnome-base/gnome-desktop/gnome-desktop-2.20.0.ebuild
new file mode 100644
index 0000000..f70dc82
--- /dev/null
+++ b/gnome-base/gnome-desktop/gnome-desktop-2.20.0.ebuild
@@ -0,0 +1,52 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+inherit eutils gnome2
+
+DESCRIPTION="Libraries for the gnome desktop that is not part of the UI"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd"
+IUSE="doc slab"
+
+RDEPEND=">=dev-libs/libxml2-2.4.20
+ >=x11-libs/gtk+-2.11.3
+ >=dev-libs/glib-2.13.0
+ >=gnome-base/gconf-2
+ >=gnome-base/libgnomecanvas-2
+ >=gnome-base/libgnomeui-2.6
+ >=gnome-base/gnome-vfs-2
+ >=x11-libs/startup-notification-0.5
+ !gnome-base/gnome-core
+ slab? ( gnome-base/gnome-main-menu )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ sys-devel/gettext
+ >=dev-util/intltool-0.35
+ >=dev-util/pkgconfig-0.9
+ >=app-text/gnome-doc-utils-0.3.2
+ doc? ( >=dev-util/gtk-doc-1.4 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="${G2CONF} --with-gnome-distributor=Gentoo --disable-scrollkeeper"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ if use slab; then
+ epatch ${FILESDIR}/gnome-desktop-recently-used-apps.patch
+ fi
+
+ # Fix bug 16853 by building gnome-about with IEEE to prevent
+ # floating point exceptions on alpha
+ if use alpha; then
+ sed -i '/^CFLAGS/s/$/ -mieee/' ${S}/gnome-about/Makefile.in \
+ || die "sed failed (2)"
+ fi
+}
diff --git a/gnome-base/gnome-desktop/gnome-desktop-2.20.2.ebuild b/gnome-base/gnome-desktop/gnome-desktop-2.20.2.ebuild
new file mode 100644
index 0000000..19cd83d
--- /dev/null
+++ b/gnome-base/gnome-desktop/gnome-desktop-2.20.2.ebuild
@@ -0,0 +1,52 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+inherit eutils gnome2
+
+DESCRIPTION="Libraries for the gnome desktop that is not part of the UI"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd"
+IUSE="doc slab"
+
+RDEPEND=">=dev-libs/libxml2-2.4.20
+ >=x11-libs/gtk+-2.11.3
+ >=dev-libs/glib-2.13.0
+ >=gnome-base/gconf-2
+ >=gnome-base/libgnomecanvas-2
+ >=gnome-base/libgnomeui-2.6
+ >=gnome-base/gnome-vfs-2
+ >=x11-libs/startup-notification-0.5
+ !gnome-base/gnome-core
+ slab? ( gnome-base/gnome-main-menu )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ sys-devel/gettext
+ >=dev-util/intltool-0.35
+ >=dev-util/pkgconfig-0.9
+ >=app-text/gnome-doc-utils-0.3.2
+ doc? ( >=dev-util/gtk-doc-1.4 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="${G2CONF} --with-gnome-distributor=Gentoo --disable-scrollkeeper"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ if use slab; then
+ epatch ${FILESDIR}/gnome-desktop-recently-used-apps.patch
+ fi
+
+ # Fix bug 16853 by building gnome-about with IEEE to prevent
+ # floating point exceptions on alpha
+ if use alpha; then
+ sed -i '/^CFLAGS/s/$/ -mieee/' "${S}"/gnome-about/Makefile.in \
+ || die "sed failed (2)"
+ fi
+}
diff --git a/gnome-base/gnome-desktop/gnome-desktop-2.24.1.ebuild b/gnome-base/gnome-desktop/gnome-desktop-2.24.1.ebuild
new file mode 100644
index 0000000..b8361c8
--- /dev/null
+++ b/gnome-base/gnome-desktop/gnome-desktop-2.24.1.ebuild
@@ -0,0 +1,45 @@
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: Exp $
+
+inherit gnome2
+
+DESCRIPTION="Libraries for the gnome desktop that are not part of the UI"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd"
+IUSE="slab doc"
+
+RDEPEND=">=dev-libs/libxml2-2.4.20
+ >=x11-libs/gtk+-2.11.3
+ >=dev-libs/glib-2.15.4
+ >=x11-libs/libXrandr-1.2
+ >=gnome-base/gconf-2
+ >=gnome-base/libgnomeui-2.6
+ >=x11-libs/startup-notification-0.5"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ >=dev-util/intltool-0.40
+ >=dev-util/pkgconfig-0.9
+ >=app-text/gnome-doc-utils-0.3.2
+ doc? ( >=dev-util/gtk-doc-1.4 )
+ slab? ( gnome-base/gnome-main-menu )
+ ~app-text/docbook-xml-dtd-4.1.2
+ x11-proto/xproto"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="${G2CONF} --with-gnome-distributor=Gentoo --disable-scrollkeeper"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ use slab && epatch "${FILESDIR}"/gnome-desktop-recently-used-apps.patch
+
+ eautoreconf
+}
+
diff --git a/gnome-base/gnome-main-menu/Manifest b/gnome-base/gnome-main-menu/Manifest
new file mode 100644
index 0000000..24b064f
--- /dev/null
+++ b/gnome-base/gnome-main-menu/Manifest
@@ -0,0 +1,12 @@
+AUX 01-gnome-main-menu-autogen-noconfigure.patch 311 RMD160 95677c7e1b9ad70da4ed522e9698d9dfd73aa9a7 SHA1 3618e177a75d946c8ad790d2b47d18201bebc422 SHA256 2344463ea54327c2825329fe10bc574785ab022e8baebff247307d758efc5ace
+AUX 02-configure.in-remove-gtk-doc.patch 294 RMD160 f8b9ce6278f571100fed70ecc81fe90138684d66 SHA1 98a38d24d77d22cae147ce4ccb9613227cede22e SHA256 7cc166e363984001656f253848b31ac20322e11762d92efffc604393792c9f09
+AUX 03-tracker-search.patch 714 RMD160 daa5b0e6d26930edc0c53394e99286dd761b4021 SHA1 9faf44d33f002d5ebdbb93b212c6f429d933d83c SHA256 7c9477a924f30c0a869b8232b6f6b575a614d02f046c52896ef75468558d571f
+AUX 04-disable-search.patch 595 RMD160 6d50cf4442e34119909e47a11157d985a098681d SHA1 2e51810689bee5b69b13276c3bec3810418b7b4c SHA256 b901cdd617380c3024b7f8c8aaedfd3e84115ede27ff33ec67c427f9a692eced
+AUX gnome-main-menu-gentooifications.patch 1577 RMD160 15bc812e3847d85b541ad6ea3c76b1332251eca1 SHA1 17b899827f460d75f11f9776026189bd31043e98 SHA256 9770fbdf849bc9462c6b2f63879895c477d00950984a6668220459bcfec5dba2
+AUX gnome-main-menu-gentooifications.patch~ 1128 RMD160 76a34e92f3f0bde39639028ea019518ee240634e SHA1 a37f9d71a0a93012120d37678fc391b21948fe0e SHA256 1df9cc635b058416c956c5f3c4d7b48ec82e9e6386552e8af5ee6359e7587516
+AUX gnome-main-menu-shutdown-add.patch 1243 RMD160 6e46d2af5d157c7c83f5255133115ea424ca1c5c SHA1 e7ad0e17670d5ed01e690ca06b1a9750720aff18 SHA256 d2dd99e9b9e3b260ada980e1c11bc42405f9928454066335ea70bd70ccd2b9e1
+AUX gnome-main-menu-shutdown-add.patch~ 756 RMD160 9b8daaf622be64120ffe9fc881c80a3579a002fd SHA1 04fbfc159b1b20b537dd5d9033faa2185984593a SHA256 177f52e034221f494f948474a25488ad2a579a88bb16eb8f4d7a0928c03feffa
+AUX gnome-session-shutdown.desktop 245 RMD160 896aed8e30687a95b7ab71fd8bef5c93c2683f5e SHA1 a2f6d7419847a19ca51ee0b5dea5eddcc7d33de2 SHA256 b085dbd59997c5f92cdcdfe741fc67048261c4260f61ab254bd202ea7eff5aca
+EBUILD gnome-main-menu-0.9.10.ebuild 2007 RMD160 f7b51e35b8a0cbc72d6567bb857688842a9b3d5d SHA1 1b96f8a0982cf3732497d464490eca304e60de94 SHA256 9e49c2b292a0f1fefe1214ef7819d9a6cf2a7b26f6ef4a1d666b9de881a0881f
+EBUILD gnome-main-menu-9999.ebuild 2253 RMD160 451adb71eac9d1ad56e16915d4df75d7d5cb4bfb SHA1 cf4a903ebb03728b9c643d80cac9e7a1e04097e3 SHA256 06f65e0677993d7fea29892ec65e1364eaa7caba9dd7874741c94e3698278c9a
+MISC gnome-main-menu-9999.ebuild~ 2252 RMD160 225a97894f974164b6ab4796d265e40931ee16d3 SHA1 249c2d96a75ed9e43c744815fafe00010418f23a SHA256 a80f17b5bdc7763cbb978f245e5f2170a9839401600f04c66661bd83edf68176
diff --git a/gnome-base/gnome-main-menu/files/01-gnome-main-menu-autogen-noconfigure.patch b/gnome-base/gnome-main-menu/files/01-gnome-main-menu-autogen-noconfigure.patch
new file mode 100644
index 0000000..5e5bff6
--- /dev/null
+++ b/gnome-base/gnome-main-menu/files/01-gnome-main-menu-autogen-noconfigure.patch
@@ -0,0 +1,9 @@
+diff -ru slab-orig/autogen.sh slab/autogen.sh
+--- slab-orig/autogen.sh 2006-07-31 23:01:39.910532952 -0600
++++ slab/autogen.sh 2006-07-31 23:04:12.209380008 -0600
+@@ -23,4 +23,4 @@
+ exit 1
+ fi
+
+-REQUIRED_AUTOMAKE_VERSION=1.9 . gnome-autogen.sh
++REQUIRED_AUTOMAKE_VERSION=1.9 NOCONFIGURE=1 . gnome-autogen.sh
diff --git a/gnome-base/gnome-main-menu/files/02-configure.in-remove-gtk-doc.patch b/gnome-base/gnome-main-menu/files/02-configure.in-remove-gtk-doc.patch
new file mode 100644
index 0000000..d0a8768
--- /dev/null
+++ b/gnome-base/gnome-main-menu/files/02-configure.in-remove-gtk-doc.patch
@@ -0,0 +1,11 @@
+--- configure.in 2008-03-04 20:13:29.000000000 -0600
++++ configure.in 2008-03-04 20:13:53.000000000 -0600
+@@ -187,8 +187,6 @@
+ dnl End: Nautilus Extension
+ dnl ==============================================
+
+-GTK_DOC_CHECK(1.0)
+-
+ AC_CONFIG_FILES([
+ Makefile
+ application-browser/etc/Makefile
diff --git a/gnome-base/gnome-main-menu/files/03-tracker-search.patch b/gnome-base/gnome-main-menu/files/03-tracker-search.patch
new file mode 100644
index 0000000..172f782
--- /dev/null
+++ b/gnome-base/gnome-main-menu/files/03-tracker-search.patch
@@ -0,0 +1,13 @@
+Index: main-menu/etc/slab.schemas.in.in
+===================================================================
+--- main-menu/etc/slab.schemas.in.in (revision 278)
++++ main-menu/etc/slab.schemas.in.in (working copy)
+@@ -77,7 +77,7 @@
+ <applyto>/desktop/gnome/applications/main-menu/search_command</applyto>
+ <owner>gnome-main-menu</owner>
+ <type>string</type>
+- <default>beagle-search SEARCH_STRING</default>
++ <default>tracker-search-tool SEARCH_STRING</default>
+ <locale name="C">
+ <short>This is the command to execute when the search entry is used.</short>
+ <long>This is the command to execute when the search entry is used. SEARCH_STRING is replaced with the entered search text.</long>
diff --git a/gnome-base/gnome-main-menu/files/04-disable-search.patch b/gnome-base/gnome-main-menu/files/04-disable-search.patch
new file mode 100644
index 0000000..d5c3ce7
--- /dev/null
+++ b/gnome-base/gnome-main-menu/files/04-disable-search.patch
@@ -0,0 +1,13 @@
+Index: main-menu/etc/slab.schemas.in.in
+===================================================================
+--- main-menu/etc/slab.schemas.in.in (revision 278)
++++ main-menu/etc/slab.schemas.in.in (working copy)
+@@ -186,7 +186,7 @@
+ <applyto>/desktop/gnome/applications/main-menu/lock-down/search_area_visible</applyto>
+ <owner>gnome-main-menu</owner>
+ <type>bool</type>
+- <default>true</default>
++ <default>false</default>
+ <locale name="C">
+ <short>lock-down status for the search area</short>
+ <long>set to true if the search area should be visible and active.</long>
diff --git a/gnome-base/gnome-main-menu/files/digest-gnome-main-menu-9999 b/gnome-base/gnome-main-menu/files/digest-gnome-main-menu-9999
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gnome-base/gnome-main-menu/files/digest-gnome-main-menu-9999
diff --git a/gnome-base/gnome-main-menu/files/gnome-main-menu-gentooifications.patch b/gnome-base/gnome-main-menu/files/gnome-main-menu-gentooifications.patch
new file mode 100644
index 0000000..ec28b07
--- /dev/null
+++ b/gnome-base/gnome-main-menu/files/gnome-main-menu-gentooifications.patch
@@ -0,0 +1,30 @@
+--- main-menu/etc/applications.xbel
++++ main-menu/etc/applications.xbel
+@@ -3,7 +3,7 @@
+ xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+ xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+ >
+- <bookmark href="MozillaFirefox.desktop" added="2007-01-16T05:51:22Z" modified="2007-01-16T05:51:22Z" visited="2007-01-16T05:51:22Z">
++ <bookmark href="mozilla-firefox-bin.desktop" added="2007-01-16T05:51:22Z" modified="2007-01-16T05:51:22Z" visited="2007-01-16T05:51:22Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/x-desktop"/>
+--- main-menu/etc/system-items.xbel.orig 2008-11-02 00:37:16.000000000 +0100
++++ main-menu/etc/system-items.xbel 2008-11-02 00:37:00.000000000 +0100
+@@ -30,7 +30,7 @@
+ </metadata>
+ </info>
+ </bookmark>
+- <bookmark href="package-manager.desktop" added="2007-01-16T05:53:36Z" modified="2007-01-16T05:53:36Z" visited="2007-01-16T05:53:36Z">
++ <bookmark href="porthole.desktop" added="2007-01-16T05:53:36Z" modified="2007-01-16T05:53:36Z" visited="2007-01-16T05:53:36Z">
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/x-desktop"/>
+@@ -44,6 +44,7 @@
+ </info>
+ </bookmark>
+ <bookmark href="gnome-screensaver-lock.desktop" added="2007-01-16T05:53:36Z" modified="2007-01-16T05:53:36Z" visited="2007-01-16T05:53:36Z">
++ <title>Lock Screen</title>
+ <info>
+ <metadata owner="http://freedesktop.org">
+ <mime:mime-type type="application/x-desktop"/>
diff --git a/gnome-base/gnome-main-menu/files/gnome-main-menu-shutdown-add.patch b/gnome-base/gnome-main-menu/files/gnome-main-menu-shutdown-add.patch
new file mode 100644
index 0000000..d55fee2
--- /dev/null
+++ b/gnome-base/gnome-main-menu/files/gnome-main-menu-shutdown-add.patch
@@ -0,0 +1,29 @@
+--- main-menu/etc/system-items.xbel.orig 2008-11-02 00:40:19.000000000 +0100
++++ main-menu/etc/system-items.xbel 2008-11-02 00:41:33.000000000 +0100
+@@ -71,4 +71,15 @@
+ </metadata>
+ </info>
+ </bookmark>
++ <bookmark href="gnome-session-shutdown.desktop" added="2007-01-16T05:53:36Z" modified="2007-01-16T05:53:36Z" visited="2007-01-16T05:53:36Z">
++ <title>Shutdown</title>
++ <info>
++ <metadata owner="http://freedesktop.org">
++ <mime:mime-type type="application/x-desktop"/>
++ <bookmark:applications>
++ <bookmark:application name="Shutdown" exec="gnome-session-save --shutdown-dialog" timestamp="1168926816" count="1"/>
++ </bookmark:applications>
++ </metadata>
++ </info>
++ </bookmark>
+ </xbel>
+--- main-menu/etc/Makefile.am.orig 2008-11-02 00:57:12.000000000 +0100
++++ main-menu/etc/Makefile.am 2008-11-02 00:57:22.000000000 +0100
+@@ -10,7 +10,7 @@
+ ui_DATA = GNOME_MainMenu_ContextMenu.xml
+
+ desktopdir = $(datadir)/applications
+-desktop_DATA = gnome-screensaver-lock.desktop gnome-session-kill.desktop
++desktop_DATA = gnome-screensaver-lock.desktop gnome-session-kill.desktop gnome-session-shutdown.desktop
+ @INTLTOOL_DESKTOP_RULE@
+
+ bookmarkdir = $(datadir)/gnome-main-menu
diff --git a/gnome-base/gnome-main-menu/files/gnome-session-shutdown.desktop b/gnome-base/gnome-main-menu/files/gnome-session-shutdown.desktop
new file mode 100644
index 0000000..7ce068f
--- /dev/null
+++ b/gnome-base/gnome-main-menu/files/gnome-session-shutdown.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Name=Shutdown
+Encoding=UTF-8
+Version=1.0
+Icon=gnome-shutdown
+Exec=gnome-session-save --shutdown-dialog
+Terminal=false
+Type=Application
+Categories=GNOME;Application;System
+OnlyShowIn=GNOME;
+X-Ubuntu-Gettext-Domain=gnome-main-menu
diff --git a/gnome-base/gnome-main-menu/gnome-main-menu-0.9.10.ebuild b/gnome-base/gnome-main-menu/gnome-main-menu-0.9.10.ebuild
new file mode 100644
index 0000000..4eefc41
--- /dev/null
+++ b/gnome-base/gnome-main-menu/gnome-main-menu-0.9.10.ebuild
@@ -0,0 +1,64 @@
+# Copyright 2000-2006 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/gnome-extra/slab/slab-1.9999.ebuild,v 1.11 2006/07/02 20:24:08 vapier Exp $
+
+inherit eutils subversion mono gnome2
+
+DESCRIPTION="The new Desktop Menu from SuSE Linux Enterprise by Novell"
+HOMEPAGE="http://www.novell.com/products/desktop/preview.html"
+
+# Have to set SRC_URI blank or gnome2 eclass tries to fetch ${P}.tar.gz
+SRC_URI=""
+
+ESVN_REPO_URI="http://svn.gnome.org/svn/gnome-main-menu/tags/GNOME_MAIN_MENU_0_9_10"
+
+LICENSE="LGPL-2.1"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="beagle nautilus doc tracker"
+
+# We have USE flags depending on each other, which leads to this logic. We
+# prefer an activated USE flag and override the dependent USE flags.
+
+RDEPEND=">=net-misc/networkmanager-0.6.3
+ >=sys-apps/dbus-0.30
+ >=gnome-base/libgtop-2.14.1
+ >=sys-apps/hal-0.5.7-r3
+ beagle? ( app-misc/beagle )
+ tracker? ( app-misc/tracker )
+ nautilus? ( gnome-base/nautilus )"
+DEPEND="${RDEPEND}
+ doc? (
+ app-doc/doxygen
+ )
+ gnome-base/gnome-common"
+
+DOCS="AUTHORS COPYING ChangeLog README NEWS"
+
+G2CONF="${G2CONF} $(use_enable nautilus nautilus-extension)"
+G2CONF="${G2CONF} $(use_enable doc gtk-doc)"
+
+src_unpack() {
+ subversion_src_unpack
+ cd ${S}
+
+ gnome2_omf_fix
+ epatch ${FILESDIR}/01-${PN}-autogen-noconfigure.patch
+ use doc || epatch ${FILESDIR}/02-configure.in-remove-gtk-doc.patch
+ if use tracker && ! use beagle ; then
+ epatch ${FILESDIR}/03-tracker-search.patch
+ elif ! use tracker && ! use beagle ; then
+ epatch ${FILESDIR}/04-disable-search.patch
+ fi
+
+ ./autogen.sh --libexecdir=/usr/libexec --sysconfdir=/etc --libdir=/usr/lib --includedir=/usr/include --sbindir=/sbin
+}
+
+pkg_postinst() {
+ gnome2_pkg_postinst
+ if use tracker && use beagle ; then
+ ewarn "You have both beagle and tracker set in your USE flags."
+ ewarn "Beagle will be used by default. If you would like to use"
+ ewarn "tracker, emerge this package with the beagle USE flag unset."
+ fi
+}
diff --git a/gnome-base/gnome-main-menu/gnome-main-menu-9999.ebuild b/gnome-base/gnome-main-menu/gnome-main-menu-9999.ebuild
new file mode 100644
index 0000000..57e3b11
--- /dev/null
+++ b/gnome-base/gnome-main-menu/gnome-main-menu-9999.ebuild
@@ -0,0 +1,83 @@
+# Copyright 2000-2006 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+inherit autotools eutils subversion gnome2
+
+DESCRIPTION="The new Desktop Menu from SUSE"
+HOMEPAGE="http://www.novell.com/products/desktop/preview.html"
+
+# Have to set SRC_URI blank or gnome2 eclass tries to fetch package
+SRC_URI=""
+
+ESVN_REPO_URI="http://svn.gnome.org/svn/gnome-main-menu/trunk"
+
+S="${WORKDIR}/${PN}"
+
+LICENSE="LGPL-2.1"
+SLOT="0"
+KEYWORDS="~x86"
+IUSE="beagle doc libssui nautilus tracker"
+
+RDEPEND=">=dev-libs/glib-2.12
+ >=x11-libs/gtk+-2.13.3
+ >=gnome-base/libglade-2
+ >=gnome-base/gnome-desktop-2
+ >=gnome-base/gnome-panel-2
+ >=gnome-base/librsvg-2
+ >=gnome-base/gnome-menus-2
+ >=gnome-base/gconf-2
+ >=gnome-base/libgtop-2
+ >=gnome-base/libgnome-2
+ >=gnome-base/libgnomeui-2
+ dev-libs/dbus-glib
+ >=net-misc/networkmanager-0.7
+ sys-apps/hal
+ x11-libs/cairo
+ x11-libs/pango
+ libssui? ( >=gnome-extra/libssui-0.5.6 )
+ nautilus? ( >=gnome-base/nautilus-2.6 )
+ tracker? ( app-misc/tracker )"
+
+DEPEND="${RDEPEND}
+ doc? (
+ dev-util/gtk-doc
+ )"
+
+src_unpack() {
+ subversion_src_unpack
+ cd ${S}
+
+ gnome2_omf_fix
+
+ epatch "${FILESDIR}"/gnome-main-menu-gentooifications.patch
+ # shutdown
+ epatch "${FILESDIR}"/gnome-main-menu-shutdown-add.patch
+ cp ${FILESDIR}/gnome-session-shutdown.desktop main-menu/etc/
+
+ use libssui && epatch "${FILESDIR}"/gnome-main-menu-libssui.patch
+ use doc || epatch "${FILESDIR}"/02-configure.in-remove-gtk-doc.patch
+ if use tracker && ! use beagle ; then
+ epatch ${FILESDIR}/03-tracker-search.patch
+ elif ! use tracker && ! use beagle ; then
+ epatch ${FILESDIR}/04-disable-search.patch
+ fi
+
+ G2CONF="`use_enable nautilus nautilus-extension`"
+ intltoolize --force || die "intloolize failed"
+ eautoreconf || die "eautoreconf failed"
+}
+
+pkg_postinst() {
+
+ elog
+ elog " If you want to have recent applications-support working, you should "
+ elog " also use the patched gnome-panel and gnome-desktop packages from this "
+ elog " overlay "
+ elog
+ if use tracker && use beagle ; then
+ ewarn " You have both beagle and tracker set in your USE flags. "
+ ewarn " Beagle will be used by default. If you would like to use "
+ ewarn " tracker, emerge this package with the beagle USE flag unset. "
+ fi
+}
diff --git a/gnome-base/gnome-mount/Manifest b/gnome-base/gnome-mount/Manifest
new file mode 100644
index 0000000..8e80bad
--- /dev/null
+++ b/gnome-base/gnome-mount/Manifest
@@ -0,0 +1,2 @@
+DIST gnome-mount-0.8.tar.gz 505788 RMD160 003800eda3edb7747714b1002bd1a1b50ea44fe9 SHA1 846ba178cf9009f3e32c7f55f912b3ca6b9ecedb SHA256 44ca6b78b49a4181435e489c7b7d416c8f26442dcecdc01ec4b981274ed957e2
+EBUILD gnome-mount-0.8.ebuild 881 RMD160 1a29b6f9ed80604793443cd9ff3f5efcced6b287 SHA1 9d62a7a25b9961529bcb9afcc759fa408f9bec71 SHA256 968b1eb91a44fcf9e4651b0e970869a628724da164fbcbec90c09bfc8fd07ba9
diff --git a/gnome-base/gnome-mount/gnome-mount-0.8.ebuild b/gnome-base/gnome-mount/gnome-mount-0.8.ebuild
new file mode 100644
index 0000000..dd8e30d
--- /dev/null
+++ b/gnome-base/gnome-mount/gnome-mount-0.8.ebuild
@@ -0,0 +1,36 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: Exp $
+
+inherit eutils gnome2
+
+DESCRIPTION="HAL wrapper for (un)mounting and ejecting disks"
+HOMEPAGE="http://hal.freedesktop.org/"
+SRC_URI="http://hal.freedesktop.org/releases/${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="nautilus"
+
+RDEPEND=">=x11-libs/gtk+-2.8
+ >=gnome-base/gconf-2
+ >=gnome-base/gnome-keyring-0.4.0
+ >=sys-apps/hal-0.5.8.1
+ >=dev-libs/dbus-glib-0.71
+ >=x11-libs/libnotify-0.3.0
+ nautilus? (
+ >=gnome-base/libglade-2
+ >=gnome-base/nautilus-2.5
+ >=gnome-base/eel-2.5
+ )"
+DEPEND="${RDEPEND}
+ sys-devel/gettext
+ dev-util/pkgconfig
+ >=dev-util/intltool-0.35.0"
+
+DOCS="AUTHORS ChangeLog HACKING INSTALL NEWS README TODO"
+
+pkg_setup() {
+ G2CONF="$(use_enable nautilus nautilus_extension)"
+}
diff --git a/gnome-base/gnome-panel/Manifest b/gnome-base/gnome-panel/Manifest
new file mode 100644
index 0000000..0bd5bec
--- /dev/null
+++ b/gnome-base/gnome-panel/Manifest
@@ -0,0 +1,20 @@
+AUX gnome-panel-alt-f1-slab.patch 1458 RMD160 090bee7ad7933426509fde2a7305a410ebe92af8 SHA1 78b45ef6ca4234db783b3f23de4f2b9410a83c70 SHA256 d085431812451f471fa78aacd37f0fde85bc5e6588a7e525d3187002aa7f91e4
+AUX gnome-panel-recently-used-apps.patch 4948 RMD160 ebb5b64a0a0573ad5794670985cdd723fe78c830 SHA1 9d4555f328a0cdc7dd9df5f39b0d160dc39d7845 SHA256 33bf7902537bb36dd405532d69d40a6cda7a22607e8b254b4173584d8af72390
+AUX gnome-panel-recently-used-apps.patch~ 4933 RMD160 12071989addf1fa4ffc21c3b00198e2b0db3ffd2 SHA1 18c255bd31587d07d2c49d987cb9613c7133eabb SHA256 20a248d37f035e646f7b23e704f20161e45d2d572f9c35368d15052f1f3d70be
+DIST gnome-panel-2.18.1.tar.bz2 2713127 RMD160 380a87bb366ed788110eea55803e33a3b519ca93 SHA1 c690833d3e409cb9b22413aa987163b9d6d3b8b4 SHA256 c04b53bcc0057ed042169baa725ed3769194864e5824643cc0af8c58cf773d2c
+DIST gnome-panel-2.18.3.tar.bz2 2722555 RMD160 346c3e981de3af98632d43511545b1877cf9cb5e SHA1 a521b722a1cc753ea0fa3ed7dcf5262750235f9a SHA256 efb12148ace94612b47add4060dd9ae088b47e09e5c4c223f8ab7e1c7dcc9410
+DIST gnome-panel-2.20.0.1.tar.bz2 2804616 RMD160 c48fd450c62e129344a3c33568ec018fbefc5572 SHA1 7743a9653f36a80161b5c63f5a7e2ee51b7b3387 SHA256 70214f2242f1fae76c42a0ed498ccadf776691204181f61fcb95da5e16539dfa
+DIST gnome-panel-2.20.2.tar.bz2 2835817 RMD160 e883139c8c873290e7d854c1a45642ff0d34c2a8 SHA1 d3bf83e825afc47e620129f63b0fd00229ef12a7 SHA256 c5415f4c708d7a2bb88a2e1075a73b965adeae8cc790705f57c51170d920779e
+DIST gnome-panel-2.22.2.tar.bz2 3255261 RMD160 64a37f44b9f34f74d30f30aca349749a24c80859 SHA1 73752c3ce6224886c2381b0b13111253008bc6f7 SHA256 e1ecc0ddc5a09481deb2daa1f30fa14472bfed541db46bb4f49f3d0d728b0a45
+DIST gnome-panel-2.24.1.tar.bz2 3354268 RMD160 84e7ccd0425c567c9b800cdfecb653f206cdf768 SHA1 01a2376582ba81b006511279767cb74ecb3332af SHA256 35a845990a8f56da191615a82e22f1be47657476647f4fb5c5148668cc999907
+EBUILD gnome-panel-2.18.1-r1.ebuild 2071 RMD160 3889a426eca2417afb202db438831c8240c60a51 SHA1 25b22ab5cd4aa7b1b68019c5308a8c0146b1a970 SHA256 c610c1a7af2f16c2c630bab0d45eb87f91d0cc67e3b42a8f020ea5cc3d1ab69a
+EBUILD gnome-panel-2.18.3.ebuild 2057 RMD160 0fefcb446b87c9cfb2c1e62080b413194a40de8a SHA1 8fefe824442df1335ceb838cc1e668e3d44aebfe SHA256 282c86f64ea3613f9f777cc06a9cd35d7bee9e178fff45e7badec679ca1021ed
+EBUILD gnome-panel-2.20.0.1.ebuild 2010 RMD160 460ab6b9aefc55701815032f97007992c9a52708 SHA1 ccfab7ea387efbb5b45e7062103fc88073190190 SHA256 303d30f8cf668c311defb611fca35a6da13214ef6fda05c208b97518de22872d
+EBUILD gnome-panel-2.20.2-r1.ebuild 2043 RMD160 eeb707d0f9a4f416ad534f30fb88f8bec0cb4bb3 SHA1 7dae92ab069e3d6195077b345694dbb99761cba9 SHA256 e9d97d83b964ce6ffcc56b1be9730413b90b09380d7c76c4f4a50da7a41ba9f0
+EBUILD gnome-panel-2.20.2.ebuild 2099 RMD160 bcf764d1cdd8297b0fe2338954dfa01442445756 SHA1 fbf2a9ccaf165cd651d2347ecd84defc36b8df0a SHA256 c03894138e2c35cb9295de6bcf90f912d0e986a02b9068a74daaea4ddab92885
+EBUILD gnome-panel-2.22.2.ebuild 2224 RMD160 98d295b3bf493ce6a94788b5e36a71a91acac730 SHA1 d7881e50273f5ba53e71ca39bbaf3be42051ca51 SHA256 655cecb4484aaca19aac7e0d4687baacd280d438a686dc1dfdd40675ae4c9c28
+EBUILD gnome-panel-2.24.1.ebuild 2206 RMD160 d571dad7e648a322ff1d0185e38ff3349683bf86 SHA1 91515827cc4033d69b6ac79e2b1f52729a76125f SHA256 e1cc6a8966a9f452150f1c00f81ea2d6750d24404fd2d043f398850f35e9c433
+MISC gnome-panel-2.18.3.ebuild~ 1937 RMD160 9dbf95ed408785b47a604c09a3b6915ce0df75bb SHA1 4719c4ca69af931191c2307eb31284cae553405d SHA256 1515363e70595b8675bcd8fd0fbca62c2123d1a18e3a7720701896ad614dfb9d
+MISC gnome-panel-2.20.0.1.ebuild~ 1995 RMD160 b44e367c48c467d079e5445605f44ad1d28ade76 SHA1 821ccd66ee8430d15dc98d55c8c5a4560703358e SHA256 4f2ea5f22d687dc4cd2ac64e87785e8046c0f166e9b047ae4cd3cdedc015593f
+MISC gnome-panel-2.20.2.ebuild~ 2010 RMD160 460ab6b9aefc55701815032f97007992c9a52708 SHA1 ccfab7ea387efbb5b45e7062103fc88073190190 SHA256 303d30f8cf668c311defb611fca35a6da13214ef6fda05c208b97518de22872d
+MISC gnome-panel-2.24.1.ebuild~ 2311 RMD160 096a7b08768e7ac7ac57b92a942e033341032d96 SHA1 216954a2e1f26800d61293c011525b473dbc96ae SHA256 2e8dfd8903e7e5786564d78ccfd187c4a534a27d5a107492e801a3b9faf46ebe
diff --git a/gnome-base/gnome-panel/files/digest-gnome-panel-2.18.1 b/gnome-base/gnome-panel/files/digest-gnome-panel-2.18.1
new file mode 100644
index 0000000..b0cc53d
--- /dev/null
+++ b/gnome-base/gnome-panel/files/digest-gnome-panel-2.18.1
@@ -0,0 +1,3 @@
+MD5 6c325f5b5f9f424faa494665720bcfb9 gnome-panel-2.18.1.tar.bz2 2713127
+RMD160 380a87bb366ed788110eea55803e33a3b519ca93 gnome-panel-2.18.1.tar.bz2 2713127
+SHA256 c04b53bcc0057ed042169baa725ed3769194864e5824643cc0af8c58cf773d2c gnome-panel-2.18.1.tar.bz2 2713127
diff --git a/gnome-base/gnome-panel/files/digest-gnome-panel-2.18.1-r1 b/gnome-base/gnome-panel/files/digest-gnome-panel-2.18.1-r1
new file mode 100644
index 0000000..b0cc53d
--- /dev/null
+++ b/gnome-base/gnome-panel/files/digest-gnome-panel-2.18.1-r1
@@ -0,0 +1,3 @@
+MD5 6c325f5b5f9f424faa494665720bcfb9 gnome-panel-2.18.1.tar.bz2 2713127
+RMD160 380a87bb366ed788110eea55803e33a3b519ca93 gnome-panel-2.18.1.tar.bz2 2713127
+SHA256 c04b53bcc0057ed042169baa725ed3769194864e5824643cc0af8c58cf773d2c gnome-panel-2.18.1.tar.bz2 2713127
diff --git a/gnome-base/gnome-panel/files/digest-gnome-panel-2.18.3 b/gnome-base/gnome-panel/files/digest-gnome-panel-2.18.3
new file mode 100644
index 0000000..f415a7e
--- /dev/null
+++ b/gnome-base/gnome-panel/files/digest-gnome-panel-2.18.3
@@ -0,0 +1,3 @@
+MD5 545348de234fa8222e328fa7f3a5ba71 gnome-panel-2.18.3.tar.bz2 2722555
+RMD160 346c3e981de3af98632d43511545b1877cf9cb5e gnome-panel-2.18.3.tar.bz2 2722555
+SHA256 efb12148ace94612b47add4060dd9ae088b47e09e5c4c223f8ab7e1c7dcc9410 gnome-panel-2.18.3.tar.bz2 2722555
diff --git a/gnome-base/gnome-panel/files/digest-gnome-panel-2.20.0.1 b/gnome-base/gnome-panel/files/digest-gnome-panel-2.20.0.1
new file mode 100644
index 0000000..bfd4ac9
--- /dev/null
+++ b/gnome-base/gnome-panel/files/digest-gnome-panel-2.20.0.1
@@ -0,0 +1,3 @@
+MD5 bead455015de6bd86bb7259e6276af9e gnome-panel-2.20.0.1.tar.bz2 2804616
+RMD160 c48fd450c62e129344a3c33568ec018fbefc5572 gnome-panel-2.20.0.1.tar.bz2 2804616
+SHA256 70214f2242f1fae76c42a0ed498ccadf776691204181f61fcb95da5e16539dfa gnome-panel-2.20.0.1.tar.bz2 2804616
diff --git a/gnome-base/gnome-panel/files/digest-gnome-panel-2.20.2 b/gnome-base/gnome-panel/files/digest-gnome-panel-2.20.2
new file mode 100644
index 0000000..ee531b2
--- /dev/null
+++ b/gnome-base/gnome-panel/files/digest-gnome-panel-2.20.2
@@ -0,0 +1,3 @@
+MD5 400924a82c03ec04f7842348625e1f4a gnome-panel-2.20.2.tar.bz2 2835817
+RMD160 e883139c8c873290e7d854c1a45642ff0d34c2a8 gnome-panel-2.20.2.tar.bz2 2835817
+SHA256 c5415f4c708d7a2bb88a2e1075a73b965adeae8cc790705f57c51170d920779e gnome-panel-2.20.2.tar.bz2 2835817
diff --git a/gnome-base/gnome-panel/files/gnome-panel-alt-f1-slab.patch b/gnome-base/gnome-panel/files/gnome-panel-alt-f1-slab.patch
new file mode 100644
index 0000000..084e1bf
--- /dev/null
+++ b/gnome-base/gnome-panel/files/gnome-panel-alt-f1-slab.patch
@@ -0,0 +1,47 @@
+--- gnome-panel-2.12.2-orig/gnome-panel/panel-action-protocol.c 2005-01-12 05:16:41.000000000 +0100
++++ gnome-panel-2.12.2/gnome-panel/panel-action-protocol.c 2006-05-11 15:01:49.000000000 +0200
+@@ -50,6 +50,7 @@ panel_action_protocol_main_menu (GdkScre
+ PanelWidget *panel_widget;
+ GtkWidget *menu;
+ AppletInfo *info;
++ gchar *path;
+
+ info = panel_applet_get_by_type (PANEL_OBJECT_MENU_BAR, screen);
+ if (info) {
+@@ -65,6 +66,36 @@ panel_action_protocol_main_menu (GdkScre
+ return;
+ }
+
++ path = g_find_program_in_path ("application-browser");
++ if (path) {
++ static Atom action_atom = None, type_atom = None;
++ static gboolean atoms_init = FALSE;
++ XClientMessageEvent ev;
++ Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
++
++ if (!atoms_init) {
++ action_atom = XInternAtom (xdisplay, "_SLAB_ACTION_MAIN_MENU", FALSE);
++ type_atom = XInternAtom (xdisplay, "_SLAB_ACTION", FALSE);
++
++ atoms_init = TRUE;
++ }
++
++ ev.type = ClientMessage;
++ ev.window = RootWindow (xdisplay, DefaultScreen (xdisplay));
++ ev.message_type = type_atom;
++ ev.format = 32;
++ ev.data.l[0] = action_atom;
++ ev.data.l[1] = activate_time;
++
++ XUngrabKeyboard (xdisplay, activate_time);
++ XSendEvent (xdisplay, RootWindow (xdisplay, DefaultScreen (xdisplay)),
++ True, StructureNotifyMask, (XEvent*) &ev);
++
++ g_free (path);
++
++ return;
++ }
++
+ panel_widget = panels->data;
+ menu = create_main_menu (panel_widget);
+
diff --git a/gnome-base/gnome-panel/files/gnome-panel-recently-used-apps.patch b/gnome-base/gnome-panel/files/gnome-panel-recently-used-apps.patch
new file mode 100644
index 0000000..972b048
--- /dev/null
+++ b/gnome-base/gnome-panel/files/gnome-panel-recently-used-apps.patch
@@ -0,0 +1,196 @@
+--- gnome-panel-2.20.0.1/gnome-panel/panel-run-dialog.c.old 2007-10-14 17:06:13.000000000 +0200
++++ gnome-panel-2.20.0.1/gnome-panel/panel-run-dialog.c 2007-10-14 17:09:26.000000000 +0200
+@@ -61,6 +61,14 @@
+ #include "panel-xutils.h"
+ #include "panel-icon-names.h"
+
++#include <gtk/gtkversion.h>
++#if GTK_CHECK_VERSION (2,10,0)
++# define USE_GTK_RECENT_MANAGER
++# include <gtk/gtkrecentmanager.h>
++#else
++# include "egg-recent-model.h"
++#endif
++
+ typedef struct {
+ GtkWidget *run_dialog;
+
+@@ -114,6 +122,8 @@ static PanelRunDialog *static_dialog = N
+
+ static void panel_run_dialog_disconnect_pixmap (PanelRunDialog *dialog);
+
++static void panel_run_dialog_update_recent_apps (PanelRunDialog *dialog, const gchar *cmd);
++
+ static void
+ panel_run_dialog_destroy (PanelRunDialog *dialog)
+ {
+@@ -438,6 +448,8 @@ panel_run_dialog_execute (PanelRunDialog
+ gnome_entry_prepend_history (GNOME_ENTRY (dialog->gnome_entry),
+ TRUE, /* save item in history */
+ command);
++
++ panel_run_dialog_update_recent_apps (dialog, command);
+
+ /* only close the dialog if we successfully showed or launched something */
+ gtk_widget_destroy (dialog->run_dialog);
+@@ -690,6 +702,160 @@ panel_run_dialog_find_command_idle (Pane
+ return FALSE;
+ }
+
++static void
++panel_run_dialog_update_recent_apps (PanelRunDialog *dialog, const gchar *cmd)
++{
++ GtkTreeIter iter;
++ GtkTreeModel *model = NULL;
++ GtkTreePath *path = NULL;
++
++ gchar *found_ditem_path = NULL;
++ gchar *found_ditem_uri = NULL;
++ gchar *found_cmd = NULL;
++
++ gchar *cmd_i;
++ gchar *ditem_path_i;
++
++ gboolean fuzzy;
++
++#ifdef USE_GTK_RECENT_MANAGER
++ GtkRecentManager *recent_manager;
++ GtkRecentData recent_data;
++#else
++ EggRecentModel *recent_model;
++ EggRecentItem *recent_item;
++#endif
++
++ GError *error = NULL;
++
++
++ if (! cmd)
++ return;
++
++ model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->program_list));
++ path = gtk_tree_path_new_first ();
++
++ if (! path || ! gtk_tree_model_get_iter (model, & iter, path)) {
++ if (path)
++ gtk_tree_path_free (path);
++
++ return;
++ }
++
++ do {
++ cmd_i = NULL;
++ ditem_path_i = NULL;
++
++ gtk_tree_model_get (
++ model, & iter,
++ COLUMN_EXEC, & cmd_i,
++ COLUMN_PATH, & ditem_path_i,
++ -1
++ );
++
++ if (cmd_i && ditem_path_i) {
++ fuzzy = FALSE;
++
++ if (fuzzy_command_match (sure_string (cmd), cmd_i, & fuzzy)) {
++ g_free (found_ditem_path);
++
++ found_ditem_path = g_strdup (ditem_path_i);
++ found_cmd = g_strdup (cmd_i);
++
++ if (! fuzzy) {
++ /*
++ * if not fuzzy then we have a precise
++ * match and we can quit, else keep
++ * searching for a better match
++ */
++ g_free (cmd_i);
++ g_free (ditem_path_i);
++
++ break;
++ }
++ }
++ }
++
++ g_free (cmd_i);
++ g_free (ditem_path_i);
++
++ } while (gtk_tree_model_iter_next (model, & iter));
++
++ gtk_tree_path_free (path);
++
++#ifdef USE_GTK_RECENT_MANAGER
++ recent_manager = gtk_recent_manager_get_default ();
++
++ if (! recent_manager)
++ goto exit;
++#else
++ recent_model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_NONE);
++
++ if (! recent_model)
++ goto exit;
++#endif
++
++ if (found_ditem_path) {
++ found_ditem_uri = g_filename_to_uri (found_ditem_path, NULL, & error);
++
++ if (! error) {
++#ifdef USE_GTK_RECENT_MANAGER
++ recent_data.display_name = NULL;
++ recent_data.description = NULL;
++ recent_data.mime_type = g_strdup ("application/x-desktop");
++ recent_data.is_private = TRUE;
++
++ recent_data.app_name = g_strdup (g_get_application_name ());
++ if (! recent_data.app_name)
++ recent_data.app_name = g_strdup ("gnome-panel run dialog");
++
++ recent_data.app_exec = g_strdup (g_strdup (found_cmd));
++ if (! recent_data.app_exec)
++ recent_data.app_exec = g_strdup ("gnome-open %u");
++
++ recent_data.groups = g_new0 (gchar *, 2);
++ recent_data.groups [0] = g_strdup ("recently-used-apps");
++ recent_data.groups [1] = NULL;
++
++ gtk_recent_manager_add_full (recent_manager, found_ditem_uri, & recent_data);
++
++ g_free (recent_data.mime_type);
++ g_free (recent_data.app_name);
++ g_free (recent_data.app_exec);
++ g_free (recent_data.groups [0]);
++ g_free (recent_data.groups);
++
++#else
++
++ recent_item = egg_recent_item_new_from_uri (found_ditem_uri);
++ egg_recent_item_add_group (recent_item, "recently-used-apps");
++ egg_recent_item_set_private (recent_item, TRUE);
++
++ egg_recent_model_add_full (recent_model, recent_item);
++
++ if (recent_item)
++ egg_recent_item_unref (recent_item);
++#endif
++ }
++ else {
++ g_warning ("unable to create uri from [%s] to insert into recent file list.\n",
++ found_ditem_path);
++
++ g_error_free (error);
++ }
++ }
++
++#ifndef USE_GTK_RECENT_MANAGER
++ g_object_unref (recent_model);
++#endif
++
++exit:
++
++ g_free (found_ditem_path);
++ g_free (found_ditem_uri);
++ g_free (found_cmd);
++}
++
+ static gboolean
+ panel_run_dialog_add_icon_idle (PanelRunDialog *dialog)
+ {
diff --git a/gnome-base/gnome-panel/gnome-panel-2.18.1-r1.ebuild b/gnome-base/gnome-panel/gnome-panel-2.18.1-r1.ebuild
new file mode 100644
index 0000000..ba42773
--- /dev/null
+++ b/gnome-base/gnome-panel/gnome-panel-2.18.1-r1.ebuild
@@ -0,0 +1,72 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-panel/gnome-panel-2.18.1.ebuild,v 1.1 2007/04/17 03:16:51 compnerd Exp $
+
+inherit eutils gnome2
+
+DESCRIPTION="The GNOME panel"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd"
+IUSE="doc eds"
+
+RDEPEND=">=gnome-base/gnome-desktop-2.12
+ >=x11-libs/gtk+-2.10
+ >=gnome-base/libglade-2.5
+ >=gnome-base/libgnome-2.13
+ >=gnome-base/libgnomeui-2.5.4
+ >=gnome-base/libbonoboui-2.1.1
+ >=gnome-base/orbit-2.4
+ >=gnome-base/gnome-vfs-2.14.2
+ >=x11-libs/libwnck-2.13.5
+ >=gnome-base/gconf-2.6.1
+ >=gnome-base/gnome-menus-2.11.1
+ >=gnome-base/libbonobo-2
+ || (
+ >=dev-libs/dbus-glib-0.71
+ ( <sys-apps/dbus-0.90 >=sys-apps/dbus-0.60 )
+ )
+ x11-libs/libXau
+ media-libs/libpng
+ >=x11-libs/cairo-1.0.0
+ >=x11-libs/pango-1.15.4
+ eds? ( >=gnome-extra/evolution-data-server-1.6 )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ >=dev-util/pkgconfig-0.9
+ >=dev-util/intltool-0.35
+ >=app-text/gnome-doc-utils-0.3.2
+ doc? ( >=dev-util/gtk-doc-1 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="--disable-scrollkeeper $(use_enable eds) \
+ --with-in-process-applets=clock,notification-area,wncklet"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ epatch ${FILESDIR}/gnome-panel-recently-used-apps.patch
+
+ # FIXME : uh yeah, this is nice
+ # We should patch in a switch here and send it upstream
+ sed -i 's:--load:-v:' ${S}/gnome-panel/Makefile.in || die "sed failed"
+}
+
+pkg_postinst() {
+ local entries="/etc/gconf/schemas/panel-default-setup.entries"
+ if [ -e "$entries" ]; then
+ einfo "setting panel gconf defaults..."
+ GCONF_CONFIG_SOURCE=`${ROOT}/usr/bin/gconftool-2 --get-default-source`
+ ${ROOT}/usr/bin/gconftool-2 --direct --config-source \
+ ${GCONF_CONFIG_SOURCE} --load=${entries}
+ fi
+
+ # Calling this late so it doesn't process the GConf schemas file we already
+ # took care of.
+ gnome2_pkg_postinst
+}
diff --git a/gnome-base/gnome-panel/gnome-panel-2.18.3.ebuild b/gnome-base/gnome-panel/gnome-panel-2.18.3.ebuild
new file mode 100644
index 0000000..d33ffd7
--- /dev/null
+++ b/gnome-base/gnome-panel/gnome-panel-2.18.3.ebuild
@@ -0,0 +1,72 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-panel/gnome-panel-2.18.3.ebuild,v 1.9 2007/09/22 09:25:48 tgall Exp $
+
+inherit gnome2
+
+DESCRIPTION="The GNOME panel"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="alpha amd64 arm hppa ia64 ppc ppc64 sh sparc x86 ~x86-fbsd"
+IUSE="doc eds slab"
+
+RDEPEND=">=gnome-base/gnome-desktop-2.12
+ >=x11-libs/gtk+-2.10
+ >=gnome-base/libglade-2.5
+ >=gnome-base/libgnome-2.13
+ >=gnome-base/libgnomeui-2.5.4
+ >=gnome-base/libbonoboui-2.1.1
+ >=gnome-base/orbit-2.4
+ >=gnome-base/gnome-vfs-2.14.2
+ >=x11-libs/libwnck-2.13.5
+ >=gnome-base/gconf-2.6.1
+ >=gnome-base/gnome-menus-2.11.1
+ >=gnome-base/libbonobo-2
+ >=dev-libs/dbus-glib-0.71
+ x11-libs/libXau
+ media-libs/libpng
+ >=x11-libs/cairo-1.0.0
+ >=x11-libs/pango-1.15.4
+ eds? ( >=gnome-extra/evolution-data-server-1.6 )
+ slab? ( gnome-base/gnome-main-menu )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ >=dev-util/pkgconfig-0.9
+ >=dev-util/intltool-0.35
+ >=app-text/gnome-doc-utils-0.3.2
+ doc? ( >=dev-util/gtk-doc-1 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="--disable-scrollkeeper $(use_enable eds) \
+ --with-in-process-applets=clock,notification-area,wncklet"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ if use slab; then
+ epatch ${FILESDIR}/gnome-panel-recently-used-apps.patch
+ fi
+
+ # FIXME : uh yeah, this is nice
+ # We should patch in a switch here and send it upstream
+ sed -i 's:--load:-v:' ${S}/gnome-panel/Makefile.in || die "sed failed"
+}
+
+pkg_postinst() {
+ local entries="/etc/gconf/schemas/panel-default-setup.entries"
+ if [ -e "$entries" ]; then
+ einfo "setting panel gconf defaults..."
+ GCONF_CONFIG_SOURCE=`${ROOT}/usr/bin/gconftool-2 --get-default-source`
+ ${ROOT}/usr/bin/gconftool-2 --direct --config-source \
+ ${GCONF_CONFIG_SOURCE} --load=${entries}
+ fi
+
+ # Calling this late so it doesn't process the GConf schemas file we already
+ # took care of.
+ gnome2_pkg_postinst
+}
diff --git a/gnome-base/gnome-panel/gnome-panel-2.20.0.1.ebuild b/gnome-base/gnome-panel/gnome-panel-2.20.0.1.ebuild
new file mode 100644
index 0000000..109143c
--- /dev/null
+++ b/gnome-base/gnome-panel/gnome-panel-2.20.0.1.ebuild
@@ -0,0 +1,74 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+inherit autotools eutils gnome2
+
+DESCRIPTION="The GNOME panel"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd"
+IUSE="doc eds slab"
+
+RDEPEND=">=gnome-base/gnome-desktop-2.12
+ >=x11-libs/pango-1.15.4
+ >=dev-libs/glib-2.13.0
+ >=x11-libs/gtk+-2.11.3
+ >=gnome-base/libglade-2.5
+ >=gnome-base/libgnome-2.13
+ >=gnome-base/libgnomeui-2.5.4
+ >=gnome-base/libbonoboui-2.1.1
+ >=gnome-base/orbit-2.4
+ >=gnome-base/gnome-vfs-2.14.2
+ >=x11-libs/libwnck-2.19.5
+ >=gnome-base/gconf-2.6.1
+ >=gnome-base/gnome-menus-2.11.1
+ >=gnome-base/libbonobo-2
+ >=dev-libs/dbus-glib-0.71
+ x11-libs/libXau
+ media-libs/libpng
+ >=x11-libs/cairo-1.0.0
+ eds? ( >=gnome-extra/evolution-data-server-1.6 )
+ slab? ( gnome-base/gnome-main-menu )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ >=dev-util/pkgconfig-0.9
+ >=dev-util/intltool-0.35
+ >=app-text/gnome-doc-utils-0.3.2
+ doc? ( >=dev-util/gtk-doc-1 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="--disable-scrollkeeper $(use_enable eds) \
+ --with-in-process-applets=clock,notification-area,wncklet"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ if use slab; then
+ epatch ${FILESDIR}/gnome-panel-recently-used-apps.patch
+ fi
+
+ # FIXME : uh yeah, this is nice
+ # We should patch in a switch here and send it upstream
+ sed -i 's:--load:-v:' "${S}/gnome-panel/Makefile.in" || die "sed failed"
+}
+
+pkg_postinst() {
+ local entries="/etc/gconf/schemas/panel-default-setup.entries"
+
+ if [ -e "$entries" ]; then
+ einfo "setting panel gconf defaults..."
+ GCONF_CONFIG_SOURCE=`"${ROOT}usr/bin/gconftool-2" --get-default-source`
+ "${ROOT}usr/bin/gconftool-2" --direct --config-source \
+ "${GCONF_CONFIG_SOURCE}" --load="${entries}"
+ fi
+
+ # Calling this late so it doesn't process the GConf schemas file we already
+ # took care of.
+ gnome2_pkg_postinst
+}
diff --git a/gnome-base/gnome-panel/gnome-panel-2.20.2-r1.ebuild b/gnome-base/gnome-panel/gnome-panel-2.20.2-r1.ebuild
new file mode 100644
index 0000000..0a546ad
--- /dev/null
+++ b/gnome-base/gnome-panel/gnome-panel-2.20.2-r1.ebuild
@@ -0,0 +1,75 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+inherit autotools eutils gnome2
+
+DESCRIPTION="The GNOME panel"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd"
+IUSE="doc eds slab"
+
+RDEPEND=">=gnome-base/gnome-desktop-2.12
+ >=x11-libs/pango-1.15.4
+ >=dev-libs/glib-2.13.0
+ >=x11-libs/gtk+-2.11.3
+ >=gnome-base/libglade-2.5
+ >=gnome-base/libgnome-2.13
+ >=gnome-base/libgnomeui-2.5.4
+ >=gnome-base/libbonoboui-2.1.1
+ >=gnome-base/orbit-2.4
+ >=gnome-base/gnome-vfs-2.14.2
+ >=x11-libs/libwnck-2.19.5
+ >=gnome-base/gconf-2.6.1
+ >=gnome-base/gnome-menus-2.11.1
+ >=gnome-base/libbonobo-2
+ >=dev-libs/dbus-glib-0.71
+ x11-libs/libXau
+ media-libs/libpng
+ >=x11-libs/cairo-1.0.0
+ eds? ( >=gnome-extra/evolution-data-server-1.6 )
+ slab? ( gnome-base/gnome-main-menu )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ >=dev-util/pkgconfig-0.9
+ >=dev-util/intltool-0.35
+ >=app-text/gnome-doc-utils-0.3.2
+ ~app-text/docbook-xml-dtd-4.1.2
+ doc? ( >=dev-util/gtk-doc-1 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="--disable-scrollkeeper $(use_enable eds) \
+ --with-in-process-applets=clock,notification-area,wncklet"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ if use slab; then
+ epatch ${FILESDIR}/gnome-panel-recently-used-apps.patch
+ fi
+
+ # FIXME : uh yeah, this is nice
+ # We should patch in a switch here and send it upstream
+ sed -i 's:--load:-v:' "${S}/gnome-panel/Makefile.in" || die "sed failed"
+}
+
+pkg_postinst() {
+ local entries="/etc/gconf/schemas/panel-default-setup.entries"
+
+ if [ -e "$entries" ]; then
+ einfo "setting panel gconf defaults..."
+ GCONF_CONFIG_SOURCE=`"${ROOT}usr/bin/gconftool-2" --get-default-source`
+ "${ROOT}usr/bin/gconftool-2" --direct --config-source \
+ "${GCONF_CONFIG_SOURCE}" --load="${entries}"
+ fi
+
+ # Calling this late so it doesn't process the GConf schemas file we already
+ # took care of.
+ gnome2_pkg_postinst
+}
diff --git a/gnome-base/gnome-panel/gnome-panel-2.20.2.ebuild b/gnome-base/gnome-panel/gnome-panel-2.20.2.ebuild
new file mode 100644
index 0000000..500570d
--- /dev/null
+++ b/gnome-base/gnome-panel/gnome-panel-2.20.2.ebuild
@@ -0,0 +1,73 @@
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-panel/gnome-panel-2.20.3.ebuild,v 1.9 2008/04/20 01:36:01 vapier Exp $
+
+inherit autotools eutils gnome2
+
+DESCRIPTION="The GNOME panel"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="alpha amd64 arm hppa ia64 ppc ppc64 sh sparc x86 ~x86-fbsd"
+IUSE="doc eds"
+
+RDEPEND=">=gnome-base/gnome-desktop-2.12
+ >=x11-libs/pango-1.15.4
+ >=dev-libs/glib-2.13.0
+ >=x11-libs/gtk+-2.11.3
+ >=gnome-base/libglade-2.5
+ >=gnome-base/libgnome-2.13
+ >=gnome-base/libgnomeui-2.5.4
+ >=gnome-base/libbonoboui-2.1.1
+ >=gnome-base/orbit-2.4
+ >=gnome-base/gnome-vfs-2.14.2
+ >=x11-libs/libwnck-2.19.5
+ >=gnome-base/gconf-2.6.1
+ >=gnome-base/gnome-menus-2.11.1
+ >=gnome-base/libbonobo-2
+ >=dev-libs/dbus-glib-0.71
+ x11-libs/libXau
+ media-libs/libpng
+ >=x11-libs/cairo-1.0.0
+ eds? ( >=gnome-extra/evolution-data-server-1.6 )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ >=dev-util/pkgconfig-0.9
+ >=dev-util/intltool-0.35
+ >=app-text/gnome-doc-utils-0.3.2
+ ~app-text/docbook-xml-dtd-4.1.2
+ doc? ( >=dev-util/gtk-doc-1 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="--disable-scrollkeeper $(use_enable eds) \
+ --with-in-process-applets=clock,notification-area,wncklet"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ # FIXME : uh yeah, this is nice
+ # We should patch in a switch here and send it upstream
+ sed -i 's:--load:-v:' "${S}/gnome-panel/Makefile.in" || die "sed failed"
+
+ # Fix LINGUAS
+ sed -i "2,2 s/ /\n/g" po/LINGUAS || die "Fixing LINGUAS failed"
+}
+
+pkg_postinst() {
+ local entries="/etc/gconf/schemas/panel-default-setup.entries"
+
+ if [ -e "$entries" ]; then
+ einfo "setting panel gconf defaults..."
+ GCONF_CONFIG_SOURCE=`"${ROOT}usr/bin/gconftool-2" --get-default-source`
+ "${ROOT}usr/bin/gconftool-2" --direct --config-source \
+ "${GCONF_CONFIG_SOURCE}" --load="${entries}"
+ fi
+
+ # Calling this late so it doesn't process the GConf schemas file we already
+ # took care of.
+ gnome2_pkg_postinst
+}
diff --git a/gnome-base/gnome-panel/gnome-panel-2.22.2.ebuild b/gnome-base/gnome-panel/gnome-panel-2.22.2.ebuild
new file mode 100644
index 0000000..69d69b6
--- /dev/null
+++ b/gnome-base/gnome-panel/gnome-panel-2.22.2.ebuild
@@ -0,0 +1,80 @@
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-panel/gnome-panel-2.22.2.ebuild,v 1.8 2008/09/25 15:21:43 jer Exp $
+
+inherit autotools eutils gnome2
+
+DESCRIPTION="The GNOME panel"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="alpha amd64 ~arm hppa ia64 ppc ~ppc64 ~sh sparc x86 ~x86-fbsd"
+IUSE="doc eds networkmanager"
+
+RDEPEND=">=gnome-base/gnome-desktop-2.12
+ >=x11-libs/pango-1.15.4
+ >=dev-libs/glib-2.15.6
+ >=x11-libs/gtk+-2.11.3
+ >=dev-libs/libgweather-2.22.1
+ dev-libs/libxml2
+ >=gnome-base/libglade-2.5
+ >=gnome-base/libgnome-2.13
+ >=gnome-base/libgnomeui-2.5.4
+ >=gnome-base/libbonoboui-2.1.1
+ >=gnome-base/orbit-2.4
+ >=x11-libs/libwnck-2.19.5
+ >=gnome-base/gconf-2.6.1
+ >=gnome-base/gnome-menus-2.11.1
+ >=gnome-base/libbonobo-2
+ gnome-base/librsvg
+ >=dev-libs/dbus-glib-0.71
+ >=sys-apps/dbus-1.1.2
+ x11-libs/libXau
+ >=x11-libs/cairo-1.0.0
+ eds? ( >=gnome-extra/evolution-data-server-1.6 )
+ networkmanager? ( >=net-misc/networkmanager-0.6 )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ >=app-text/gnome-doc-utils-0.3.2
+ >=dev-util/pkgconfig-0.9
+ >=dev-util/intltool-0.35
+ ~app-text/docbook-xml-dtd-4.1.2
+ doc? ( >=dev-util/gtk-doc-1 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="${G2CONF}
+ --disable-scrollkeeper
+ --disable-polkit
+ --with-in-process-applets=clock,notification-area,wncklet
+ $(use_enable networkmanager network-manager)
+ $(use_enable eds)"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ # FIXME : uh yeah, this is nice
+ # We should patch in a switch here and send it upstream
+ sed -i 's:--load:-v:' "${S}/gnome-panel/Makefile.in" || die "sed failed"
+}
+
+pkg_postinst() {
+ local entries="/etc/gconf/schemas/panel-default-setup.entries"
+ local gconftool="${ROOT}usr/bin/gconftool-2"
+
+ if [ -e "$entries" ]; then
+ einfo "setting panel gconf defaults..."
+
+ GCONF_CONFIG_SOURCE=$("${gconftool}" --get-default-source)
+
+ "${gconftool}" --direct --config-source \
+ "${GCONF_CONFIG_SOURCE}" --load="${entries}"
+ fi
+
+ # Calling this late so it doesn't process the GConf schemas file we already
+ # took care of.
+ gnome2_pkg_postinst
+}
diff --git a/gnome-base/gnome-panel/gnome-panel-2.24.1.ebuild b/gnome-base/gnome-panel/gnome-panel-2.24.1.ebuild
new file mode 100644
index 0000000..e82ded9
--- /dev/null
+++ b/gnome-base/gnome-panel/gnome-panel-2.24.1.ebuild
@@ -0,0 +1,83 @@
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: Exp $
+
+inherit autotools eutils gnome2
+
+DESCRIPTION="The GNOME panel"
+HOMEPAGE="http://www.gnome.org/"
+
+LICENSE="GPL-2 FDL-1.1 LGPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~hppa ~ia64 ~ppc64 ~sparc ~x86"
+IUSE="doc eds networkmanager policykit slab"
+
+RDEPEND=">=gnome-base/gnome-desktop-2.12
+ >=x11-libs/pango-1.15.4
+ >=dev-libs/glib-2.15.6
+ >=x11-libs/gtk+-2.13.1
+ >=dev-libs/libgweather-2.24.1
+ dev-libs/libxml2
+ >=gnome-base/libglade-2.5
+ >=gnome-base/libgnome-2.13
+ >=gnome-base/libgnomeui-2.5.4
+ >=gnome-base/libbonoboui-2.1.1
+ >=gnome-base/orbit-2.4
+ >=x11-libs/libwnck-2.19.5
+ >=gnome-base/gconf-2.6.1
+ >=gnome-base/gnome-menus-2.11.1
+ >=gnome-base/libbonobo-2
+ gnome-base/librsvg
+ >=dev-libs/dbus-glib-0.71
+ >=sys-apps/dbus-1.1.2
+ >=x11-libs/cairo-1.0.0
+ eds? ( >=gnome-extra/evolution-data-server-1.6 )
+ networkmanager? ( >=net-misc/networkmanager-0.6 )
+ policykit? (
+ >=sys-auth/policykit-0.7
+ >=gnome-extra/policykit-gnome-0.7 )"
+DEPEND="${RDEPEND}
+ app-text/scrollkeeper
+ >=app-text/gnome-doc-utils-0.3.2
+ >=dev-util/pkgconfig-0.9
+ >=dev-util/intltool-0.40
+ ~app-text/docbook-xml-dtd-4.1.2
+ doc? ( >=dev-util/gtk-doc-1 )"
+
+DOCS="AUTHORS ChangeLog HACKING NEWS README"
+
+pkg_setup() {
+ G2CONF="${G2CONF}
+ --disable-scrollkeeper
+ --with-in-process-applets=clock,notification-area,wncklet
+ $(use_enable policykit polkit)
+ $(use_enable networkmanager network-manager)
+ $(use_enable eds)"
+}
+
+src_unpack() {
+ gnome2_src_unpack
+
+ if use slab; then
+ epatch ${FILESDIR}/${PN}-alt-f1-slab.patch
+ epatch ${FILESDIR}/${PN}-recently-used-apps.patch
+ fi
+}
+
+pkg_postinst() {
+ local entries="/etc/gconf/schemas/panel-default-setup.entries"
+ local gconftool="${ROOT}usr/bin/gconftool-2"
+
+ if [ -e "$entries" ]; then
+ einfo "setting panel gconf defaults..."
+
+ GCONF_CONFIG_SOURCE=$("${gconftool}" --get-default-source)
+
+ "${gconftool}" --direct --config-source \
+ "${GCONF_CONFIG_SOURCE}" --load="${entries}"
+ fi
+
+ # Calling this late so it doesn't process the GConf schemas file we already
+ # took care of.
+ gnome2_pkg_postinst
+}