diff -rupN gnome-panel-3.6.2.orig/applets/clock/calendar-window.c gnome-panel-3.6.2/applets/clock/calendar-window.c --- gnome-panel-3.6.2.orig/applets/clock/calendar-window.c 2012-11-12 18:35:17.000000000 +0100 +++ gnome-panel-3.6.2/applets/clock/calendar-window.c 2013-03-31 10:54:51.005171488 +0200 @@ -43,7 +43,6 @@ #include #define GNOME_DESKTOP_USE_UNSTABLE_API -#include #include "calendar-window.h" diff -rupN gnome-panel-3.6.2.orig/applets/clock/clock.c gnome-panel-3.6.2/applets/clock/clock.c --- gnome-panel-3.6.2.orig/applets/clock/clock.c 2012-09-03 17:41:42.000000000 +0200 +++ gnome-panel-3.6.2/applets/clock/clock.c 2013-03-31 10:54:51.007171360 +0200 @@ -54,7 +54,6 @@ #define GNOME_DESKTOP_USE_UNSTABLE_API #include -#include #include #include #include diff -rupN gnome-panel-3.6.2.orig/gnome-panel/panel-run-dialog.c gnome-panel-3.6.2/gnome-panel/panel-run-dialog.c --- gnome-panel-3.6.2.orig/gnome-panel/panel-run-dialog.c 2012-11-12 18:35:17.000000000 +0100 +++ gnome-panel-3.6.2/gnome-panel/panel-run-dialog.c 2013-03-31 10:55:37.146175491 +0200 @@ -25,6 +25,7 @@ * Havoc Pennington * George Lebl * Mark McLoughlin + * Tom Tromey (Copyright (C) 1998) */ #include @@ -42,8 +43,6 @@ #include #include -#include - #include #include #include @@ -335,6 +334,132 @@ dummy_child_watch (GPid pid, */ } + +/** + * panel_run_dialog_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. + **/ +/* TODO: throw out this function if there ever is a proper GAppInfo port */ +static void +panel_run_dialog_prepend_terminal_to_vector (int *argc, char ***argv) +{ + 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); + + /* 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); +} + static gboolean panel_run_dialog_launch_command (PanelRunDialog *dialog, const char *command, @@ -354,7 +479,7 @@ panel_run_dialog_launch_command (PanelRu screen = gtk_window_get_screen (GTK_WINDOW (dialog->run_dialog)); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->terminal_checkbox))) - gnome_desktop_prepend_terminal_to_vector (&argc, &argv); + panel_run_dialog_prepend_terminal_to_vector (&argc, &argv); display = gdk_screen_make_display_name (screen);