Index: gnome-panel/menu.c
===================================================================
--- gnome-panel/menu.c (revision 10283)
+++ gnome-panel/menu.c (working copy)
@@ -617,6 +617,91 @@ add_app_to_panel (GtkWidget *item,
gmenu_tree_entry_get_desktop_file_path (entry));
}
+static char *
+lookup_desktop_dir (void)
+{
+ FILE *file;
+ char *config_file;
+ char buffer[512];
+ char *user_dir;
+ char *p, *d;
+ int len;
+ int relative;
+
+ config_file = g_build_filename (g_get_user_config_dir (), "user-dirs.dirs", NULL);
+ file = fopen (config_file, "r");
+ free (config_file);
+ if (file == NULL)
+ goto error;
+
+ user_dir = NULL;
+ while (fgets (buffer, sizeof (buffer), file))
+ {
+ /* Remove newline at end */
+ len = strlen (buffer);
+ if (len > 0 && buffer[len-1] == '\n')
+ buffer[len-1] = 0;
+
+ p = buffer;
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (!g_str_has_prefix (p, "XDG_DESKTOP_DIR"))
+ continue;
+ p += strlen ("XDG_DESKTOP_DIR");
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (*p != '=')
+ continue;
+ p++;
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (*p != '"')
+ continue;
+ p++;
+
+ relative = 0;
+ if (strncmp (p, "$HOME/", 6) == 0)
+ {
+ p += 6;
+ relative = 1;
+ }
+ else if (*p != '/')
+ continue;
+
+ if (relative)
+ {
+ user_dir = g_malloc (strlen (g_get_home_dir()) + 1 + strlen (p) + 1);
+ strcpy (user_dir, g_get_home_dir ());
+ strcat (user_dir, "/");
+ }
+ else
+ {
+ user_dir = g_malloc (strlen (p) + 1);
+ *user_dir = 0;
+ }
+
+ d = user_dir + strlen (user_dir);
+ while (*p && *p != '"')
+ {
+ if ((*p == '\\') && (*(p+1) != 0))
+ p++;
+ *d++ = *p++;
+ }
+ *d = 0;
+ }
+ fclose (file);
+
+ if (user_dir)
+ return user_dir;
+
+ error:
+ return g_build_filename (g_get_home_dir (), "Desktop", NULL);
+}
static void
add_app_to_desktop (GtkWidget *item,
@@ -640,7 +725,7 @@ add_app_to_desktop (GtkWidget *item
if (desktop_is_home_dir ()) {
target_dir = g_build_filename (g_get_home_dir (), NULL);
} else {
- target_dir = g_build_filename (g_get_home_dir (), "Desktop", NULL);
+ target_dir = lookup_desktop_dir ();
}
target_uri = panel_make_unique_desktop_uri (target_dir, source_uri);
Index: gnome-panel/panel-menu-items.c
===================================================================
--- gnome-panel/panel-menu-items.c (revision 10283)
+++ gnome-panel/panel-menu-items.c (working copy)
@@ -119,7 +119,104 @@ activate_uri (GtkWidget *menuitem,
}
g_free (url);
}
-
+
+static char *
+lookup_desktop_dir (void)
+{
+ FILE *file;
+ char *config_file;
+ char buffer[512];
+ char *user_dir;
+ char *p, *d;
+ int len;
+ int relative;
+
+ config_file = g_build_filename (g_get_user_config_dir (), "user-dirs.dirs", NULL);
+ file = fopen (config_file, "r");
+ free (config_file);
+ if (file == NULL)
+ goto error;
+
+ user_dir = NULL;
+ while (fgets (buffer, sizeof (buffer), file))
+ {
+ /* Remove newline at end */
+ len = strlen (buffer);
+ if (len > 0 && buffer[len-1] == '\n')
+ buffer[len-1] = 0;
+
+ p = buffer;
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (!g_str_has_prefix (p, "XDG_DESKTOP_DIR"))
+ continue;
+ p += strlen ("XDG_DESKTOP_DIR");
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (*p != '=')
+ continue;
+ p++;
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ if (*p != '"')
+ continue;
+ p++;
+
+ relative = 0;
+ if (strncmp (p, "$HOME/", 6) == 0)
+ {
+ p += 6;
+ relative = 1;
+ }
+ else if (*p != '/')
+ continue;
+
+ if (relative)
+ {
+ user_dir = g_malloc (strlen (g_get_home_dir()) + 1 + strlen (p) + 1);
+ strcpy (user_dir, g_get_home_dir ());
+ strcat (user_dir, "/");
+ }
+ else
+ {
+ user_dir = g_malloc (strlen (p) + 1);
+ *user_dir = 0;
+ }
+
+ d = user_dir + strlen (user_dir);
+ while (*p && *p != '"')
+ {
+ if ((*p == '\\') && (*(p+1) != 0))
+ p++;
+ *d++ = *p++;
+ }
+ *d = 0;
+ }
+ fclose (file);
+
+ if (user_dir)
+ return user_dir;
+
+ error:
+ return g_build_filename (g_get_home_dir (), "Desktop", NULL);
+}
+
+
+static void
+activate_desktop_uri (GtkWidget *menuitem)
+{
+ char *path;
+
+ path = lookup_desktop_dir ();
+ activate_uri (menuitem, path);
+ g_free (path);
+}
+
static void
panel_menu_items_append_from_desktop (GtkWidget *menu,
char *path,
@@ -584,11 +681,6 @@ panel_place_menu_item_create_menu (Panel
if (!gconf_client_get_bool (panel_gconf_get_client (),
DESKTOP_IS_HOME_DIR_KEY,
NULL)) {
- char *uri;
-
- uri = gnome_vfs_make_uri_from_input_with_dirs ("Desktop",
- GNOME_VFS_MAKE_URI_DIR_HOMEDIR);
-
panel_menu_items_append_place_item (
"gnome-fs-desktop",
/* Translators: Desktop is used here as in
@@ -598,10 +690,8 @@ panel_place_menu_item_create_menu (Panel
Q_("Desktop Folder|Desktop"),
_("Open the contents of your desktop in a folder"),
places_menu,
- G_CALLBACK (activate_uri),
- uri);
-
- g_free (uri);
+ G_CALLBACK (activate_desktop_uri),
+ NULL);
}
panel_place_menu_item_append_gtk_bookmarks (places_menu);