diff options
author | Campbell Barton <campbell@blender.org> | 2022-03-01 13:33:16 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-03-01 13:41:08 +0300 |
commit | 90ec634135a0a79534fc34146c4860805279a3a9 (patch) | |
tree | 872b12d9b4adc5d70de4734cae41f167a6480305 | |
parent | 4b9c77a19aa359b5ab4b86e05cff1c8627d05a1e (diff) |
Fix incorrect drag-event threshold when releasing modifiers early
db4313610cab18933c1b1b1348720ea241b9d91e added support for modifier
keys to be released while dragging.
The key release events set wmEvent.prev_type which is used select the
drag threshold, causing the wrong threshold to be used.
Add wmEvent.prev_click_type which is only set when the drag begins.
-rw-r--r-- | source/blender/windowmanager/WM_types.h | 16 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_query.c | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 5 |
3 files changed, 14 insertions, 11 deletions
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index cdbaa2739ba..26462402e3d 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -636,6 +636,15 @@ typedef struct wmEvent { short prev_type; /** The previous value of `val`. */ short prev_val; + /** + * The previous value of #wmEvent.xy, + * Unlike other previous state variables, this is set on any mouse motion. + * Use `prev_click` for the value at time of pressing. + */ + int prev_xy[2]; + + /** The `type` at the point of the click action. */ + short prev_click_type; /** The time when the key is pressed, see #PIL_check_seconds_timer. */ double prev_click_time; /** The location when the key is pressed (used to enforce drag thresholds). */ @@ -646,13 +655,6 @@ typedef struct wmEvent { short prev_click_keymodifier; /** - * The previous value of #wmEvent.xy, - * Unlike other previous state variables, this is set on any mouse motion. - * Use `prev_click` for the value at time of pressing. - */ - int prev_xy[2]; - - /** * Modifier states. * #KM_SHIFT, #KM_CTRL, #KM_ALT & #KM_OSKEY is apple or windows-key. */ diff --git a/source/blender/windowmanager/intern/wm_event_query.c b/source/blender/windowmanager/intern/wm_event_query.c index 0d42d0a44c7..5e8b9b945c9 100644 --- a/source/blender/windowmanager/intern/wm_event_query.c +++ b/source/blender/windowmanager/intern/wm_event_query.c @@ -260,8 +260,8 @@ bool WM_cursor_test_motion_and_update(const int mval[2]) int WM_event_drag_threshold(const struct wmEvent *event) { int drag_threshold; - if (ISMOUSE(event->prev_type)) { - BLI_assert(event->prev_type != MOUSEMOVE); + if (ISMOUSE(event->prev_click_type)) { + BLI_assert(event->prev_click_type != MOUSEMOVE); /* Using the previous type is important is we want to check the last pressed/released button, * The `event->type` would include #MOUSEMOVE which is always the case when dragging * and does not help us know which threshold to use. */ diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 4e9a430b380..ee07e90f4de 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -4705,10 +4705,11 @@ static void wm_event_prev_values_set(wmEvent *event, wmEvent *event_state) static void wm_event_prev_click_set(wmEvent *event, wmEvent *event_state) { event->prev_click_time = event_state->prev_click_time = PIL_check_seconds_timer(); - event->prev_click_xy[0] = event_state->prev_click_xy[0] = event_state->xy[0]; - event->prev_click_xy[1] = event_state->prev_click_xy[1] = event_state->xy[1]; + event->prev_click_type = event_state->prev_click_type = event_state->type; event->prev_click_modifier = event_state->prev_click_modifier = event_state->modifier; event->prev_click_keymodifier = event_state->prev_click_keymodifier = event_state->keymodifier; + event->prev_click_xy[0] = event_state->prev_click_xy[0] = event_state->xy[0]; + event->prev_click_xy[1] = event_state->prev_click_xy[1] = event_state->xy[1]; } static wmEvent *wm_event_add_mousemove(wmWindow *win, const wmEvent *event) |