You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gnome-vfs2/gnome-vfs2-2.5.5-vfolder-ha...

551 lines
13 KiB

--- gnome-vfs-2.5.5/libgnomevfs/Makefile.am.vfolder-hacks 2004-01-08 03:31:06.000000000 -0500
+++ gnome-vfs-2.5.5/libgnomevfs/Makefile.am 2004-01-29 18:44:53.000000000 -0500
@@ -19,6 +19,7 @@
-DGNOMEVFS_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" \
-DSYSCONFDIR=\"$(sysconfdir)\" \
-DG_LOG_DOMAIN=\"libgnomevfs\" \
+ -I/usr/kerberos/include \
$(NULL)
libgnomevfs_headers_to_scan_for_enums = \
--- gnome-vfs-2.5.5/modules/vfolder/vfolder-common.c.vfolder-hacks 2003-04-24 11:46:24.000000000 -0400
+++ gnome-vfs-2.5.5/modules/vfolder/vfolder-common.c 2004-01-29 18:44:53.000000000 -0500
@@ -61,7 +61,8 @@
entry->weight = weight;
entry->dirty = TRUE;
-
+ entry->not_shown = FALSE;
+
/*
* Lame-O special case .directory handling, as we don't want them
* showing up for all-applications:///.
@@ -201,7 +202,7 @@
entry_reload_if_needed (Entry *entry)
{
gboolean changed = FALSE;
- gchar *keywords, *deprecates;
+ gchar *keywords, *deprecates, *onlyshowin;
int i;
if (!entry->dirty)
@@ -211,8 +212,17 @@
"Categories",
&keywords,
"Deprecates",
- &deprecates);
-
+ &deprecates,
+ "OnlyShowIn",
+ &onlyshowin);
+
+#if 0
+ g_printerr ("Read cats=%s onlyshowin=%s from entry %s\n",
+ keywords ? keywords : "none",
+ onlyshowin ? onlyshowin : "none",
+ entry->filename);
+#endif
+
/*
* Clear keywords from file, leaving only ones added from
* the directory.
@@ -269,8 +279,28 @@
g_strfreev (parsed);
}
+ if (onlyshowin) {
+ char **parsed = g_strsplit (onlyshowin, ";", -1);
+
+ /* If OnlyShowIn exists, then the default is
+ * that we don't show the entry, unless the
+ * value includes "GNOME"
+ */
+ entry->not_shown = TRUE;
+
+ for (i = 0; parsed[i] != NULL; i++) {
+ if (strcmp (parsed[i], "GNOME") == 0)
+ entry->not_shown = FALSE;
+ }
+
+ /* FIXME do we need to emit some kind of notification here? */
+
+ g_strfreev (parsed);
+ }
+
g_free (keywords);
g_free (deprecates);
+ g_free (onlyshowin);
entry->dirty = FALSE;
}
@@ -380,7 +410,9 @@
const gchar *key1,
gchar **result1,
const gchar *key2,
- gchar **result2)
+ gchar **result2,
+ const gchar *key3,
+ gchar **result3)
{
GnomeVFSHandle *handle;
GnomeVFSFileSize readlen;
@@ -389,7 +421,9 @@
*result1 = NULL;
if (key2)
- *result2 = NULL;
+ *result2 = NULL;
+ if (key3)
+ *result3 = NULL;
if (gnome_vfs_open (&handle,
entry_get_filename (entry),
@@ -416,6 +450,9 @@
if (key2)
entry_key_val_from_string (fullbuf->str, key2, result2);
+ if (key3)
+ entry_key_val_from_string (fullbuf->str, key3, result3);
+
g_string_free (fullbuf, TRUE);
}
@@ -458,7 +495,7 @@
folder->refcnt = 1;
folder->dirty = TRUE;
-
+
return folder;
}
@@ -832,6 +869,10 @@
{
Query *query = folder_get_query (folder);
+#if 0
+ g_printerr ("reading one extended entry %s\n", file_uri ? file_uri : "null");
+#endif
+
if (is_excluded (folder, file_uri, file_info->name))
return FALSE;
@@ -897,6 +938,13 @@
result = gnome_vfs_directory_open (&handle,
extend_uri,
GNOME_VFS_FILE_INFO_DEFAULT);
+
+#if 0
+ g_printerr ("reading extended entries from %s result = %s\n"<
+ extend_uri ? extend_uri : "null",
+ result == GNOME_VFS_OK ? "ok" : "failed");
+#endif
+
if (result != GNOME_VFS_OK)
return FALSE;
@@ -1038,6 +1086,11 @@
{
gboolean changed = FALSE;
+#if 0
+ g_printerr ("folder maybe reload dirty = %d loading = %d\n",
+ folder->dirty, folder->loading);
+#endif
+
if (!folder->dirty || folder->loading)
return;
@@ -1066,6 +1119,11 @@
folder_get_extend_uri (folder),
folder_extend_monitor_cb,
folder);
+ } else {
+#if 0
+ g_printerr ("folder %s has no extend uri, not reading\n",
+ folder->name);
+#endif
}
if (folder_get_query (folder))
@@ -1123,6 +1181,12 @@
void
folder_set_extend_uri (Folder *folder, const gchar *uri)
{
+#if 0
+ g_printerr ("setting extend URI of %s to %s\n",
+ folder->name,
+ uri ? uri : "null");
+#endif
+
g_free (folder->extend_uri);
folder->extend_uri = g_strdup (uri);
@@ -1262,6 +1326,9 @@
if (query && !query_try_match (query, folder, entry))
continue;
+ if (entry->not_shown)
+ continue;
+
g_hash_table_insert (
name_hash,
(gchar *) entry_get_displayname (entry),
@@ -1276,6 +1343,8 @@
"SortOrder",
&sortorder,
NULL,
+ NULL,
+ NULL,
NULL);
if (sortorder) {
list = child_list_prepend_sorted (sortorder,
@@ -1527,6 +1596,9 @@
if (entry_is_allocated (entry))
continue;
+ if (entry->not_shown)
+ continue;
+
if (query && !query_try_match (query, folder, entry))
continue;
@@ -1601,9 +1673,12 @@
{
GSList *li;
+ if (efile->not_shown)
+ return FALSE;
+
if (query == NULL)
return TRUE;
-
+
switch (query->type) {
case QUERY_OR:
for (li = query->val.queries; li != NULL; li = li->next) {
--- gnome-vfs-2.5.5/modules/vfolder/vfolder-common.h.vfolder-hacks 2002-10-25 01:54:43.000000000 -0400
+++ gnome-vfs-2.5.5/modules/vfolder/vfolder-common.h 2004-01-29 18:44:53.000000000 -0500
@@ -82,6 +82,7 @@
guint dirty : 1;
guint user_private : 1;
+ guint not_shown : 1; /* OnlyShowIn=SomeOtherDesktop */
} Entry;
Entry *entry_new (VFolderInfo *info,
@@ -120,7 +121,9 @@
const gchar *key1,
gchar **value1,
const gchar *key2,
- gchar **value2);
+ gchar **value2,
+ const gchar *key3,
+ gchar **value3);
void entry_dump (Entry *entry, int indent);
--- gnome-vfs-2.5.5/modules/vfolder/vfolder-info.c.vfolder-hacks 2003-10-31 06:17:59.000000000 -0500
+++ gnome-vfs-2.5.5/modules/vfolder/vfolder-info.c 2004-01-29 18:52:06.000000000 -0500
@@ -193,12 +193,15 @@
folder_get_name (folder) /* content */);
extend_uri = folder_get_extend_uri (folder);
+#if 0
+ /* this would confuse KDE, just use hardcoded value. */
if (extend_uri) {
xmlNewChild (folder_node /* parent */,
NULL /* ns */,
folder->is_link ? "ParentLink" : "Parent",
extend_uri /* content */);
}
+#endif
if (folder->user_private) {
const gchar *desktop_file;
@@ -274,12 +277,17 @@
NULL /* content */);
doc->xmlRootNode = topnode;
+#if 0
+ /* Never write the WriteDir field, it will
+ * break KDE menus. Just use the hardcoded one.
+ */
if (info->write_dir != NULL) {
xmlNewChild (topnode /* parent */,
NULL /* ns */,
"WriteDir" /* name */,
info->write_dir /* content */);
}
+#endif
/* Deprecated */
if (info->desktop_dir != NULL) {
@@ -539,8 +547,10 @@
gchar *esc_parent;
esc_parent = vfolder_escape_home (parent);
- folder_set_extend_uri (folder, esc_parent);
- folder->is_link = FALSE;
+ if (*esc_parent != '\0') {
+ folder_set_extend_uri (folder, esc_parent);
+ folder->is_link = FALSE;
+ }
xmlFree (parent);
g_free (esc_parent);
@@ -553,8 +563,10 @@
gchar *esc_parent;
esc_parent = vfolder_escape_home (parent);
- folder_set_extend_uri (folder, esc_parent);
- folder->is_link = TRUE;
+ if (*esc_parent != '\0') {
+ folder_set_extend_uri (folder, esc_parent);
+ folder->is_link = TRUE;
+ }
xmlFree (parent);
g_free (esc_parent);
@@ -734,6 +746,53 @@
g_free (itemdir);
}
+static void
+set_hardcoded_extend_uri_recursive (Folder *parent,
+ const char *parent_uri)
+{
+ GSList *subfolders;
+ GSList *tmp;
+
+ /* we set the extend URI unconditionally,
+ * ignoring anything in the file
+ */
+ folder_set_extend_uri (parent, parent_uri);
+
+ subfolders = (GSList*) folder_list_subfolders (parent);
+ tmp = subfolders;
+ while (tmp != NULL) {
+ Folder *sub = tmp->data;
+ char *child_uri;
+
+ child_uri = g_strconcat (parent_uri, folder_get_name (sub),
+ "/", NULL);
+
+ set_hardcoded_extend_uri_recursive (sub, child_uri);
+
+ g_free (child_uri);
+
+ tmp = tmp->next;
+ }
+}
+
+static void
+set_hardcoded_extend_uri (VFolderInfo *info)
+{
+ gchar *all_user_scheme;
+
+ /*
+ * Set the extend uri for the root folder to the -all-users version of
+ * the scheme, in case the user doesn't have a private .vfolder-info
+ * file yet.
+ */
+ if (!g_str_has_suffix (info->scheme,
+ "-all-users")) {
+ all_user_scheme = g_strconcat (info->scheme, "-all-users:///", NULL);
+ set_hardcoded_extend_uri_recursive (info->root, all_user_scheme);
+ g_free (all_user_scheme);
+ }
+}
+
static gboolean
read_vfolder_from_file (VFolderInfo *info,
const gchar *filename,
@@ -829,6 +888,7 @@
folder_unref (info->root);
info->root = folder;
+ set_hardcoded_extend_uri (info);
}
}
else if (g_ascii_strcasecmp (node->name, "ReadOnly") == 0) {
@@ -1723,23 +1783,45 @@
GnomeVFSURI *file_uri;
gboolean exists;
- /*
- * FIXME: load from gconf
+ /* Here we're finding the primary XML file
+ * that this URI will write changes to.
+ * It's the .menu file for -all-users,
+ * and the ~/.gnome2/vfolders/scheme.vfolder-info
+ * file otherwise.
*/
+
+ if (g_str_has_suffix (info->scheme,
+ "-all-users")) {
+ /* The all-users scheme uses the
+ * .menu files
+ */
+ const char *suffix;
+ char *single_scheme;
+
+ suffix = g_strrstr (info->scheme, "-all-users");
+ g_assert (suffix != NULL);
+ single_scheme = g_strndup (info->scheme,
+ suffix - info->scheme);
+
+ info->filename = g_strconcat (SYSCONFDIR,
+ "/X11/desktop-menus/",
+ single_scheme,
+ ".menu",
+ NULL);
+ g_free (single_scheme);
- /*
- * 1st: Try mandatory system-global file located at
- * /etc/gnome-vfs-2.0/vfolders/scheme.vfolder-info. Writability will
- * depend on permissions of this file.
- */
- info->filename = g_strconcat (SYSCONFDIR,
- "/gnome-vfs-2.0/vfolders/",
- scheme, ".vfolder-info",
- NULL);
- file_uri = gnome_vfs_uri_new (info->filename);
+ file_uri = gnome_vfs_uri_new (info->filename);
+
+ exists = gnome_vfs_uri_exists (file_uri);
+ gnome_vfs_uri_unref (file_uri);
- exists = gnome_vfs_uri_exists (file_uri);
- gnome_vfs_uri_unref (file_uri);
+#if 0
+ g_printerr ("all-users filename %s exists = %d\n",
+ info->filename, exists);
+#endif
+ } else {
+ exists = FALSE;
+ }
if (!exists) {
/*
@@ -1751,37 +1833,6 @@
scheme, ".vfolder-info",
NULL);
}
-
- /*
- * Special case for applications-all-users where we want to add any
- * paths specified in $GNOME2_PATH, for people installing in strange
- * places.
- */
- if (!strcmp (scheme, "applications-all-users")) {
- int i;
- const char *path;
- char *dir, **ppath;
- ItemDir *id;
- int weight = 800;
-
- path = g_getenv ("GNOME2_PATH");
- if (path) {
- ppath = g_strsplit (path, ":", -1);
-
- for (i = 0; ppath[i] != NULL; i++) {
- dir = g_build_filename (ppath[i],
- "/share/applications/",
- NULL);
- id = itemdir_new (info,
- dir,
- ITEM_DIR,
- weight--);
- g_free (dir);
- }
-
- g_strfreev (ppath);
- }
- }
}
static gboolean
@@ -1811,25 +1862,16 @@
static gboolean
vfolder_info_init (VFolderInfo *info)
{
- gchar *all_user_scheme;
-
info->loading = TRUE;
info->entries_ht = g_hash_table_new (g_str_case_hash, g_str_case_equal);
info->root = folder_new (info, "Root", TRUE);
+ set_hardcoded_extend_uri (info);
+
/*
- * Set the extend uri for the root folder to the -all-users version of
- * the scheme, in case the user doesn't have a private .vfolder-info
- * file yet.
- */
- all_user_scheme = g_strconcat (info->scheme, "-all-users:///", NULL);
- folder_set_extend_uri (info->root, all_user_scheme);
- g_free (all_user_scheme);
-
- /*
- * Set the default writedir, in case there is no .vfolder-info for this
- * scheme yet. Otherwise this will be overwritten when we read our
- * source.
+ * Set the default writedir, in case there is no .vfolder-info
+ * for this scheme yet. Otherwise this will be overwritten
+ * when we read our source.
*/
info->write_dir = g_strconcat (g_get_home_dir (),
"/" DOT_GNOME "/vfolders/",
@@ -1839,29 +1881,6 @@
/* Figure out which .vfolder-info to read */
vfolder_info_find_filenames (info);
- if (g_getenv ("GNOME_VFS_VFOLDER_INFODIR")) {
- gchar *filename = g_strconcat (info->scheme,
- ".vfolder-info",
- NULL);
-
- g_free (info->filename);
- info->filename =
- vfolder_build_uri (
- g_getenv ("GNOME_VFS_VFOLDER_INFODIR"),
- filename,
- NULL);
- g_free (filename);
- }
-
- if (g_getenv ("GNOME_VFS_VFOLDER_WRITEDIR")) {
- g_free (info->write_dir);
- info->write_dir =
- vfolder_build_uri (
- g_getenv ("GNOME_VFS_VFOLDER_WRITEDIR"),
- info->scheme,
- NULL);
- }
-
info->filename_monitor =
vfolder_monitor_file_new (info->filename,
filename_monitor_cb,
--- gnome-vfs-2.5.5/modules/vfolder/vfolder-util.c.vfolder-hacks 2002-10-10 00:46:29.000000000 -0400
+++ gnome-vfs-2.5.5/modules/vfolder/vfolder-util.c 2004-01-29 18:44:53.000000000 -0500
@@ -207,6 +207,7 @@
{
GnomeVFSResult result;
VFolderMonitor *monitor;
+#if 0
GnomeVFSFileInfo *info;
/* Check the file exists so we don't get a bogus DELETED event */
@@ -218,7 +219,8 @@
if (result != GNOME_VFS_OK)
return NULL;
-
+#endif
+
monitor = g_new0 (VFolderMonitor, 1);
monitor->callback = callback;
monitor->user_data = user_data;