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.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user