nautilus r14502 - in trunk: . libnautilus-private src/file-manager
- From: cneumair svn gnome org
- To: svn-commits-list gnome org
- Subject: nautilus r14502 - in trunk: . libnautilus-private src/file-manager
- Date: Wed, 20 Aug 2008 15:47:20 +0000 (UTC)
Author: cneumair
Date: Wed Aug 20 15:47:19 2008
New Revision: 14502
URL: http://svn.gnome.org/viewvc/nautilus?rev=14502&view=rev
Log:
2008-08-20 Christian Neumair <cneumair gnome org>
* libnautilus-private/nautilus-program-choosing.c
(nautilus_launch_application_from_command),
(nautilus_launch_application_from_command_array):
* libnautilus-private/nautilus-program-choosing.h:
Use vararg list for nautilus_launch_application_from_command().
Add nautilus_launch_application_from_command_array() which takes a
parameter string array. Quote each parameter separately.
* libnautilus-private/nautilus-mime-actions.c (activate_files):
* src/file-manager/fm-desktop-icon-view.c
(action_new_launcher_callback),
(action_change_background_callback):
* src/file-manager/fm-directory-view.c
(action_new_launcher_callback),
(get_file_names_as_parameter_array), (run_script_callback):
* src/file-manager/fm-tree-view.c (got_activation_uri_callback):
Pass each parameter separately to
nautilus_launch_application_from_command(_array)().
The _array() variant is used for running scripts, where the file names
of the selection are passed separately.
Fixes #341657. Thanks to Cosimo Cecchi.
Modified:
trunk/ChangeLog
trunk/libnautilus-private/nautilus-mime-actions.c
trunk/libnautilus-private/nautilus-program-choosing.c
trunk/libnautilus-private/nautilus-program-choosing.h
trunk/src/file-manager/fm-desktop-icon-view.c
trunk/src/file-manager/fm-directory-view.c
trunk/src/file-manager/fm-tree-view.c
Modified: trunk/libnautilus-private/nautilus-mime-actions.c
==============================================================================
--- trunk/libnautilus-private/nautilus-mime-actions.c (original)
+++ trunk/libnautilus-private/nautilus-mime-actions.c Wed Aug 20 15:47:19 2008
@@ -1109,7 +1109,7 @@
"directory view activate_callback launch_file window=%p: %s",
parameters->parent_window, quoted_path);
- nautilus_launch_application_from_command (screen, name, quoted_path, NULL, FALSE);
+ nautilus_launch_application_from_command (screen, name, quoted_path, FALSE, NULL);
g_free (name);
g_free (quoted_path);
g_free (executable_path);
@@ -1130,7 +1130,7 @@
"directory view activate_callback launch_in_terminal window=%p: %s",
parameters->parent_window, quoted_path);
- nautilus_launch_application_from_command (screen, name, quoted_path, NULL, TRUE);
+ nautilus_launch_application_from_command (screen, name, quoted_path, TRUE, NULL);
g_free (name);
g_free (quoted_path);
g_free (executable_path);
Modified: trunk/libnautilus-private/nautilus-program-choosing.c
==============================================================================
--- trunk/libnautilus-private/nautilus-program-choosing.c (original)
+++ trunk/libnautilus-private/nautilus-program-choosing.c Wed Aug 20 15:47:19 2008
@@ -251,24 +251,77 @@
*
* @command_string: The application to be launched, with any desired
* command-line options.
- * @parameter: Passed as a parameter to the application as is.
+ * @...: Passed as parameters to the application after quoting each of them.
*/
void
nautilus_launch_application_from_command (GdkScreen *screen,
const char *name,
const char *command_string,
- const char *parameter,
- gboolean use_terminal)
+ gboolean use_terminal,
+ ...)
{
- char *full_command;
+ char *full_command, *tmp;
char *quoted_parameter;
+ char *parameter;
+ va_list ap;
- if (parameter != NULL) {
+ full_command = g_strdup (command_string);
+
+ va_start (ap, use_terminal);
+
+ while ((parameter = va_arg (ap, char *)) != NULL) {
quoted_parameter = g_shell_quote (parameter);
- full_command = g_strconcat (command_string, " ", quoted_parameter, NULL);
+ tmp = g_strconcat (full_command, " ", quoted_parameter, NULL);
g_free (quoted_parameter);
+
+ g_free (full_command);
+ full_command = tmp;
+
+ }
+
+ va_end (ap);
+
+ if (use_terminal) {
+ eel_gnome_open_terminal_on_screen (full_command, screen);
} else {
- full_command = g_strdup (command_string);
+ gdk_spawn_command_line_on_screen (screen, full_command, NULL);
+ }
+
+ g_free (full_command);
+}
+
+/**
+ * nautilus_launch_application_from_command:
+ *
+ * Fork off a process to launch an application with a given uri as
+ * a parameter.
+ *
+ * @command_string: The application to be launched, with any desired
+ * command-line options.
+ * @parameters: Passed as parameters to the application after quoting each of them.
+ */
+void
+nautilus_launch_application_from_command_array (GdkScreen *screen,
+ const char *name,
+ const char *command_string,
+ gboolean use_terminal,
+ const char * const * parameters)
+{
+ char *full_command, *tmp;
+ char *quoted_parameter;
+ const char * const *p;
+
+ full_command = g_strdup (command_string);
+
+ if (parameters != NULL) {
+ for (p = parameters; *p != NULL; p++) {
+ quoted_parameter = g_shell_quote (*p);
+ tmp = g_strconcat (full_command, " ", quoted_parameter, NULL);
+ g_free (quoted_parameter);
+
+ g_free (full_command);
+ full_command = tmp;
+ }
}
if (use_terminal) {
Modified: trunk/libnautilus-private/nautilus-program-choosing.h
==============================================================================
--- trunk/libnautilus-private/nautilus-program-choosing.h (original)
+++ trunk/libnautilus-private/nautilus-program-choosing.h Wed Aug 20 15:47:19 2008
@@ -39,8 +39,13 @@
void nautilus_launch_application_from_command (GdkScreen *screen,
const char *name,
const char *command_string,
- const char *parameter,
- gboolean use_terminal);
+ gboolean use_terminal,
+ ...) G_GNUC_NULL_TERMINATED;
+void nautilus_launch_application_from_command_array (GdkScreen *screen,
+ const char *name,
+ const char *command_string,
+ gboolean use_terminal,
+ const char * const * parameters);
void nautilus_launch_desktop_file (GdkScreen *screen,
const char *desktop_file_uri,
const GList *parameter_uris,
Modified: trunk/src/file-manager/fm-desktop-icon-view.c
==============================================================================
--- trunk/src/file-manager/fm-desktop-icon-view.c (original)
+++ trunk/src/file-manager/fm-desktop-icon-view.c Wed Aug 20 15:47:19 2008
@@ -599,9 +599,9 @@
nautilus_launch_application_from_command (gtk_widget_get_screen (GTK_WIDGET (data)),
"gnome-desktop-item-edit",
- "gnome-desktop-item-edit --create-new",
- desktop_directory,
- FALSE);
+ "gnome-desktop-item-edit",
+ FALSE,
+ "--create-new", desktop_directory, NULL);
g_free (desktop_directory);
}
@@ -615,8 +615,8 @@
nautilus_launch_application_from_command (gtk_widget_get_screen (GTK_WIDGET (data)),
_("Background"),
"gnome-appearance-properties",
- "--show-page=background",
- FALSE);
+ FALSE,
+ "--show-page=background", NULL);
}
static void
Modified: trunk/src/file-manager/fm-directory-view.c
==============================================================================
--- trunk/src/file-manager/fm-directory-view.c (original)
+++ trunk/src/file-manager/fm-directory-view.c Wed Aug 20 15:47:19 2008
@@ -1397,9 +1397,9 @@
"directory view create new launcher in window=%p: %s", window, parent_uri);
nautilus_launch_application_from_command (gtk_widget_get_screen (GTK_WIDGET (view)),
"gnome-desktop-item-edit",
- "gnome-desktop-item-edit --create-new",
- parent_uri,
- FALSE);
+ "gnome-desktop-item-edit",
+ FALSE,
+ "--create-new", parent_uri, NULL);
g_free (parent_uri);
}
@@ -4778,28 +4778,37 @@
return old_path;
}
-static char *
-get_file_names_as_parameter_string (GList *selection)
+static char **
+get_file_names_as_parameter_array (GList *selection)
{
- char *name, *quoted_name;
- char *result;
- GString *parameter_string;
+ NautilusFile *file;
+ char *name;
+ char **parameters;
GList *node;
+ int i;
+
+ parameters = g_new (char *, g_list_length (selection) + 1);
+
+ for (node = selection, i = 0; node != NULL; node = node->next, i++) {
+ file = NAUTILUS_FILE (node->data);
+
+ if (!nautilus_file_is_local (file)) {
+ parameters[i] = NULL;
+ g_strfreev (parameters);
+ return NULL;
+ }
+
+ /* TODO get name with respect to base directory,
+ * which may be different from file's parent directory
+ * in list view with nested subdirectories.
+ */
- parameter_string = g_string_new ("");
- for (node = selection; node != NULL; node = node->next) {
name = nautilus_file_get_name (NAUTILUS_FILE (node->data));
- quoted_name = g_shell_quote (name);
- g_string_append (parameter_string, quoted_name);
- g_string_append (parameter_string, " ");
- g_free (name);
- g_free (quoted_name);
+ parameters[i] = name;
}
- result = parameter_string->str;
- g_string_free (parameter_string, FALSE);
-
- return result;
+ parameters[i] = NULL;
+ return parameters;
}
static char *
@@ -4930,7 +4939,7 @@
char *local_file_path;
char *quoted_path;
char *old_working_dir;
- char *parameters, *command, *name;
+ char **parameters, *name;
GtkWindow *window;
launch_parameters = (ScriptLaunchParameters *) callback_data;
@@ -4948,21 +4957,7 @@
selected_files = fm_directory_view_get_selection (launch_parameters->directory_view);
set_script_environment_variables (launch_parameters->directory_view, selected_files);
- if (nautilus_directory_is_local (launch_parameters->directory_view->details->model)) {
- parameters = get_file_names_as_parameter_string (selected_files);
-
- /* FIXME: must append command and parameters here, because nautilus_launch_application_from_command
- * quotes all parameters as if they are a single parameter. Should add or change API in
- * nautilus-program-choosing.c to support multiple parameters.
- */
- command = g_strconcat (quoted_path, " ", parameters, NULL);
- g_free (parameters);
- } else {
- /* We pass no parameters in the remote case. It's up to scripts to be smart
- * and check the environment variables.
- */
- command = g_strdup (quoted_path);
- }
+ parameters = get_file_names_as_parameter_array (selected_files);
screen = gtk_widget_get_screen (GTK_WIDGET (launch_parameters->directory_view));
@@ -4970,11 +4965,12 @@
/* FIXME: handle errors with dialog? Or leave up to each script? */
window = fm_directory_view_get_containing_window (launch_parameters->directory_view);
nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER,
- "directory view run_script_callback, window=%p, name=\"%s\", command=\"%s\"",
- window, name, command);
- nautilus_launch_application_from_command (screen, name, command, NULL, FALSE);
+ "directory view run_script_callback, window=%p, name=\"%s\", script_path=\"%s\" (omitting script parameters)",
+ window, name, local_file_path);
+ nautilus_launch_application_from_command_array (screen, name, quoted_path, FALSE,
+ (const char * const *) parameters);
g_free (name);
- g_free (command);
+ g_strfreev (parameters);
nautilus_file_list_free (selected_files);
unset_script_environment_variables ();
Modified: trunk/src/file-manager/fm-tree-view.c
==============================================================================
--- trunk/src/file-manager/fm-tree-view.c (original)
+++ trunk/src/file-manager/fm-tree-view.c Wed Aug 20 15:47:19 2008
@@ -369,7 +369,7 @@
nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER,
"tree view launch_application_from_command window=%p: %s",
view->details->window, file_uri);
- nautilus_launch_application_from_command (screen, NULL, file_uri, NULL, FALSE);
+ nautilus_launch_application_from_command (screen, NULL, file_uri, FALSE, NULL);
g_free (file_uri);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]