[Xfce4-commits] <xfdesktop:jannis/port-to-gio> Use Thunar's Execute() D-Bus method to launch executable files.

Jannis Pohlmann noreply at xfce.org
Sun Oct 24 23:38:01 CEST 2010


Updating branch refs/heads/jannis/port-to-gio
         to b8de33e89111a9060373f0a5934b756f4f81489a (commit)
       from 912507cb3acb6d976d4235a15436d84fb0ea4c77 (commit)

commit b8de33e89111a9060373f0a5934b756f4f81489a
Author: Jannis Pohlmann <jannis at xfce.org>
Date:   Sun Oct 24 23:36:20 2010 +0200

    Use Thunar's Execute() D-Bus method to launch executable files.
    
    This is for drag and drop only.

 src/xfdesktop-file-manager-dbus.xml |   21 ++++++++++
 src/xfdesktop-file-utils.c          |   76 +++++++++++++++++++++++++++++++++++
 src/xfdesktop-file-utils.h          |    4 ++
 src/xfdesktop-regular-file-icon.c   |   61 +++++++++-------------------
 4 files changed, 121 insertions(+), 41 deletions(-)

diff --git a/src/xfdesktop-file-manager-dbus.xml b/src/xfdesktop-file-manager-dbus.xml
index df1a0d5..bc761d0 100644
--- a/src/xfdesktop-file-manager-dbus.xml
+++ b/src/xfdesktop-file-manager-dbus.xml
@@ -131,6 +131,27 @@
 
 
     <!--
+      Execute (working_directory : STRING, uri : STRING, files : ARRAY OF STRING, display : STRING, startup_id : STRING) : VOID
+
+      working_directory : working directory used to resolve relative filenames.
+      uri               : either a file:-URI or an relative or absolute path.
+      files             : an array of file:-URIs, relative or absolute paths to supply to
+                          the executed URI on execution.
+      display           : the screen on which to launch the file or ""
+                          to use the default screen of the file manager.
+      startup_id        : the DESKTOP_STARTUP_ID environment variable for properly
+                          handling startup notification and focus stealing.
+    -->
+    <method name="Execute">
+      <arg direction="in" name="working_directory" type="s" />
+      <arg direction="in" name="uri" type="s" />
+      <arg direction="in" name="files" type="as" />
+      <arg direction="in" name="display" type="s" />
+      <arg direction="in" name="startup_id" type="s" />
+    </method>
+
+
+    <!--
       DisplayPreferencesDialog (display : STRING) : VOID
 
       display    : the screen on which to display the preferences dialog
diff --git a/src/xfdesktop-file-utils.c b/src/xfdesktop-file-utils.c
index 6b7dcb4..226c0f5 100644
--- a/src/xfdesktop-file-utils.c
+++ b/src/xfdesktop-file-utils.c
@@ -906,6 +906,82 @@ xfdesktop_file_utils_launch(GFile *file,
 }
 
 void
+xfdesktop_file_utils_execute(GFile *working_directory,
+                             GFile *file,
+                             GList *files,
+                             GdkScreen *screen)
+{
+    DBusGProxy *fileman_proxy;
+    
+    g_return_if_fail(working_directory == NULL || G_IS_FILE(working_directory));
+    g_return_if_fail(G_IS_FILE(file));
+    g_return_if_fail(screen == NULL || GDK_IS_SCREEN(screen));
+    
+    if(!screen)
+        screen = gdk_display_get_default_screen(gdk_display_get_default());
+    
+    fileman_proxy = xfdesktop_file_utils_peek_filemanager_proxy();
+    if(fileman_proxy) {
+        GError *error = NULL;
+        gchar *working_dir = working_directory != NULL ? g_file_get_uri(working_directory) : NULL;
+        gchar *uri = g_file_get_uri(file);
+        gchar *display_name = gdk_screen_make_display_name(screen);
+        gchar *startup_id = g_strdup_printf("_TIME%d", gtk_get_current_event_time());
+        GList *lp;
+        guint n = g_list_length (files);
+        gchar **uris = g_new0 (gchar *, n + 1);
+
+        for (n = 0, lp = files; lp != NULL; ++n, lp = lp->next)
+            uris[n] = g_file_get_uri(lp->data);
+        uris[n] = NULL;
+
+        if(!xfdesktop_file_manager_proxy_execute(fileman_proxy,
+                                                 working_dir, uri, 
+                                                 (const gchar **)uris,
+                                                 display_name, startup_id,
+                                                 &error))
+        {
+            gchar *filename = g_file_get_uri(file);
+            gchar *name = g_filename_display_basename(filename);
+            gchar *primary = g_markup_printf_escaped(_("Failed to run \"%s\""), name);
+
+            xfce_message_dialog(NULL,
+                                _("Run Error"), GTK_STOCK_DIALOG_ERROR,
+                                primary, error->message, 
+                                GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT,
+                                NULL);
+
+            g_free(primary);
+            g_free(name);
+            g_free(filename);
+
+            g_error_free(error);
+        }
+        
+        g_free(startup_id);
+        g_free(display_name);
+        g_strfreev(uris);
+        g_free(uri);
+        g_free(working_dir);
+    } else {
+        gchar *filename = g_file_get_uri(file);
+        gchar *name = g_filename_display_basename(filename);
+        gchar *primary = g_markup_printf_escaped(_("Failed to run \"%s\""), name);
+
+        xfce_message_dialog(NULL,
+                            _("Launch Error"), GTK_STOCK_DIALOG_ERROR,
+                            primary,
+                            _("This feature requires a file manager service to "
+                              "be present (such as the one supplied by Thunar)."),
+                            GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+
+        g_free(primary);
+        g_free(name);
+        g_free(filename);
+    }
+}
+
+void
 xfdesktop_file_utils_display_chooser_dialog(GFile *file,
                                             gboolean open,
                                             GdkScreen *screen,
diff --git a/src/xfdesktop-file-utils.h b/src/xfdesktop-file-utils.h
index 90db301..a94de89 100644
--- a/src/xfdesktop-file-utils.h
+++ b/src/xfdesktop-file-utils.h
@@ -107,6 +107,10 @@ void xfdesktop_file_utils_show_properties_dialog(GFile *file,
 void xfdesktop_file_utils_launch(GFile *file,
                                  GdkScreen *screen,
                                  GtkWindow *parent);
+void xfdesktop_file_utils_execute(GFile *working_directory,
+                                  GFile *file,
+                                  GList *files,
+                                  GdkScreen *screen);
 void xfdesktop_file_utils_display_chooser_dialog(GFile *file,
                                                  gboolean open,
                                                  GdkScreen *screen,
diff --git a/src/xfdesktop-regular-file-icon.c b/src/xfdesktop-regular-file-icon.c
index 13ace85..9d7e41f 100644
--- a/src/xfdesktop-regular-file-icon.c
+++ b/src/xfdesktop-regular-file-icon.c
@@ -275,7 +275,7 @@ xfdesktop_regular_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
     GFileInfo *info = xfdesktop_file_icon_peek_file_info(XFDESKTOP_FILE_ICON(icon));
     GFile *file = xfdesktop_file_icon_peek_file(XFDESKTOP_FILE_ICON(icon));
     GdkDragAction actions = GDK_ACTION_LINK;  /* we can always link */
-    
+
     if(!info)
         return 0;
 
@@ -297,7 +297,6 @@ xfdesktop_regular_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
             if(g_file_info_get_attribute_boolean(parent_info,
                                                  G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
             {
-                g_debug("can move %s", g_file_get_uri(file));
                 actions |= GDK_ACTION_MOVE;
             }
             g_object_unref(parent_info);
@@ -318,15 +317,16 @@ xfdesktop_regular_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
     
     /* if it's executable we can 'copy'.  if it's a folder we can do anything
      * if it's writable. */
-    if(g_file_info_get_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE))
-        return GDK_ACTION_COPY;
-    else if(g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY
-            && g_file_info_get_attribute_boolean(info, 
-                                                 G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
-    {
-        return GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK;
-    } else
-        return 0;
+    if(g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY) {
+        if(g_file_info_get_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
+            return GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK;
+    } else {
+        if(xfdesktop_file_utils_file_is_executable(info)) {
+            return GDK_ACTION_COPY;
+        }
+    }
+
+    return 0;
 }
 
 gboolean
@@ -352,37 +352,16 @@ xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
         return FALSE;
     
     if(g_file_info_get_file_type(regular_file_icon->priv->file_info) != G_FILE_TYPE_DIRECTORY
-       && g_file_info_get_attribute_boolean(regular_file_icon->priv->file_info,
-                                            G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE))
+       && xfdesktop_file_utils_file_is_executable(regular_file_icon->priv->file_info))
     {
-        /* TODO Use the new Thunar D-Bus method Execute() which takes a 
-         * working directory, a file to execute, a string array of arguments, 
-         * a screen and a startup ID */
-#if 0
-        GList *path_list = g_list_prepend(NULL, src_info->path);
-        GError *error = NULL;
-        gboolean succeeded;
-        
-        succeeded = thunar_vfs_info_execute(regular_file_icon->priv->info,
-                                            regular_file_icon->priv->gscreen,
-                                            path_list,
-                                            xfce_get_homedir(),
-                                            &error);
-        g_list_free(path_list);
-        
-        if(!succeeded) {
-            gchar *primary = g_markup_printf_escaped(_("Failed to run \"%s\":"),
-                                                     regular_file_icon->priv->info->display_name);
-            xfce_message_dialog(NULL, _("Run Error"), GTK_STOCK_DIALOG_ERROR,
-                                primary, error->message,
-                                GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
-            g_free(primary);
-            g_error_free(error);
-            
-            return FALSE;
-        }
-        
-#endif
+        GList files;
+
+        files.data = src_file;
+        files.prev = files.next = NULL;
+
+        xfdesktop_file_utils_execute(NULL, regular_file_icon->priv->file, &files,
+                                     regular_file_icon->priv->gscreen);
+
         return TRUE;
     } else {
         GFile *parent, *dest_file;



More information about the Xfce4-commits mailing list