Revision: 3550 http://geany.svn.sourceforge.net/geany/?rev=3550&view=rev Author: eht16 Date: 2009-02-05 19:10:57 +0000 (Thu, 05 Feb 2009)
Log Message: ----------- Special case Menu key presses and Shift-F10 to show the popup menu of the widgets where they were pressed instead of always the document notebook tab list.
Modified Paths: -------------- trunk/ChangeLog trunk/src/keybindings.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-02-05 19:04:54 UTC (rev 3549) +++ trunk/ChangeLog 2009-02-05 19:10:57 UTC (rev 3550) @@ -4,6 +4,10 @@ src/geanyobject.c, src/geanywraplabel.c: Use the G_DEFINE_TYPE() macro to generate the *_get_type() code. Remove useless geany_object_finalize() function. + * src/keybindings.c: + Special case Menu key presses and Shift-F10 to show the popup menu + of the widgets where they were pressed instead of always the + document notebook tab list.
2009-02-04 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
Modified: trunk/src/keybindings.c =================================================================== --- trunk/src/keybindings.c 2009-02-05 19:04:54 UTC (rev 3549) +++ trunk/src/keybindings.c 2009-02-05 19:10:57 UTC (rev 3550) @@ -33,6 +33,7 @@ #include "utils.h" #include "ui_utils.h" #include "document.h" +#include "documentprivate.h" #include "filetypes.h" #include "callbacks.h" #include "prefs.h" @@ -45,6 +46,7 @@ #include "symbols.h" #include "vte.h" #include "toolbar.h" +#include "treeviews.h" #include "geanywraplabel.h"
@@ -915,7 +917,84 @@ }
+/* Transforms a GdkEventKey event into a GdkEventButton event */ +static void trigger_button_event(GtkWidget *widget, guint32 event_time) +{ + GdkEventButton *event; + gboolean ret; + + event = g_new0(GdkEventButton, 1); + + if (GTK_IS_TEXT_VIEW(widget)) + event->window = gtk_text_view_get_window(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_TEXT); + else + event->window = widget->window; + event->time = event_time; + event->type = GDK_BUTTON_PRESS; + event->button = 3; + + g_signal_emit_by_name(widget, "button-press-event", event, &ret); + g_signal_emit_by_name(widget, "button-release-event", event, &ret); + + g_free(event); +} + + +/* Special case for the Menu key and Shift-F10 to show the right-click popup menu for various + * widgets. Without this special handling, the notebook tab list of the documents' notebook + * would be shown. As a very special case, we differentiate between the Menu key and Shift-F10 + * if pressed in the editor widget: the Menu key opens the popup menu, Shift-F10 opens the + * notebook tab list. */ +static gboolean check_menu_key(guint keyval, guint state, guint32 event_time) +{ + if ((keyval == GDK_Menu && state == 0) || (keyval == GDK_F10 && state == GDK_SHIFT_MASK)) + { + GeanyDocument *doc = document_get_current(); + GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window)); + static GtkWidget *scribble = NULL; + + if (scribble == NULL) + scribble = ui_lookup_widget(main_widgets.window, "textview_scribble"); + + if (doc != NULL) + { + if (focusw == doc->priv->tag_tree) + { + trigger_button_event(focusw, event_time); + return TRUE; + } + if (focusw == GTK_WIDGET(doc->editor->sci)) + { + if (keyval == GDK_Menu) + { /* show editor popup menu */ + trigger_button_event(focusw, event_time); + return TRUE; + } + else + /* we return FALSE, so the default handler will be used and show + * the GTK notebook tab list */ + return FALSE; + } + } + if (focusw == tv.tree_openfiles + || focusw == msgwindow.tree_status + || focusw == msgwindow.tree_compiler + || focusw == msgwindow.tree_msg + || focusw == scribble #ifdef HAVE_VTE + || (vte_info.have_vte && focusw == vc->vte) +#endif + ) + { + trigger_button_event(focusw, event_time); + return TRUE; + } + } + return FALSE; +} + + +#ifdef HAVE_VTE static gboolean on_menu_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { @@ -1015,6 +1094,8 @@ #endif if (check_snippet_completion(keyval, state)) return TRUE; + if (check_menu_key(keyval, state, ev->time)) + return TRUE;
ignore_keybinding = FALSE; for (g = 0; g < keybinding_groups->len; g++)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.