[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51808] trunk/blender/source/blender/ windowmanager/intern: Bugfix #33038

Ton Roosendaal ton at blender.org
Thu Nov 1 16:51:28 CET 2012


Revision: 51808
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51808
Author:   ton
Date:     2012-11-01 15:51:24 +0000 (Thu, 01 Nov 2012)
Log Message:
-----------
Bugfix #33038

TIMER events could get keymodifier set - in this case the user assigned
spacebar modifier for setting views (running smoothview timer)

Also: cleaned op old hacks from event checking code. 
The rule should be:

1) generate event properly, frozen state
2) pass on to handlers without exceptions or changing internal state

The only exception currently is for the "CLICK" (map key-release to unhandled
key-press).

Also: made --debug-event print OK. Slight cleanup in eventprinting in general.
It was putting the wmEvent state print in wrong place, doing it 4 or 8 times.

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

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2012-11-01 15:34:38 UTC (rev 51807)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2012-11-01 15:51:24 UTC (rev 51808)
@@ -452,10 +452,10 @@
 		RNA_enum_identifier(event_type_items, event->type, &type_id);
 		RNA_enum_identifier(event_value_items, event->val, &val_id);
 
-		printf("wmEvent - type:%d/%s, val:%d/%s, "
-		       "shift:%d, ctrl:%d, alt:%d, oskey:%d, keymodifier:%d, "
-		       "mouse:(%d,%d), ascii:'%c', utf8:'%.*s', "
-		       "keymap_idname:%s, pointer:%p\n",
+		printf("wmEvent  type:%d / %s, val:%d / %s, \n"
+		       "         shift:%d, ctrl:%d, alt:%d, oskey:%d, keymodifier:%d, \n"
+		       "         mouse:(%d,%d), ascii:'%c', utf8:'%.*s', "
+		       "         keymap_idname:%s, pointer:%p\n",
 		       event->type, type_id, event->val, val_id,
 		       event->shift, event->ctrl, event->alt, event->oskey, event->keymodifier,
 		       event->x, event->y, event->ascii,
@@ -1378,14 +1378,8 @@
 	if (kmi->oskey != KM_ANY)
 		if (winevent->oskey != kmi->oskey && !(winevent->oskey & kmi->oskey)) return 0;
 	
-	if (kmi->keymodifier)
-		if (winevent->keymodifier != kmi->keymodifier) return 0;
+	if (winevent->keymodifier != kmi->keymodifier) return 0;
 		
-	/* key modifiers always check when event has it */
-	/* otherwise regular keypresses with keymodifier still work */
-	if (winevent->keymodifier)
-		if (ISKEYBOARD(winevent->type)) // was ISTEXTINPUT - BUG [#30479]
-			if (winevent->keymodifier != kmi->keymodifier) return 0;
 	
 	return 1;
 }
@@ -1725,13 +1719,6 @@
 		return action;
 	}
 
-#ifndef NDEBUG
-	if (do_debug_handler) {
-		printf("%s: handling event\n", __func__);
-		WM_event_print(event);
-	}
-#endif
-
 	/* modal handlers can get removed in this loop, we keep the loop this way
 	 *
 	 * note: check 'handlers->first' because in rare cases the handlers can be cleared
@@ -1787,11 +1774,10 @@
 							action |= wm_handler_operator_call(C, handlers, handler, event, kmi->ptr);
 							if (action & WM_HANDLER_BREAK) {
 								/* not always_pass here, it denotes removed handler */
-#ifndef NDEBUG
-								if (do_debug_handler) {
-									printf("%s:       handled! '%s'...", __func__, kmi->idname);
-								}
-#endif
+								
+								if (G.debug & (G_DEBUG_EVENTS | G_DEBUG_HANDLERS))
+									printf("%s:       handled! '%s'\n", __func__, kmi->idname);
+
 								break;
 							}
 							else {
@@ -1911,7 +1897,11 @@
 				
 				if (event->val == KM_RELEASE && win->eventstate->prevval == KM_PRESS && win->eventstate->check_click == TRUE) {
 					event->val = KM_CLICK;
-					// printf("add KM_CLICK\n");
+					
+					if (G.debug & (G_DEBUG_HANDLERS)) {
+						printf("%s: handling CLICK\n", __func__);
+					}
+
 					action |= wm_handlers_do_intern(C, event, handlers);
 
 					event->val = KM_RELEASE;
@@ -2112,8 +2102,9 @@
 		while ( (event = win->queue.first) ) {
 			int action = WM_HANDLER_CONTINUE;
 
-			if ((G.debug & G_DEBUG_HANDLERS) && event && !ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
-				printf("%s: pass on evt %d val %d\n", __func__, event->type, event->val);
+			if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS) && !ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
+				printf("\n%s: Handling event\n", __func__);
+				WM_event_print(event);
 			}
 			
 			wm_eventemulation(event);
@@ -2759,8 +2750,6 @@
 
 				update_tablet_data(win, &event);
 				wm_event_add(win, &event);
-
-				//printf("sending MOUSEMOVE %d %d\n", event.x, event.y);
 				
 				/* also add to other window if event is there, this makes overdraws disappear nicely */
 				/* it remaps mousecoord to other window in event */
@@ -2856,7 +2845,8 @@
 				    (ABS(event.y - evt->prevclicky)) <= 2 &&
 				    ((PIL_check_seconds_timer() - evt->prevclicktime) * 1000 < U.dbl_click_time))
 				{
-					// printf("double click\n");
+					if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS) )
+						printf("%s Send double click\n", __func__);
 					event.val = KM_DBL_CLICK;
 				}
 			}
@@ -2967,18 +2957,17 @@
 				    (ABS(event.y - evt->prevclicky)) <= 2 &&
 				    ((PIL_check_seconds_timer() - evt->prevclicktime) * 1000 < U.dbl_click_time))
 				{
-					// printf("double click\n");
+					if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS) )
+						printf("%s Send double click\n", __func__);
 					evt->val = event.val = KM_DBL_CLICK;
 				}
 			}
 			
-			/* this case happens on some systems that on holding a key pressed,
-			 * generate press events without release, we still want to keep the
-			 * modifier in win->eventstate, but for the press event of the same
-			 * key we don't want the key modifier */
+			/* this case happens on holding a key pressed, it should not generate
+			 * press events events with the same key as modifier */
 			if (event.keymodifier == event.type)
 				event.keymodifier = 0;
-			
+						
 			/* this case happened with an external numpad, it's not really clear
 			 * why, but it's also impossible to map a key modifier to an unknwon
 			 * key, so it shouldn't harm */
@@ -3020,6 +3009,8 @@
 			event.type = TIMER;
 			event.custom = EVT_DATA_TIMER;
 			event.customdata = customdata;
+			event.val = 0;
+			event.keymodifier = 0;
 			wm_event_add(win, &event);
 
 			break;
@@ -3032,7 +3023,8 @@
 			attach_ndof_data(&event, customdata);
 			wm_event_add(win, &event);
 
-			//printf("sending NDOF_MOTION, prev = %d %d\n", event.x, event.y);
+			if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS) )
+				printf("%s sending NDOF_MOTION, prev = %d %d\n", __func__, event.x, event.y);
 
 			break;
 		}
@@ -3074,7 +3066,4 @@
 
 	}
 
-	/* Handy when debugging checking events */
-	/* WM_event_print(&event); */
-
 }

Modified: trunk/blender/source/blender/windowmanager/intern/wm_subwindow.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_subwindow.c	2012-11-01 15:34:38 UTC (rev 51807)
+++ trunk/blender/source/blender/windowmanager/intern/wm_subwindow.c	2012-11-01 15:51:24 UTC (rev 51808)
@@ -163,10 +163,6 @@
 	win->curswin = swin = MEM_callocN(sizeof(wmSubWindow), "swinopen");
 	BLI_addtail(&win->subwindows, swin);
 	
-	if (G.debug & G_DEBUG_EVENTS) {
-		printf("%s: swin %d added\n", __func__, freewinid);
-	}
-
 	swin->swinid = freewinid;
 	swin->winrct = *winrct;
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_window.c	2012-11-01 15:34:38 UTC (rev 51807)
+++ trunk/blender/source/blender/windowmanager/intern/wm_window.c	2012-11-01 15:51:24 UTC (rev 51808)
@@ -945,6 +945,8 @@
 					wmEvent event = *(win->eventstate);
 					
 					event.type = wt->event_type;
+					event.val = 0;
+					event.keymodifier = 0;
 					event.custom = EVT_DATA_TIMER;
 					event.customdata = wt;
 					wm_event_add(win, &event);




More information about the Bf-blender-cvs mailing list