[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26004] trunk/blender/source/blender/ windowmanager/intern/wm_event_system.c: [#19978] Can not switch view with keymaps while emulate numpad is activated; in modes other than object and edit

Martin Poirier theeth at yahoo.com
Thu Jan 14 19:15:12 CET 2010


Revision: 26004
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26004
Author:   theeth
Date:     2010-01-14 19:15:12 +0100 (Thu, 14 Jan 2010)

Log Message:
-----------
[#19978] Can not switch view with keymaps while emulate numpad is activated; in modes other than object and edit

Was caused by event emulation (numpad and mmb) happening separately at each level of the keymap, so brush selection was latching on the event before it had time to test emulated values with view navigation entries (at a lower level in the hierarchy).

After discussion with Matt, decided that event emulation should be done at the root of the event loop, replacing the event with the emulated values. This is much more predictable and more logical as far as event emulation goes.

Modified Paths:
--------------
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-01-14 18:11:10 UTC (rev 26003)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-01-14 18:15:12 UTC (rev 26004)
@@ -768,48 +768,42 @@
 	return kmitype;
 }
 
-static int wm_eventmatch(wmEvent *winevent, wmKeyMapItem *kmi)
+static void wm_eventemulation(wmEvent *event)
 {
-	int kmitype= WM_userdef_event_map(kmi->type);
-
-	if(kmi->flag & KMI_INACTIVE) return 0;
-
-	/* exception for middlemouse emulation */
-	if((U.flag & USER_TWOBUTTONMOUSE) && (kmi->type == MIDDLEMOUSE)) {
-		if(winevent->type == LEFTMOUSE && winevent->alt) {
-			wmKeyMapItem tmp= *kmi;
-
-			tmp.type= winevent->type;
-			tmp.alt= winevent->alt;
-			if(wm_eventmatch(winevent, &tmp))
-				return 1;
+	/* middlemouse emulation */
+	if(U.flag & USER_TWOBUTTONMOUSE) {
+		if(event->type == LEFTMOUSE && event->alt) {
+			event->type = MIDDLEMOUSE;
+			event->alt = 0;
 		}
 	}
-	/* exception for numpad emulation */
-	else if(U.flag & USER_NONUMPAD) {
-		wmKeyMapItem tmp= *kmi;
 
-		switch(kmi->type) {
-			case PAD0: tmp.type = ZEROKEY; break;
-			case PAD1: tmp.type = ONEKEY; break;
-			case PAD2: tmp.type = TWOKEY; break;
-			case PAD3: tmp.type = THREEKEY; break;
-			case PAD4: tmp.type = FOURKEY; break;
-			case PAD5: tmp.type = FIVEKEY; break;
-			case PAD6: tmp.type = SIXKEY; break;
-			case PAD7: tmp.type = SEVENKEY; break;
-			case PAD8: tmp.type = EIGHTKEY; break;
-			case PAD9: tmp.type = NINEKEY; break;
-			case PADMINUS: tmp.type = MINUSKEY; break;
-			case PADPLUSKEY: tmp.type = EQUALKEY; break;
-			case PADSLASHKEY: tmp.type = BACKSLASHKEY; break;
+	/* numpad emulation */
+	if(U.flag & USER_NONUMPAD) {
+		switch(event->type) {
+			case ZEROKEY: event->type = PAD0; break;
+			case ONEKEY: event->type = PAD1; break;
+			case TWOKEY: event->type = PAD2; break;
+			case THREEKEY: event->type = PAD3; break;
+			case FOURKEY: event->type = PAD4; break;
+			case FIVEKEY: event->type = PAD5; break;
+			case SIXKEY: event->type = PAD6; break;
+			case SEVENKEY: event->type = PAD7; break;
+			case EIGHTKEY: event->type = PAD8; break;
+			case NINEKEY: event->type = PAD9; break;
+			case MINUSKEY: event->type = PADMINUS; break;
+			case EQUALKEY: event->type = PADPLUSKEY; break;
+			case BACKSLASHKEY: event->type = PADSLASHKEY; break;
 		}
-
-		if(tmp.type != kmi->type)
-			if(wm_eventmatch(winevent, &tmp))
-				return 1;
 	}
+}
 
+static int wm_eventmatch(wmEvent *winevent, wmKeyMapItem *kmi)
+{
+	int kmitype= WM_userdef_event_map(kmi->type);
+
+	if(kmi->flag & KMI_INACTIVE) return 0;
+
 	/* the matching rules */
 	if(kmitype==KM_TEXTINPUT)
 		if(ISTEXTINPUT(winevent->type) && winevent->ascii) return 1;
@@ -1335,6 +1329,8 @@
 		while( (event= win->queue.first) ) {
 			int action = WM_HANDLER_CONTINUE;
 
+			wm_eventemulation(event);
+
 			CTX_wm_window_set(C, win);
 			
 			/* we let modal handlers get active area/region, also wm_paintcursor_test needs it */





More information about the Bf-blender-cvs mailing list