Allow to copy full process command line (#33)
This commit is contained in:
committed by
Andre Miranda
parent
9b68e2dcd8
commit
8a4ad6c8a3
@@ -98,10 +98,11 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
|
|||||||
|
|
||||||
/* Create tree view model */
|
/* Create tree view model */
|
||||||
#ifdef HAVE_WNCK
|
#ifdef HAVE_WNCK
|
||||||
treeview->model = gtk_list_store_new (XTM_PTV_N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT64,
|
treeview->model = gtk_list_store_new (XTM_PTV_N_COLUMNS, GDK_TYPE_PIXBUF,
|
||||||
#else
|
#else
|
||||||
treeview->model = gtk_list_store_new (XTM_PTV_N_COLUMNS, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT64,
|
treeview->model = gtk_list_store_new (XTM_PTV_N_COLUMNS,
|
||||||
#endif
|
#endif
|
||||||
|
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT64,
|
||||||
G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_STRING, G_TYPE_INT,
|
G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_STRING, G_TYPE_INT,
|
||||||
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_LONG);
|
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_LONG);
|
||||||
|
|
||||||
@@ -423,10 +424,55 @@ cb_set_priority (GtkMenuItem *mi, gpointer user_data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the "Copy command line" context menu item.
|
||||||
|
*
|
||||||
|
* The clipboard is only modified if finding the process was successful,
|
||||||
|
* i.e. if the process died while the user had the context menu open and then
|
||||||
|
* chose to copy the command line afterwards, nothing happens.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
cb_copy_command_line (GtkMenuItem *mi, gpointer user_data)
|
||||||
|
{
|
||||||
|
XtmProcessTreeView *view = XTM_PROCESS_TREE_VIEW (user_data);
|
||||||
|
GPid pid = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (mi), "pid"));
|
||||||
|
GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
|
||||||
|
gboolean keep_looking = TRUE;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkClipboard *clipboard;
|
||||||
|
|
||||||
|
if (!gtk_tree_model_get_iter_first (model, &iter))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Look up the process in the model by the known PID */
|
||||||
|
while (keep_looking)
|
||||||
|
{
|
||||||
|
GPid pid_iter;
|
||||||
|
gtk_tree_model_get (model, &iter, XTM_PTV_COLUMN_PID, &pid_iter, -1);
|
||||||
|
|
||||||
|
if (pid_iter == pid)
|
||||||
|
{
|
||||||
|
gchar *cmdline;
|
||||||
|
gtk_tree_model_get (model, &iter, XTM_PTV_COLUMN_COMMAND_RAW, &cmdline, -1);
|
||||||
|
|
||||||
|
clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
|
||||||
|
gtk_clipboard_set_text (clipboard, cmdline, -1);
|
||||||
|
|
||||||
|
keep_looking = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
keep_looking = gtk_tree_model_iter_next (model, &iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static GtkWidget *
|
static GtkWidget *
|
||||||
build_context_menu (XtmProcessTreeView *treeview, GPid pid)
|
build_context_menu (XtmProcessTreeView *treeview, GPid pid)
|
||||||
{
|
{
|
||||||
GtkWidget *menu, *menu_priority, *mi;
|
GtkWidget *menu, *menu_priority, *mi, *accel_label;
|
||||||
|
|
||||||
menu = gtk_menu_new ();
|
menu = gtk_menu_new ();
|
||||||
|
|
||||||
@@ -487,6 +533,14 @@ build_context_menu (XtmProcessTreeView *treeview, GPid pid)
|
|||||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), menu_priority);
|
gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), menu_priority);
|
||||||
gtk_container_add (GTK_CONTAINER (menu), mi);
|
gtk_container_add (GTK_CONTAINER (menu), mi);
|
||||||
|
|
||||||
|
mi = gtk_menu_item_new_with_label (_("Copy command line"));
|
||||||
|
g_object_set_data (G_OBJECT (mi), "pid", GINT_TO_POINTER (pid));
|
||||||
|
gtk_container_add (GTK_CONTAINER (menu), mi);
|
||||||
|
g_signal_connect (mi, "activate", G_CALLBACK (cb_copy_command_line), treeview);
|
||||||
|
/* Refer to treeview_key_pressed to see how the Ctrl-c press is handled */
|
||||||
|
accel_label = gtk_bin_get_child (GTK_BIN (mi));
|
||||||
|
gtk_accel_label_set_accel(GTK_ACCEL_LABEL (accel_label), GDK_KEY_c, GDK_CONTROL_MASK);
|
||||||
|
|
||||||
gtk_widget_show_all (menu);
|
gtk_widget_show_all (menu);
|
||||||
|
|
||||||
return menu;
|
return menu;
|
||||||
@@ -575,6 +629,14 @@ treeview_key_pressed (XtmProcessTreeView *treeview, GdkEventKey *event)
|
|||||||
cb_send_signal (GTK_MENU_ITEM (mi), GINT_TO_POINTER (XTM_SIGNAL_TERMINATE));
|
cb_send_signal (GTK_MENU_ITEM (mi), GINT_TO_POINTER (XTM_SIGNAL_TERMINATE));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
else if (event->keyval == GDK_KEY_c && (event->state & modifiers) == GDK_CONTROL_MASK)
|
||||||
|
{
|
||||||
|
/* Same trick as above */
|
||||||
|
GtkWidget *mi = gtk_menu_item_new_with_label (_("Copy command line"));
|
||||||
|
g_object_set_data (G_OBJECT (mi), "pid", GINT_TO_POINTER (pid));
|
||||||
|
cb_copy_command_line (GTK_MENU_ITEM (mi), treeview);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|||||||
@@ -21,7 +21,10 @@ enum
|
|||||||
#ifdef HAVE_WNCK
|
#ifdef HAVE_WNCK
|
||||||
XTM_PTV_COLUMN_ICON,
|
XTM_PTV_COLUMN_ICON,
|
||||||
#endif
|
#endif
|
||||||
|
/* might be prettified; shown to user */
|
||||||
XTM_PTV_COLUMN_COMMAND,
|
XTM_PTV_COLUMN_COMMAND,
|
||||||
|
/* never prettified; used for copying command line to clipboard */
|
||||||
|
XTM_PTV_COLUMN_COMMAND_RAW,
|
||||||
XTM_PTV_COLUMN_PID,
|
XTM_PTV_COLUMN_PID,
|
||||||
XTM_PTV_COLUMN_PPID,
|
XTM_PTV_COLUMN_PPID,
|
||||||
XTM_PTV_COLUMN_STATE,
|
XTM_PTV_COLUMN_STATE,
|
||||||
|
|||||||
@@ -295,6 +295,7 @@ model_update_tree_iter (XtmTaskManager *manager, GtkTreeIter *iter, glong timest
|
|||||||
}
|
}
|
||||||
|
|
||||||
gtk_list_store_set (GTK_LIST_STORE (model), iter,
|
gtk_list_store_set (GTK_LIST_STORE (model), iter,
|
||||||
|
XTM_PTV_COLUMN_COMMAND_RAW, task->cmdline,
|
||||||
XTM_PTV_COLUMN_PPID, task->ppid,
|
XTM_PTV_COLUMN_PPID, task->ppid,
|
||||||
XTM_PTV_COLUMN_STATE, task->state,
|
XTM_PTV_COLUMN_STATE, task->state,
|
||||||
XTM_PTV_COLUMN_VSZ, task->vsz,
|
XTM_PTV_COLUMN_VSZ, task->vsz,
|
||||||
|
|||||||
Reference in New Issue
Block a user