Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Poirier <theeth@yahoo.com>2009-11-29 19:49:26 +0300
committerMartin Poirier <theeth@yahoo.com>2009-11-29 19:49:26 +0300
commitae16f465738b538964e5f00c1506582d47ead7d1 (patch)
tree6609ad15de8a7f2021be22e3d260ec88376aee5b
parent3b72584b7dd71737099184bc5a981874a7b4fa21 (diff)
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.
-rw-r--r--source/blender/editors/transform/transform.c21
-rw-r--r--source/blender/editors/transform/transform.h2
-rw-r--r--source/blender/editors/transform/transform_ops.c8
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c18
-rw-r--r--source/blender/windowmanager/wm_event_system.h1
5 files changed, 36 insertions, 14 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index cd267f51601..ce7076c691f 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -560,10 +560,11 @@ void transform_modal_keymap(wmKeyConfig *keyconf)
}
-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 @@ void transformEvent(TransInfo *t, wmEvent *event)
t->modifiers ^= MOD_SNAP;
t->redraw = 1;
break;
+ default:
+ handled = 0;
+ break;
}
}
/* else do non-mapped events */
@@ -898,6 +902,9 @@ void transformEvent(TransInfo *t, wmEvent *event)
// case NDOFMOTION:
// viewmoveNDOF(1);
// break;
+ default:
+ handled = 0;
+ break;
}
// Numerical input events
@@ -935,7 +942,9 @@ void transformEvent(TransInfo *t, wmEvent *event)
case NDOF_REFRESH:
t->redraw = 1;
break;
-
+ default:
+ handled = 0;
+ break;
}
// Snapping events
@@ -964,6 +973,9 @@ void transformEvent(TransInfo *t, wmEvent *event)
//// 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 @@ void transformEvent(TransInfo *t, wmEvent *event)
// 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)
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 1d284d2cc5b..bf3562cbe65 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -429,7 +429,7 @@ void TFM_OT_transform(struct wmOperatorType *ot);
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);
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 0c54b5273e3..1b8b331af62 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -293,16 +293,16 @@ static int transform_modal(bContext *C, wmOperator *op, wmEvent *event)
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;
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 8e83ceceab0..93c8b669611 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -941,6 +941,10 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
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 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
}
/* 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 @@ void wm_event_do_handlers(bContext *C)
}
/* 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 */
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 78655a9fcd3..3d7cb3fbad1 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -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;