[Bf-blender-cvs] [deab0d1] master: Fix T38381, Fix T38184: key events getting lost when modal operator is running.

Brecht Van Lommel noreply at git.blender.org
Tue Jan 28 16:16:19 CET 2014


Commit: deab0d10402b59652ec5e19836856eb238af863e
Author: Brecht Van Lommel
Date:   Tue Jan 28 15:52:20 2014 +0100
https://developer.blender.org/rBdeab0d10402b59652ec5e19836856eb238af863e

Fix T38381, Fix T38184: key events getting lost when modal operator is running.

There is a hack for modal keymaps and double click events, which was (ab)using
the wmEvent.prevval variable to temporarily assign it KM_DBL_CLICK indicating
that the double click event was disabled. However the value of prevval can
actually be KM_DBL_CLICK in other circumstances too, which caused a key press
event to get converted to a double click event.

===================================================================

M	source/blender/windowmanager/intern/wm_event_system.c

===================================================================

diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 1256fcf..9e271fe 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1446,7 +1446,7 @@ static int wm_eventmatch(wmEvent *winevent, wmKeyMapItem *kmi)
 
 
 /* operator exists */
-static void wm_event_modalkeymap(const bContext *C, wmOperator *op, wmEvent *event)
+static void wm_event_modalkeymap(const bContext *C, wmOperator *op, wmEvent *event, bool *dbl_click_disabled)
 {
 	/* support for modal keymap in macros */
 	if (op->opm)
@@ -1473,15 +1473,15 @@ static void wm_event_modalkeymap(const bContext *C, wmOperator *op, wmEvent *eve
 		 * handling typically swallows all events (OPERATOR_RUNNING_MODAL).
 		 * This bypass just disables support for double clicks in hardcoded modal handlers */
 		if (event->val == KM_DBL_CLICK) {
-			event->prevval = event->val;
 			event->val = KM_PRESS;
+			*dbl_click_disabled = true;
 		}
 	}
 }
 
 /* bad hacking event system... better restore event type for checking of KM_CLICK for example */
 /* XXX modal maps could use different method (ton) */
-static void wm_event_modalmap_end(wmEvent *event)
+static void wm_event_modalmap_end(wmEvent *event, bool dbl_click_disabled)
 {
 	if (event->type == EVT_MODAL_MAP) {
 		event->type = event->prevtype;
@@ -1489,7 +1489,7 @@ static void wm_event_modalmap_end(wmEvent *event)
 		event->val = event->prevval;
 		event->prevval = 0;
 	}
-	else if (event->prevval == KM_DBL_CLICK)
+	else if (dbl_click_disabled)
 		event->val = KM_DBL_CLICK;
 
 }
@@ -1510,10 +1510,11 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
 			wmWindowManager *wm = CTX_wm_manager(C);
 			ScrArea *area = CTX_wm_area(C);
 			ARegion *region = CTX_wm_region(C);
-			
+			bool dbl_click_disabled = false;
+
 			wm_handler_op_context(C, handler);
 			wm_region_mouse_co(C, event);
-			wm_event_modalkeymap(C, op, event);
+			wm_event_modalkeymap(C, op, event, &dbl_click_disabled);
 			
 			if (ot->flag & OPTYPE_UNDO)
 				wm->op_undo_depth++;
@@ -1527,7 +1528,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
 			 * the event, operator etc have all been freed. - campbell */
 			if (CTX_wm_manager(C) == wm) {
 
-				wm_event_modalmap_end(event);
+				wm_event_modalmap_end(event, dbl_click_disabled);
 
 				if (ot->flag & OPTYPE_UNDO)
 					wm->op_undo_depth--;




More information about the Bf-blender-cvs mailing list