Index: gio/gdesktopappinfo.c =================================================================== --- gio/gdesktopappinfo.c (revision 6851) +++ gio/gdesktopappinfo.c (working copy) @@ -1,3 +1,5 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + /* GIO - GLib Input, Output and Streaming Library * * Copyright (C) 2006-2007 Red Hat, Inc. @@ -87,6 +89,7 @@ char *exec; char *binary; char *path; + char *vfs_system; guint nodisplay : 1; guint hidden : 1; @@ -149,6 +152,7 @@ g_free (info->try_exec); g_free (info->exec); g_free (info->binary); + g_free (info->vfs_system); g_free (info->path); G_OBJECT_CLASS (g_desktop_app_info_parent_class)->finalize (object); @@ -264,6 +268,7 @@ info->terminal = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TERMINAL, NULL) != FALSE; info->startup_notify = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY, NULL) != FALSE; info->hidden = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, NULL) != FALSE; + info->vfs_system = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-Gnome-Vfs-System", NULL); g_key_file_free (key_file); @@ -498,9 +503,35 @@ { GList *uris = *uri_list; char *expanded; - + gboolean force_file_uri; + char force_file_uri_macro; + g_return_if_fail (exec != NULL); - + + /* On %u and %U, only pass gio URI's if the desktop file has the + * X-Gnome-Vfs-System key set to 'gio' or if FUSE is not available. + * Otherwise we pass in a POSIX file path pointing to the URI via + * the FUSE mount in ~/.gvfs. + */ + force_file_uri = FALSE; + if (macro == 'u' || macro == 'U') + { + if (info->vfs_system == NULL || strcmp (info->vfs_system, "gio") != 0) + { + switch (macro) + { + case 'u': + force_file_uri_macro = 'f'; + force_file_uri = TRUE; + break; + case 'U': + force_file_uri_macro = 'F'; + force_file_uri = TRUE; + break; + } + } + } + switch (macro) { case 'u': @@ -509,7 +540,17 @@ case 'n': if (uris) { - expanded = expand_macro_single (macro, uris->data); + if (!force_file_uri || g_str_has_prefix (uris->data, "http")) + { + expanded = expand_macro_single (macro, uris->data); + } + else + { + expanded = expand_macro_single (force_file_uri_macro, uris->data); + if (expanded == NULL) + expanded = expand_macro_single (macro, uris->data); + } + if (expanded) { g_string_append (exec, expanded); @@ -526,7 +567,17 @@ case 'N': while (uris) { - expanded = expand_macro_single (macro, uris->data); + if (!force_file_uri || g_str_has_prefix (uris->data, "http")) + { + expanded = expand_macro_single (macro, uris->data); + } + else + { + expanded = expand_macro_single (force_file_uri_macro, uris->data); + if (expanded == NULL) + expanded = expand_macro_single (macro, uris->data); + } + if (expanded) { g_string_append (exec, expanded);