kov changed gksu/trunk/ChangeLog, gksu/trunk/nautilus-gksu/libnautilus-gksu.c

Gustavo Noronha kov at costa.debian.org
Mon Jul 10 16:52:33 UTC 2006


Mensagem de log: 
handles desktop files, and frees stuff correctly


-----


Modified: gksu/trunk/ChangeLog
===================================================================
--- gksu/trunk/ChangeLog	2006-07-09 22:58:30 UTC (rev 645)
+++ gksu/trunk/ChangeLog	2006-07-10 16:52:33 UTC (rev 646)
@@ -1,3 +1,8 @@
+2006-07-10  Gustavo Noronha Silva  <gustavo.noronha at mds.gov.br>
+
+	* nautilus-gksu/libnautilus-gksu.c:
+	- handle .desktop files, as well, by reading their Exec key
+
 2006-07-09  Gustavo Noronha Silva  <kov at debian.org>
 
 	* nautilus-gksu:

Modified: gksu/trunk/nautilus-gksu/libnautilus-gksu.c
===================================================================
--- gksu/trunk/nautilus-gksu/libnautilus-gksu.c	2006-07-09 22:58:30 UTC (rev 645)
+++ gksu/trunk/nautilus-gksu/libnautilus-gksu.c	2006-07-10 16:52:33 UTC (rev 646)
@@ -4,8 +4,10 @@
 #include <string.h>
 #include <pthread.h>
 
+#include <glib/gkeyfile.h>
 #include <gtk/gtk.h>
 #include <libgnomevfs/gnome-vfs-mime-handlers.h>
+#include <libgnomevfs/gnome-vfs-utils.h>
 #include <libnautilus-extension/nautilus-extension-types.h>
 #include <libnautilus-extension/nautilus-menu-provider.h>
 
@@ -137,7 +139,6 @@
   argv[1] = full_cmd;
   argv[2] = NULL;
 
-  g_printerr ("sgt: full_cmd: %s\n", full_cmd);
   g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
 		 &pid, NULL);
 
@@ -158,15 +159,39 @@
   gchar *cmd = NULL;
   gchar *full_cmd = NULL;
   gchar *tmp = NULL;
+  gboolean is_desktop = FALSE;
 
   uri = nautilus_file_info_get_uri (file);
   mime_type = nautilus_file_info_get_mime_type (file);
 
-  vfsapp = gnome_vfs_mime_get_default_application_for_uri (uri, mime_type);
-  g_free (mime_type);
+  if (!strcmp (mime_type, "application/x-desktop"))
+    { /* we're handling a .desktop file */
+      GKeyFile *key_file = g_key_file_new ();
+      GnomeVFSResult result;
+      gint file_size = 0;
+      gchar *content = NULL;
+      gint retval = 0;
 
-  cmd = g_strdup (gnome_vfs_mime_application_get_exec (vfsapp));
+      is_desktop = TRUE;
 
+      result = gnome_vfs_read_entire_file (uri, &file_size, &content);
+      if (result == GNOME_VFS_OK)
+	{
+	  retval = g_key_file_load_from_data (key_file, content, file_size, 0, NULL);
+	  if (retval)
+	    cmd = g_key_file_get_string (key_file, "Desktop Entry", "Exec", NULL);
+	  g_key_file_free (key_file);
+	  g_free (content);
+	}
+    }
+  else
+    {
+      vfsapp = gnome_vfs_mime_get_default_application_for_uri (uri, mime_type);
+
+      cmd = g_strdup (gnome_vfs_mime_application_get_exec (vfsapp));
+      gnome_vfs_mime_application_free (vfsapp);
+    }
+
   /*
    * FIXME: remove any FreeDesktop substitution variable for now; we
    * need to process them!
@@ -174,16 +199,22 @@
   tmp = strstr (cmd, "%");
   *tmp = '\0';
 
-  full_cmd = g_strdup_printf ("%s '%s'", cmd, uri);
-  g_printerr ("full_cmd: %s\n", full_cmd);
+  if (is_desktop)
+    full_cmd = cmd;
+  else
+    {
+      full_cmd = g_strdup_printf ("%s '%s'", cmd, uri);
+      g_free (cmd);
+    }
 
   {
     pthread_t new_thread;
     pthread_create (&new_thread, NULL, start_gksu_thread, (void*)full_cmd);
   }
 
-  gnome_vfs_mime_application_free (vfsapp);
+  /* full_cmd is freed by start_gksu_thread */
   g_free (uri);
+  g_free (mime_type);
 }
 
 /* --- extension interface --- */




More information about the gksu-commits mailing list