SF.net SVN: geany: [2253] trunk/src

eht16 at users.sourceforge.net eht16 at xxxxx
Tue Feb 12 15:49:57 UTC 2008


Revision: 2253
          http://geany.svn.sourceforge.net/geany/?rev=2253&view=rev
Author:   eht16
Date:     2008-02-12 07:49:54 -0800 (Tue, 12 Feb 2008)

Log Message:
-----------
Use a modifiers mask to ignore unwanted modifiers(caps lock, num lock) when handling key presses (maybe fixes #1891276).      

Modified Paths:
--------------
    trunk/src/keybindings.c
    trunk/src/keybindings.h
    trunk/src/prefs.c

Modified: trunk/src/keybindings.c
===================================================================
--- trunk/src/keybindings.c	2008-02-12 12:30:41 UTC (rev 2252)
+++ trunk/src/keybindings.c	2008-02-12 15:49:54 UTC (rev 2253)
@@ -623,16 +623,16 @@
 }
 
 
-static gboolean check_fixed_kb(GdkEventKey *event)
+static gboolean check_fixed_kb(guint keyval, guint state)
 {
 	// check alt-0 to alt-9 for setting current notebook page
-	if (event->state & GDK_MOD1_MASK && event->keyval >= GDK_0 && event->keyval <= GDK_9)
+	if (state & GDK_MOD1_MASK && keyval >= GDK_0 && keyval <= GDK_9)
 	{
-		gint page = event->keyval - GDK_0 - 1;
+		gint page = keyval - GDK_0 - 1;
 		gint npages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook));
 
 		// alt-0 is for the rightmost tab
-		if (event->keyval == GDK_0)
+		if (keyval == GDK_0)
 			page = npages - 1;
 		// invert the order if tabs are added on the other side
 		if (swap_alt_tab_order && ! prefs.tab_order_ltr)
@@ -641,14 +641,14 @@
 		gtk_notebook_set_current_page(GTK_NOTEBOOK(app->notebook), page);
 		return TRUE;
 	}
-	if (event->keyval == GDK_Page_Up || event->keyval == GDK_Page_Down)
+	if (keyval == GDK_Page_Up || keyval == GDK_Page_Down)
 	{
 		// switch to first or last document
-		if (event->state == (GDK_CONTROL_MASK | GDK_SHIFT_MASK))
+		if (state == (GDK_CONTROL_MASK | GDK_SHIFT_MASK))
 		{
-			if (event->keyval == GDK_Page_Up)
+			if (keyval == GDK_Page_Up)
 				gtk_notebook_set_current_page(GTK_NOTEBOOK(app->notebook), 0);
-			if (event->keyval == GDK_Page_Down)
+			if (keyval == GDK_Page_Down)
 				gtk_notebook_set_current_page(GTK_NOTEBOOK(app->notebook),
 					gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook)) - 1);
 			return TRUE;
@@ -660,11 +660,11 @@
 
 /* We have a special case for GEANY_KEYS_EDIT_COMPLETESNIPPET, because we need to
  * return FALSE if no completion occurs, so the tab or space is handled normally. */
-static gboolean check_snippet_completion(GdkEventKey *event)
+static gboolean check_snippet_completion(guint keyval, guint state)
 {
 	const guint i = GEANY_KEYS_EDIT_COMPLETESNIPPET;
 
-	if (keys[i]->key == event->keyval && keys[i]->mods == event->state)
+	if (keys[i]->key == keyval && keys[i]->mods == state)
 	{
 		gint idx = document_get_cur_idx();
 		GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(app->window));
@@ -729,35 +729,32 @@
 
 
 /* central keypress event handler, almost all keypress events go to this function */
-gboolean keybindings_got_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+gboolean keybindings_got_event(GtkWidget *widget, GdkEventKey *ev, gpointer user_data)
 {
-	guint i, keyval = event->keyval;
+	guint i, state, keyval;
 
 	if (keyval == 0)
 		return FALSE;
 
+	keyval = ev->keyval;
+    state = ev->state & GEANY_KEYS_MODIFIER_MASK;
+
 	// hack to get around that CTRL+Shift+r results in GDK_R not GDK_r
-	if (event->state & GDK_SHIFT_MASK || event->state & GDK_LOCK_MASK)
+	if (state & GDK_SHIFT_MASK)
 		if (keyval >= GDK_A && keyval <= GDK_Z)
 			keyval += GDK_a - GDK_A;
-	// now ignore caps-lock
-	if (event->state & GDK_LOCK_MASK)
-		event->state -= GDK_LOCK_MASK;
-	// ignore numlock key, not necessary but nice
-	if (event->state & GDK_MOD2_MASK)
-		event->state -= GDK_MOD2_MASK;
 
 	// special cases
 #ifdef HAVE_VTE
-	if (vte_info.have_vte && check_vte(event->state, keyval))
+	if (vte_info.have_vte && check_vte(state, keyval))
 		return FALSE;
 #endif
-	if (check_snippet_completion(event))
+	if (check_snippet_completion(keyval, state))
 		return TRUE;
 
 	for (i = 0; i < GEANY_MAX_KEYS; i++)
 	{
-		if (keyval == keys[i]->key && event->state == keys[i]->mods)
+		if (keyval == keys[i]->key && state == keys[i]->mods)
 		{
 			if (keys[i]->cb_func == NULL)
 				return FALSE;	// ignore the keybinding
@@ -768,7 +765,7 @@
 		}
 	}
 	// fixed keybindings can be overridden by user bindings
-	if (check_fixed_kb(event))
+	if (check_fixed_kb(keyval, state))
 		return TRUE;
 	return FALSE;
 }

Modified: trunk/src/keybindings.h
===================================================================
--- trunk/src/keybindings.h	2008-02-12 12:30:41 UTC (rev 2252)
+++ trunk/src/keybindings.h	2008-02-12 15:49:54 UTC (rev 2253)
@@ -45,6 +45,15 @@
 } KeyBinding;
 
 
+// allowed modifier keys (especially no Caps lock, no Num lock)
+#define GEANY_KEYS_MODIFIER_MASK (GDK_SHIFT_MASK | \
+                       GDK_CONTROL_MASK | \
+                       GDK_MOD1_MASK | \
+                       GDK_META_MASK | \
+                       GDK_SUPER_MASK | \
+                       GDK_HYPER_MASK)
+
+
 // Plugin API
 typedef enum
 {

Modified: trunk/src/prefs.c
===================================================================
--- trunk/src/prefs.c	2008-02-12 12:30:41 UTC (rev 2252)
+++ trunk/src/prefs.c	2008-02-12 15:49:54 UTC (rev 2253)
@@ -1139,15 +1139,15 @@
 static gboolean on_keytype_dialog_response(GtkWidget *dialog, GdkEventKey *event, gpointer user_data)
 {
 	gchar *str;
+	gint state;
 
-	if (event->state == 0 && event->keyval == GDK_Escape)
+    state = event->state & GEANY_KEYS_MODIFIER_MASK;
+
+	if (event->keyval == GDK_Escape)
 		return FALSE;	// close the dialog, don't allow escape when detecting keybindings.
 
-	// ignore numlock key, not necessary but nice
-	if (event->state & GDK_MOD2_MASK) event->state -= GDK_MOD2_MASK;
+	str = gtk_accelerator_name(event->keyval, state);
 
-	str = gtk_accelerator_name(event->keyval, event->state);
-
 	gtk_label_set_text(GTK_LABEL(dialog_label), str);
 	g_free(str);
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list