[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25003] trunk/blender/source/blender: Fix CLICK event for modal operators.

Martin Poirier theeth at yahoo.com
Sun Nov 29 17:49:26 CET 2009


Revision: 25003
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25003
Author:   theeth
Date:     2009-11-29 17:49:26 +0100 (Sun, 29 Nov 2009)

Log Message:
-----------
Fix CLICK event for modal operators.

modal operators should return RUNNING_MODAL|PASSTHROUGH for unhandled events to be able to receive clicks correctly (this needs to be fixed for other modal operators).

Maybe it's time to have "handled" flag in event instead.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_ops.c
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
    trunk/blender/source/blender/windowmanager/wm_event_system.h

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c	2009-11-29 16:42:51 UTC (rev 25002)
+++ trunk/blender/source/blender/editors/transform/transform.c	2009-11-29 16:49:26 UTC (rev 25003)
@@ -560,10 +560,11 @@
 }
 
 
-void transformEvent(TransInfo *t, wmEvent *event)
+int transformEvent(TransInfo *t, wmEvent *event)
 {
 	float mati[3][3] = {{1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
 	char cmode = constraintModeToChar(t);
+	int handled = 1;
 
 	t->redraw |= handleMouseInput(t, &t->mouse, event);
 
@@ -641,6 +642,9 @@
 				t->modifiers ^= MOD_SNAP;
 				t->redraw = 1;
 				break;
+			default:
+				handled = 0;
+				break;
 		}
 	}
 	/* else do non-mapped events */
@@ -898,6 +902,9 @@
 //		case NDOFMOTION:
 //            viewmoveNDOF(1);
   //         break;
+		default:
+			handled = 0;
+			break;
 		}
 
 		// Numerical input events
@@ -935,7 +942,9 @@
 			case NDOF_REFRESH:
 				t->redraw = 1;
 				break;
-
+			default:
+				handled = 0;
+				break;
 		}
 
 		// Snapping events
@@ -964,6 +973,9 @@
 ////			if (t->options & CTX_TWEAK)
 //				t->state = TRANS_CONFIRM;
 //			break;
+		default:
+			handled = 0;
+			break;
 		}
 
 		/* confirm transform if launch key is released after mouse move */
@@ -977,6 +989,11 @@
 	// Per transform event, if present
 	if (t->handleEvent)
 		t->redraw |= t->handleEvent(t, event);
+
+	if (handled || t->redraw)
+		return 0;
+	else
+		return OPERATOR_PASS_THROUGH;
 }
 
 int calculateTransformCenter(bContext *C, wmEvent *event, int centerMode, float *vec)

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h	2009-11-29 16:42:51 UTC (rev 25002)
+++ trunk/blender/source/blender/editors/transform/transform.h	2009-11-29 16:49:26 UTC (rev 25003)
@@ -429,7 +429,7 @@
 
 int initTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op, struct wmEvent *event, int mode);
 void saveTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op);
-void transformEvent(TransInfo *t, struct wmEvent *event);
+int  transformEvent(TransInfo *t, struct wmEvent *event);
 void transformApply(struct bContext *C, TransInfo *t);
 int  transformEnd(struct bContext *C, TransInfo *t);
 

Modified: trunk/blender/source/blender/editors/transform/transform_ops.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_ops.c	2009-11-29 16:42:51 UTC (rev 25002)
+++ trunk/blender/source/blender/editors/transform/transform_ops.c	2009-11-29 16:49:26 UTC (rev 25003)
@@ -293,16 +293,16 @@
 
 	TransInfo *t = op->customdata;
 
-	transformEvent(t, event);
+	exit_code = transformEvent(t, event);
 
 	transformApply(C, t);
 
+	exit_code |= transformEnd(C, t);
 
-	exit_code = transformEnd(C, t);
-
-	if (exit_code != OPERATOR_RUNNING_MODAL)
+	if ((exit_code & OPERATOR_RUNNING_MODAL) == 0)
 	{
 		transformops_exit(C, op);
+		exit_code &= ~OPERATOR_PASS_THROUGH; /* preventively remove passthrough */
 	}
 
 	return exit_code;

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-11-29 16:42:51 UTC (rev 25002)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-11-29 16:49:26 UTC (rev 25003)
@@ -941,6 +941,10 @@
 	if(retval == (OPERATOR_FINISHED|OPERATOR_PASS_THROUGH))
 		return WM_HANDLER_HANDLED;
 
+	/* Modal unhandled, break */
+	if(retval == (OPERATOR_PASS_THROUGH|OPERATOR_RUNNING_MODAL))
+		return (WM_HANDLER_BREAK|WM_HANDLER_MODAL);
+
 	if(retval & OPERATOR_PASS_THROUGH)
 		return WM_HANDLER_CONTINUE;
 
@@ -1159,7 +1163,7 @@
 	}
 
 	/* test for CLICK event */
-	if (event->val == KM_RELEASE && action == WM_HANDLER_CONTINUE) {
+	if (event->val == KM_RELEASE && (action == WM_HANDLER_CONTINUE || action == (WM_HANDLER_BREAK|WM_HANDLER_MODAL))) {
 		wmWindow *win = CTX_wm_window(C);
 
 		if (win && win->last_type == event->type && win->last_val == KM_PRESS) {
@@ -1354,15 +1358,15 @@
 			}
 			
 			/* store last event for this window */
-			if (action == WM_HANDLER_CONTINUE) {
-				/* mousemove event don't overwrite last type */
-				if (event->type != MOUSEMOVE) {
+			/* mousemove event don't overwrite last type */
+			if (event->type != MOUSEMOVE) {
+				if (action == WM_HANDLER_CONTINUE || action == (WM_HANDLER_BREAK|WM_HANDLER_MODAL)) {
 					win->last_type = event->type;
 					win->last_val = event->val;
+				} else {
+					win->last_type = -1;
+					win->last_val = 0;
 				}
-			} else {
-				win->last_type = -1;
-				win->last_val = 0;
 			}
 
 			/* unlink and free here, blender-quit then frees all */

Modified: trunk/blender/source/blender/windowmanager/wm_event_system.h
===================================================================
--- trunk/blender/source/blender/windowmanager/wm_event_system.h	2009-11-29 16:42:51 UTC (rev 25002)
+++ trunk/blender/source/blender/windowmanager/wm_event_system.h	2009-11-29 16:49:26 UTC (rev 25003)
@@ -32,6 +32,7 @@
 #define WM_HANDLER_CONTINUE	0
 #define WM_HANDLER_BREAK	1
 #define WM_HANDLER_HANDLED	2
+#define WM_HANDLER_MODAL	4 /* MODAL|BREAK means unhandled */
 
 struct ScrArea;
 struct ARegion;





More information about the Bf-blender-cvs mailing list