Index: launcher.c =================================================================== --- launcher.c (révision 21805) +++ launcher.c (copie de travail) @@ -417,6 +417,40 @@ } } +void +launcher_entry_exec_with_clip (GtkWidget *w, LauncherEntry *entry) +{ + gchar *real_exec = NULL, *paste = NULL, *paste_esc; + GtkClipboard *clip; + + clip = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + paste = gtk_clipboard_wait_for_text (clip); + if (paste != NULL) + { + /* Corrupt entry->real_exec */ + real_exec = g_strdup (entry->real_exec); + g_free (entry->real_exec); + paste_esc = g_strescape (paste, NULL); + entry->real_exec = g_strconcat (real_exec, + " \"", paste_esc, "\"", NULL); + g_free (paste); + g_free (paste_esc); + } + launcher_entry_exec (gtk_widget_get_screen (w), entry); + if (real_exec != NULL) + { + /* Restore entry->real_exec */ + g_stpcpy (entry->real_exec, real_exec); + g_free (real_exec); + } +} + +void +entry_swap_clip (LauncherEntry *entry, gboolean use_clip) +{ + entry->use_clip = use_clip; +} + static void launcher_entry_drop_cb (GdkScreen *screen, LauncherEntry *entry, GPtrArray *files) @@ -558,8 +592,15 @@ return TRUE; } + /* set the use_clip bit */ + if (ev->button == 1) + g_ptr_array_foreach (launcher->entries, (GFunc) entry_swap_clip, + (gpointer) FALSE); + else if (ev->button == 2) + g_ptr_array_foreach (launcher->entries, (GFunc) entry_swap_clip, + (gpointer) TRUE); /* don't activate on right-click */ - if (ev->button == 3) + else if (ev->button == 3) return TRUE; return FALSE; @@ -568,7 +609,10 @@ static void launcher_menu_item_activate (GtkWidget *mi, LauncherEntry *entry) { - launcher_entry_exec (gtk_widget_get_screen (mi), entry); + if (entry->use_clip) + launcher_entry_exec_with_clip (mi, entry); + else + launcher_entry_exec (gtk_widget_get_screen (mi), entry); } static void @@ -839,7 +883,14 @@ modifiers = gtk_accelerator_get_default_mod_mask (); - if (ev->button != 1 || (ev->button == 1 && + if (ev->button == 2) + { + launcher_entry_exec_with_clip (GTK_WIDGET (b), + g_ptr_array_index (launcher->entries, + 0)); + return FALSE; + } + else if (ev->button != 1 || (ev->button == 1 && (ev->state & modifiers) == GDK_CONTROL_MASK)) { return FALSE; Index: launcher.h =================================================================== --- launcher.h (révision 21805) +++ launcher.h (copie de travail) @@ -66,6 +66,7 @@ char *comment; char *exec; char *real_exec; + gboolean use_clip; LauncherIcon icon;