[Xfce4-commits] <xfdesktop:master> Use Thunar's Execute() D-Bus method to launch executable files.
Jannis Pohlmann
noreply at xfce.org
Tue Nov 2 01:14:36 CET 2010
Updating branch refs/heads/master
to 3f81a95103b7eed956459c1b8211a70debbdd439 (commit)
from 25e8a79579c507a2e5e8d6cfb9568ea0e15e0c94 (commit)
commit 3f81a95103b7eed956459c1b8211a70debbdd439
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