diff -Naur nautilus-3.6.1.orig/eel/eel-gnome-extensions.c nautilus-3.6.1/eel/eel-gnome-extensions.c --- nautilus-3.6.1.orig/eel/eel-gnome-extensions.c 2013-06-24 15:48:18.490246931 -0700 +++ nautilus-3.6.1/eel/eel-gnome-extensions.c 2013-06-24 16:19:53.829949278 -0700 @@ -31,7 +31,6 @@ #include "eel-gnome-extensions.h" #include -#include /* Return a command string containing the path to a terminal on this system. */ @@ -89,6 +88,137 @@ return result; } + +/** + * gnome_desktop_prepend_terminal_to_vector: + * @argc: a pointer to the vector size + * @argv: a pointer to the vector + * + * Description: Prepends a terminal (either the one configured as default in + * the user's GNOME setup, or one of the common xterm emulators) to the passed + * in vector, modifying it in the process. The vector should be allocated with + * #g_malloc, as this will #g_free the original vector. Also all elements must + * have been allocated separately. That is the standard glib/GNOME way of + * doing vectors however. If the integer that @argc points to is negative, the + * size will first be computed. Also note that passing in pointers to a vector + * that is empty, will just create a new vector for you. + **/ +static void +gnome_desktop_prepend_terminal_to_vector (int *argc, char ***argv) +{ +#ifndef G_OS_WIN32 + char **real_argv; + int real_argc; + int i, j; + char **term_argv = NULL; + int term_argc = 0; + GSettings *settings; + + gchar *terminal = NULL; + + char **the_argv; + + g_return_if_fail (argc != NULL); + g_return_if_fail (argv != NULL); + + // _gnome_desktop_init_i18n (); + + /* sanity */ + if(*argv == NULL) + *argc = 0; + + the_argv = *argv; + + /* compute size if not given */ + if (*argc < 0) { + for (i = 0; the_argv[i] != NULL; i++) + ; + *argc = i; + } + + settings = g_settings_new ("org.gnome.desktop.default-applications.terminal"); + terminal = g_settings_get_string (settings, "exec"); + + if (terminal) { + gchar *command_line; + gchar *exec_flag; + + exec_flag = g_settings_get_string (settings, "exec-arg"); + + if (exec_flag == NULL) + command_line = g_strdup (terminal); + else + command_line = g_strdup_printf ("%s %s", terminal, + exec_flag); + + g_shell_parse_argv (command_line, + &term_argc, + &term_argv, + NULL /* error */); + + g_free (command_line); + g_free (exec_flag); + g_free (terminal); + } + + g_object_unref (settings); + + if (term_argv == NULL) { + char *check; + + term_argc = 2; + term_argv = g_new0 (char *, 3); + + check = g_find_program_in_path ("gnome-terminal"); + if (check != NULL) { + term_argv[0] = check; + /* Note that gnome-terminal takes -x and + * as -e in gnome-terminal is broken we use that. */ + term_argv[1] = g_strdup ("-x"); + } else { + if (check == NULL) + check = g_find_program_in_path ("nxterm"); + if (check == NULL) + check = g_find_program_in_path ("color-xterm"); + if (check == NULL) + check = g_find_program_in_path ("rxvt"); + if (check == NULL) + check = g_find_program_in_path ("xterm"); + if (check == NULL) + check = g_find_program_in_path ("dtterm"); + if (check == NULL) { + g_warning ("Cannot find a terminal, using xterm, even if it may not work"); + check = g_strdup ("xterm"); + } + term_argv[0] = check; + term_argv[1] = g_strdup ("-e"); + } + } + real_argc = term_argc + *argc; + real_argv = g_new (char *, real_argc + 1); + + for (i = 0; i < term_argc; i++) + real_argv[i] = term_argv[i]; + + for (j = 0; j < *argc; j++, i++) + real_argv[i] = (char *)the_argv[j]; + + real_argv[i] = NULL; + + g_free (*argv); + *argv = real_argv; + *argc = real_argc; + + /* we use g_free here as we sucked all the inner strings + * out from it into real_argv */ + g_free (term_argv); +#else + /* FIXME: Implement when needed */ + g_warning ("gnome_prepend_terminal_to_vector: Not implemented"); +#endif +} + + static char * get_terminal_command_prefix (gboolean for_command) { @@ -198,3 +328,5 @@ g_free (command_line); } + + .