From a8ef795eb902d073b6975529106de3dd830b32fc Mon Sep 17 00:00:00 2001 From: Maxx Cao Date: Wed, 13 Aug 2003 06:00:20 +0000 Subject: [PATCH] filter S-F10 key binding, and show popup menu. (popup_menu_placement_cb): 2003-08-10 Maxx Cao * gal/e-text/e-text.c (e_text_event): filter S-F10 key binding, and show popup menu. (popup_menu_placement_cb): function added to adjust popup menu position.+ (popup_targets_received): show popup menu in different ways, according to whether it's invoked by mouse click or key binding. svn path=/trunk/; revision=22204 --- widgets/text/e-text.c | 52 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c index fb2d330baf..668a7315da 100644 --- a/widgets/text/e-text.c +++ b/widgets/text/e-text.c @@ -43,6 +43,7 @@ #include #include #include /* for BlackPixel */ +#include #include #include #include @@ -2146,8 +2147,27 @@ e_text_event (GnomeCanvasItem *item, GdkEvent *event) } return_val = 0; break; - case GDK_KEY_PRESS: /* Fall Through */ + case GDK_KEY_PRESS: + + /* Handle S-F10 key binding here. */ + + if (event->key.keyval == GDK_F10 + && (event->key.state & GDK_SHIFT_MASK) + && text->handle_popup ){ + + /* Simulate a GdkEventButton here, so that we can call e_text_do_popup directly */ + + GdkEventButton *button = gdk_event_new (GDK_BUTTON_PRESS); + button->time = event->key.time; + button->button = 0; + e_text_do_popup (text, button, 0); + return TRUE; + } + + /* Fall Through */ + case GDK_KEY_RELEASE: + if (text->editing) { GdkEventKey key; gint ret; @@ -2516,6 +2536,22 @@ popup_menu_detach (GtkWidget *attach_widget, { } +static void +popup_menu_placement_cb (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) +{ + EText *text = E_TEXT(user_data); + GnomeCanvasItem *item = &text->item; + GnomeCanvas *parent = item->canvas; + + if (parent){ + gdk_window_get_origin (((GtkWidget*) parent)->window, x, y); + *x += item->x1 + text->width / 2; + *y += item->y1 + text->height / 2; + } + + return; +} + static void popup_targets_received (GtkClipboard *clipboard, GtkSelectionData *data, @@ -2587,9 +2623,17 @@ popup_targets_received (GtkClipboard *clipboard, button, position, popup_menu); - gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL, - NULL, NULL, - button->button, GDK_CURRENT_TIME); + /* If invoked by S-F10 key binding, button will be 0. */ + if (button->button == 0){ + gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL, + popup_menu_placement_cb, (gpointer)text, + button->button, GDK_CURRENT_TIME); + gdk_event_free (button); + } else { + gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL, + NULL, NULL, + button->button, GDK_CURRENT_TIME); + } g_object_unref (text); }