WM: only return PASS_THROUGH on PRESS for selection operators
Some selection operators return (PASS_THROUGH & FINISHED) so the tweak event isn't suppressed from the PRESS event having been handled. This is now restricted to events with a PRESS action. Without this, using CLICK for selection was passing the event through which could run other actions unintentionally.
This commit is contained in:
parent
5eb505e368
commit
52bfa750e7
|
@ -2813,7 +2813,9 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, const wmEvent *even
|
|||
{
|
||||
RNA_int_set_array(op->ptr, "location", event->mval);
|
||||
|
||||
return view3d_select_exec(C, op);
|
||||
const int retval = view3d_select_exec(C, op);
|
||||
|
||||
return WM_operator_flag_only_pass_through_on_press(retval, event);
|
||||
}
|
||||
|
||||
void VIEW3D_OT_select(wmOperatorType *ot)
|
||||
|
|
|
@ -2122,7 +2122,9 @@ static int uv_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
|
|||
UI_view2d_region_to_view(®ion->v2d, event->mval[0], event->mval[1], &co[0], &co[1]);
|
||||
RNA_float_set_array(op->ptr, "location", co);
|
||||
|
||||
return uv_select_exec(C, op);
|
||||
const int retval = uv_select_exec(C, op);
|
||||
|
||||
return WM_operator_flag_only_pass_through_on_press(retval, event);
|
||||
}
|
||||
|
||||
void UV_OT_select(wmOperatorType *ot)
|
||||
|
@ -2281,7 +2283,9 @@ static int uv_select_loop_invoke(bContext *C, wmOperator *op, const wmEvent *eve
|
|||
UI_view2d_region_to_view(®ion->v2d, event->mval[0], event->mval[1], &co[0], &co[1]);
|
||||
RNA_float_set_array(op->ptr, "location", co);
|
||||
|
||||
return uv_select_loop_exec(C, op);
|
||||
const int retval = uv_select_loop_exec(C, op);
|
||||
|
||||
return WM_operator_flag_only_pass_through_on_press(retval, event);
|
||||
}
|
||||
|
||||
void UV_OT_select_loop(wmOperatorType *ot)
|
||||
|
@ -2341,7 +2345,9 @@ static int uv_select_edge_ring_invoke(bContext *C, wmOperator *op, const wmEvent
|
|||
UI_view2d_region_to_view(®ion->v2d, event->mval[0], event->mval[1], &co[0], &co[1]);
|
||||
RNA_float_set_array(op->ptr, "location", co);
|
||||
|
||||
return uv_select_edge_ring_exec(C, op);
|
||||
const int retval = uv_select_edge_ring_exec(C, op);
|
||||
|
||||
return WM_operator_flag_only_pass_through_on_press(retval, event);
|
||||
}
|
||||
|
||||
void UV_OT_select_edge_ring(wmOperatorType *ot)
|
||||
|
|
|
@ -707,6 +707,8 @@ void WM_event_fileselect_event(struct wmWindowManager *wm, void *ophandle, int e
|
|||
|
||||
void WM_operator_region_active_win_set(struct bContext *C);
|
||||
|
||||
int WM_operator_flag_only_pass_through_on_press(int retval, const struct wmEvent *event);
|
||||
|
||||
/* drag and drop */
|
||||
struct wmDrag *WM_event_start_drag(
|
||||
struct bContext *C, int icon, int type, void *poin, double value, unsigned int flags);
|
||||
|
|
|
@ -40,6 +40,24 @@
|
|||
#include "ED_object.h"
|
||||
#include "ED_screen.h"
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Generic Utilities
|
||||
* \{ */
|
||||
|
||||
/**
|
||||
* Only finish + pass through for press events (allowing press-tweak).
|
||||
*/
|
||||
int WM_operator_flag_only_pass_through_on_press(int retval, const struct wmEvent *event)
|
||||
{
|
||||
if ((event->val != KM_PRESS) &&
|
||||
((retval & OPERATOR_PASS_THROUGH) && (retval & OPERATOR_FINISHED))) {
|
||||
retval &= ~OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Value Interaction Helper
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue