walters / rpms / glib2

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