Revision: 4441 http://geany.svn.sourceforge.net/geany/?rev=4441&view=rev Author: eht16 Date: 2009-11-23 22:25:11 +0000 (Mon, 23 Nov 2009)
Log Message: ----------- Add keybindings_check_event() to manually check GdkKeyEvents against Geany's keybindings.
Modified Paths: -------------- trunk/ChangeLog trunk/src/keybindings.c trunk/src/keybindings.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-11-23 21:03:24 UTC (rev 4440) +++ trunk/ChangeLog 2009-11-23 22:25:11 UTC (rev 4441) @@ -8,6 +8,9 @@ Add new command line option "--socket-file" to be able to specify separate socket filenames for instances (closes #2896027, patch by Jörn Reder, thanks). + * src/keybindings.c, src/keybindings.h: + Add keybindings_check_event() to manually check GdkKeyEvents against + Geany's keybindings.
2009-11-22 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
Modified: trunk/src/keybindings.c =================================================================== --- trunk/src/keybindings.c 2009-11-23 21:03:24 UTC (rev 4440) +++ trunk/src/keybindings.c 2009-11-23 22:25:11 UTC (rev 4441) @@ -1138,6 +1138,52 @@ }
+/* Stripped down version of the main keypress event handler which can be used + * to process foreign events. Instead of executing the keybinding, a pointer to the + * keybinding structure is returned. + * Additionally, the group_id and binding_id are filled with the appropriate indexes + * if non-NULL. */ +const GeanyKeyBinding *keybindings_check_event(GdkEventKey *ev, gint *group_id, gint *binding_id) +{ + guint state, keyval; + gsize g, i; + GeanyKeyGroup *group; + GeanyKeyBinding *kb; + + if (ev->keyval == 0) + return FALSE; + + keyval = ev->keyval; + state = ev->state & gtk_accelerator_get_default_mod_mask(); + /* hack to get around that CTRL+Shift+r results in GDK_R not GDK_r */ + if ((ev->state & GDK_SHIFT_MASK) || (ev->state & GDK_LOCK_MASK)) + if (keyval >= GDK_A && keyval <= GDK_Z) + keyval += GDK_a - GDK_A; + + if (keyval >= GDK_KP_Space && keyval < GDK_KP_Equal) + keyval = key_kp_translate(keyval); + + for (g = 0; g < keybinding_groups->len; g++) + { + group = g_ptr_array_index(keybinding_groups, g); + + for (i = 0; i < group->count; i++) + { + kb = &group->keys[i]; + if (keyval == kb->key && state == kb->mods) + { + if (group_id != NULL) + *group_id = g; + if (binding_id != NULL) + *binding_id = i; + return kb; + } + } + } + return NULL; +} + + /* central keypress event handler, almost all keypress events go to this function */ static gboolean on_key_press_event(GtkWidget *widget, GdkEventKey *ev, gpointer user_data) { @@ -1155,7 +1201,7 @@ document_check_disk_status(doc, FALSE);
keyval = ev->keyval; - state = ev->state & gtk_accelerator_get_default_mod_mask(); + state = ev->state & gtk_accelerator_get_default_mod_mask(); /* hack to get around that CTRL+Shift+r results in GDK_R not GDK_r */ if ((ev->state & GDK_SHIFT_MASK) || (ev->state & GDK_LOCK_MASK)) if (keyval >= GDK_A && keyval <= GDK_Z)
Modified: trunk/src/keybindings.h =================================================================== --- trunk/src/keybindings.h 2009-11-23 21:03:24 UTC (rev 4440) +++ trunk/src/keybindings.h 2009-11-23 22:25:11 UTC (rev 4441) @@ -366,5 +366,7 @@
void keybindings_show_shortcuts(void);
+const GeanyKeyBinding *keybindings_check_event(GdkEventKey *ev, gint *group_id, gint *binding_id); + #endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.