[Xfce4-commits] <xfce4-taskmanager:master> Display tree view context menu on Menu key press
Mike Massonnet
noreply at xfce.org
Thu Jun 10 03:04:03 CEST 2010
Updating branch refs/heads/master
to 5eec456b9b10094c2161ad69940a5528f9cb1403 (commit)
from 20dbcee075c41313550081b6dcd933a194349468 (commit)
commit 5eec456b9b10094c2161ad69940a5528f9cb1403
Author: Mike Massonnet <mmassonnet at xfce.org>
Date: Thu Jun 10 02:51:08 2010 +0200
Display tree view context menu on Menu key press
src/process-tree-view.c | 61 ++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 55 insertions(+), 6 deletions(-)
diff --git a/src/process-tree-view.c b/src/process-tree-view.c
index d7ee2f7..a28f1e1 100644
--- a/src/process-tree-view.c
+++ b/src/process-tree-view.c
@@ -14,6 +14,7 @@
#include <glib-object.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
#include "process-tree-view.h"
#include "task-manager.h"
@@ -58,6 +59,7 @@ G_DEFINE_TYPE (XtmProcessTreeView, xtm_process_tree_view, GTK_TYPE_TREE_VIEW)
static void xtm_process_tree_view_finalize (GObject *object);
static gboolean treeview_clicked (XtmProcessTreeView *treeview, GdkEventButton *event);
+static gboolean treeview_key_pressed (XtmProcessTreeView *treeview, GdkEventKey *event);
static void columns_changed (XtmProcessTreeView *treeview);
static void read_columns_positions (XtmProcessTreeView *treeview);
static void save_columns_positions (XtmProcessTreeView *treeview);
@@ -224,6 +226,7 @@ xtm_process_tree_view_init (XtmProcessTreeView *treeview)
gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (treeview), (GtkTreeViewSearchEqualFunc)search_func, NULL, NULL);
g_signal_connect (treeview, "columns-changed", G_CALLBACK (columns_changed), NULL);
g_signal_connect (treeview, "button-press-event", G_CALLBACK (treeview_clicked), NULL);
+ g_signal_connect (treeview, "key-press-event", G_CALLBACK (treeview_key_pressed), NULL);
}
static void
@@ -442,18 +445,39 @@ build_context_menu (guint pid)
return menu;
}
+static void
+position_menu (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, XtmProcessTreeView *treeview)
+{
+ gdk_window_get_origin (gtk_tree_view_get_bin_window (GTK_TREE_VIEW (treeview)), x, y);
+ *x += 5;
+ *y += 5;
+ *push_in = TRUE;
+}
+
+static void
+popup_menu (XtmProcessTreeView *treeview, guint pid, guint activate_time, gboolean at_pointer_position)
+{
+ static GtkWidget *menu = NULL;
+ GtkMenuPositionFunc position_func = NULL;
+
+ if (at_pointer_position == FALSE)
+ position_func = (GtkMenuPositionFunc)position_menu;
+
+ if (menu != NULL)
+ gtk_widget_destroy (menu);
+
+ menu = build_context_menu (pid);
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, position_func, treeview, 1, activate_time);
+}
+
static gboolean
treeview_clicked (XtmProcessTreeView *treeview, GdkEventButton *event)
{
- static GtkWidget *menu = NULL;
guint pid;
if (event->button != 3)
return FALSE;
- if (menu != NULL)
- gtk_widget_destroy (menu);
-
{
GtkTreeModel *model;
GtkTreeSelection *selection;
@@ -477,8 +501,33 @@ treeview_clicked (XtmProcessTreeView *treeview, GdkEventButton *event)
#endif
}
- menu = build_context_menu (pid);
- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, event->button, event->time);
+ popup_menu (treeview, pid, event->time, TRUE);
+
+ return TRUE;
+}
+
+static gboolean
+treeview_key_pressed (XtmProcessTreeView *treeview, GdkEventKey *event)
+{
+ guint pid;
+
+ if (event->keyval != GDK_Menu)
+ return FALSE;
+
+ {
+ GtkTreeModel *model;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return FALSE;
+
+ gtk_tree_model_get (model, &iter, XTM_PTV_COLUMN_PID, &pid, -1);
+ }
+
+ popup_menu (treeview, pid, event->time, FALSE);
return TRUE;
}
More information about the Xfce4-commits
mailing list