Index: xfrun-dialog.c =================================================================== --- xfrun-dialog.c (revisão 26941) +++ xfrun-dialog.c (cópia de trabalho) @@ -48,6 +48,7 @@ GtkWidget *comboboxentry; GtkWidget *entry; GtkWidget *terminal_chk; + GtkWidget *sudo_chk; GtkTreeModel *completion_model; gchar *run_argument; @@ -74,6 +75,7 @@ { XFRUN_COL_COMMAND = 0, XFRUN_COL_IN_TERMINAL, + XFRUN_COL_WITH_SUDO, XFRUN_N_COLS, }; @@ -160,7 +162,7 @@ static void xfrun_dialog_init(XfrunDialog *dialog) { - GtkWidget *entry, *comboboxentry, *chk, *btn, *vbox, *bbox; + GtkWidget *entry, *comboboxentry, *chk, *schk, *btn, *vbox, *bbox; GtkTreeIter itr; dialog->priv = G_TYPE_INSTANCE_GET_PRIVATE(dialog, XFRUN_TYPE_DIALOG, @@ -188,10 +190,15 @@ dialog->priv->terminal_chk = chk = gtk_check_button_new_with_mnemonic(_("Run in _terminal")); gtk_widget_show(chk); gtk_box_pack_start(GTK_BOX(vbox), chk, FALSE, FALSE, 0); + + dialog->priv->sudo_chk = schk = gtk_check_button_new_with_mnemonic(_("Run with _sudo")); + gtk_widget_show(schk); + gtk_box_pack_start(GTK_BOX(vbox), schk, FALSE, FALSE, 0); if(gtk_tree_model_get_iter_first(dialog->priv->completion_model, &itr)) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(comboboxentry), &itr); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk), FALSE); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(schk), FALSE); } bbox = gtk_hbutton_box_new(); @@ -364,6 +371,7 @@ GtkTreeModel *model; GtkTreeIter iter; gboolean in_terminal = FALSE; + gboolean with_sudo = FALSE; if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboboxentry), &iter)) { model = gtk_combo_box_get_model(GTK_COMBO_BOX(comboboxentry)); @@ -372,6 +380,12 @@ -1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->priv->terminal_chk), in_terminal); + + gtk_tree_model_get(model, &iter, + XFRUN_COL_WITH_SUDO, &with_sudo, + -1); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->priv->sudo_chk), with_sudo); + } return FALSE; @@ -385,11 +399,12 @@ { XfrunDialog *dialog = XFRUN_DIALOG(data); gchar *command = NULL; - gboolean in_terminal = FALSE, ret = FALSE; + gboolean in_terminal = FALSE, ret = FALSE, with_sudo = FALSE; gtk_tree_model_get(model, iter, XFRUN_COL_COMMAND, &command, XFRUN_COL_IN_TERMINAL, &in_terminal, + XFRUN_COL_WITH_SUDO, &with_sudo, -1); if(!g_utf8_collate(command, dialog->priv->entry_val_tmp)) { @@ -424,7 +439,8 @@ static void xfrun_add_to_history(const gchar *command, - gboolean in_terminal) + gboolean in_terminal, + gboolean with_sudo) { gchar *histfile, *histfile1, **lines = xfrun_get_histfile_content(); gint i; @@ -441,21 +457,21 @@ if(!lines) { fp = fopen(histfile, "w"); if(fp) { - fprintf(fp, "%d:%s\n", in_terminal ? 1 : 0, command); + fprintf(fp, "%d:%d:%s\n", in_terminal ? 1 : 0, with_sudo ? 1 : 0, command); fclose(fp); } } else { gchar *new_line; for(i = 0; lines[i]; ++i) { - if(strlen(lines[i]) < 3 || lines[i][1] != ':') + if(strlen(lines[i]) < 5 || lines[i][1] != ':' || lines[i][3] != ':') continue; if(g_utf8_collate(lines[i] + 2, command)) new_lines = g_list_append(new_lines, lines[i]); } - new_line = g_strdup_printf("%d:%s", in_terminal ? 1 : 0, command); + new_line = g_strdup_printf("%d:%d:%s", in_terminal ? 1 : 0, with_sudo ? 1 : 0, command); new_lines = g_list_prepend(new_lines, new_line); fp = fopen(histfile, "w"); @@ -494,13 +510,14 @@ { XfrunDialog *dialog = XFRUN_DIALOG(user_data); gchar *cmdline, **argv = NULL; - gboolean in_terminal; + gboolean in_terminal, with_sudo; GdkScreen *gscreen; GError *error = NULL; gint argc; cmdline = gtk_editable_get_chars(GTK_EDITABLE(dialog->priv->entry), 0, -1); in_terminal = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->priv->terminal_chk)); + with_sudo = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->priv->sudo_chk)); gscreen = gtk_widget_get_screen(widget); @@ -518,14 +535,26 @@ if(in_terminal) { gint i = 0; - argv = g_new0(gchar *, 4); + if (with_sudo) + argv = g_new0(gchar *, 5); + else + argv = g_new0(gchar *, 4); argv[i++] = "xfterm4"; argv[i++] = "-e"; + if (with_sudo) + argv[i++] = "sudo"; argv[i++] = cmdline; argv[i++] = NULL; } else { /* error is handled below */ - g_shell_parse_argv(cmdline, &argc, &argv, &error); + if (with_sudo) { + gchar *new_cmdline, *run_arg_quoted; + new_cmdline = g_strconcat("gksudo ", cmdline, NULL); + g_shell_parse_argv(new_cmdline, &argc, &argv, &error); + g_free(new_cmdline); + } else { + g_shell_parse_argv(cmdline, &argc, &argv, &error); + } } if(argv && xfce_gdk_spawn_on_screen(gscreen, @@ -534,7 +563,7 @@ xfrun_spawn_child_setup, NULL, NULL, &error)) { - xfrun_add_to_history(cmdline, in_terminal); + xfrun_add_to_history(cmdline, in_terminal, with_sudo); xfrun_dialog_delete_event(GTK_WIDGET(dialog), NULL); } else { gchar *primary = g_strdup_printf(_("The command \"%s\" failed to run:"), @@ -563,6 +592,7 @@ { XfrunDialog *dialog = XFRUN_DIALOG(user_data); gboolean in_terminal = FALSE; + gboolean with_sudo = FALSE; gtk_tree_model_get(model, iter, XFRUN_COL_IN_TERMINAL, &in_terminal, @@ -570,6 +600,12 @@ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->priv->terminal_chk), in_terminal); + gtk_tree_model_get(model, iter, + XFRUN_COL_WITH_SUDO, &with_sudo, + -1); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->priv->sudo_chk), + with_sudo); + return FALSE; } @@ -579,23 +615,24 @@ GtkListStore *ls; gchar **lines = NULL; gchar *histfile = NULL; + ls = gtk_list_store_new(XFRUN_N_COLS, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); - ls = gtk_list_store_new(XFRUN_N_COLS, G_TYPE_STRING, G_TYPE_BOOLEAN); - lines = xfrun_get_histfile_content(); if(lines) { GtkTreeIter itr; gint i; for(i = 0; lines[i]; ++i) { - if(strlen(lines[i]) < 3 || lines[i][1] != ':') + if(strlen(lines[i]) < 5 || lines[i][1] != ':' || lines[i][3] != ':') continue; gtk_list_store_append(ls, &itr); gtk_list_store_set(ls, &itr, - XFRUN_COL_COMMAND, lines[i] + 2, + XFRUN_COL_COMMAND, lines[i] + 4, XFRUN_COL_IN_TERMINAL, lines[i][0] == '1' ? TRUE : FALSE, + XFRUN_COL_WITH_SUDO, + lines[i][2] == '1' ? TRUE : FALSE, -1); }