Blob Blame History Raw
diff -up glib-2.17.3/gio/gdesktopappinfo.c.only-pass-uri-to-gio-apps glib-2.17.3/gio/gdesktopappinfo.c
--- glib-2.17.3/gio/gdesktopappinfo.c.only-pass-uri-to-gio-apps	2008-07-02 17:13:13.000000000 -0400
+++ glib-2.17.3/gio/gdesktopappinfo.c	2008-07-03 13:21:42.000000000 -0400
@@ -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.
@@ -89,6 +91,7 @@ struct _GDesktopAppInfo
   char *exec;
   char *binary;
   char *path;
+  char *vfs_system;
 
   guint nodisplay       : 1;
   guint hidden          : 1;
@@ -151,6 +154,7 @@ g_desktop_app_info_finalize (GObject *ob
   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);
@@ -254,6 +258,7 @@ g_desktop_app_info_new_from_keyfile (GKe
   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);
   
   info->icon = NULL;
   if (info->icon_name)
@@ -392,6 +397,7 @@ g_desktop_app_info_dup (GAppInfo *appinf
   new_info->exec = g_strdup (info->exec);
   new_info->binary = g_strdup (info->binary);
   new_info->path = g_strdup (info->path);
+  new_info->vfs_system = g_strdup (info->vfs_system);
   new_info->hidden = info->hidden;
   new_info->terminal = info->terminal;
   new_info->startup_notify = info->startup_notify;
@@ -517,9 +523,35 @@ expand_macro (char              macro, 
 {
   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':
@@ -528,7 +560,17 @@ expand_macro (char              macro, 
     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);
@@ -545,7 +587,17 @@ expand_macro (char              macro, 
     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);