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:
authorCampbell Barton <campbell@blender.org>2022-03-09 00:36:36 +0300
committerCampbell Barton <campbell@blender.org>2022-03-09 00:38:42 +0300
commitb8960267dd51f9108b3b49e9b762e6b4d35ae1dc (patch)
tree910b39958345ed78ebb8607e4d15341d88cd6359 /source/blender/windowmanager/intern
parent156e07232e79d53fa3f43d4bcfc4b0c4061331e5 (diff)
Event System: drag events no longer default to the drag start location
This avoids transform jumping which is a problem when tweaking values a small amount. A fix for T40549 was made box-select used the location when the key was pressed. While it's important for box-select or any operator where it's expected the drag-start location is used, this is only needed in some cases. Since the event stores the click location and the current location, no longer overwrite the events real location. Operators that depend on using the drag-start can use this location if they need. In some cases the region relative cursor location (Event.mval) now needs to be calculated based on the click location. - Added `WM_event_drag_start_mval` for convenient access to the region relative drag-start location (for drag events). - Added `WM_event_drag_start_xy` for window relative coordinates. - Added Python property Event.mouse_prev_click_x/y Resolves T93599. Reviewed By: Severin Ref D14213
Diffstat (limited to 'source/blender/windowmanager/intern')
-rw-r--r--source/blender/windowmanager/intern/wm_event_query.c19
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c5
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c15
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c9
4 files changed, 37 insertions, 11 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_query.c b/source/blender/windowmanager/intern/wm_event_query.c
index ee13e1832ed..c9f83a5d811 100644
--- a/source/blender/windowmanager/intern/wm_event_query.c
+++ b/source/blender/windowmanager/intern/wm_event_query.c
@@ -338,6 +338,25 @@ bool WM_event_drag_test(const wmEvent *event, const int prev_xy[2])
return WM_event_drag_test_with_delta(event, drag_delta);
}
+void WM_event_drag_start_mval(const wmEvent *event, const ARegion *region, int r_mval[2])
+{
+ const int *xy = (event->val == KM_CLICK_DRAG) ? event->prev_click_xy : event->xy;
+ r_mval[0] = xy[0] - region->winrct.xmin;
+ r_mval[1] = xy[1] - region->winrct.ymin;
+}
+
+void WM_event_drag_start_mval_fl(const wmEvent *event, const ARegion *region, float r_mval[2])
+{
+ const int *xy = (event->val == KM_CLICK_DRAG) ? event->prev_click_xy : event->xy;
+ r_mval[0] = xy[0] - region->winrct.xmin;
+ r_mval[1] = xy[1] - region->winrct.ymin;
+}
+
+void WM_event_drag_start_xy(const wmEvent *event, int r_xy[2])
+{
+ copy_v2_v2_int(r_xy, (event->val == KM_CLICK_DRAG) ? event->prev_click_xy : event->xy);
+}
+
/** \} */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index cc98f7a08a6..ee37fc0bea3 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -3169,13 +3169,13 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
win->event_queue_check_drag_handled = true;
const int direction = WM_event_drag_direction(event);
- const int prev_xy[2] = {UNPACK2(event->xy)};
+ /* Intentionally leave `event->xy` as-is, event users are expected to use
+ * `event->prev_click_xy` if they need to access the drag start location. */
const short prev_val = event->val;
const short prev_type = event->type;
const uint8_t prev_modifier = event->modifier;
const short prev_keymodifier = event->keymodifier;
- copy_v2_v2_int(event->xy, event->prev_click_xy);
event->val = KM_CLICK_DRAG;
event->type = event->prev_click_type;
event->modifier = event->prev_click_modifier;
@@ -3191,7 +3191,6 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
event->modifier = prev_modifier;
event->val = prev_val;
event->type = prev_type;
- copy_v2_v2_int(event->xy, prev_xy);
win->event_queue_check_click = false;
if (!((action & WM_HANDLER_BREAK) == 0 || wm_action_not_handled(action))) {
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index a6fbad8b171..ec01e097e98 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -49,6 +49,9 @@ wmGesture *WM_gesture_new(wmWindow *window, const ARegion *region, const wmEvent
gesture->modal_state = GESTURE_MODAL_NOP;
gesture->move = false;
+ int xy[2];
+ WM_event_drag_start_xy(event, xy);
+
if (ELEM(type,
WM_GESTURE_RECT,
WM_GESTURE_CROSS_RECT,
@@ -57,14 +60,14 @@ wmGesture *WM_gesture_new(wmWindow *window, const ARegion *region, const wmEvent
rcti *rect = MEM_callocN(sizeof(rcti), "gesture rect new");
gesture->customdata = rect;
- rect->xmin = event->xy[0] - gesture->winrct.xmin;
- rect->ymin = event->xy[1] - gesture->winrct.ymin;
+ rect->xmin = xy[0] - gesture->winrct.xmin;
+ rect->ymin = xy[1] - gesture->winrct.ymin;
if (type == WM_GESTURE_CIRCLE) {
/* caller is responsible for initializing 'xmax' to radius. */
}
else {
- rect->xmax = event->xy[0] - gesture->winrct.xmin;
- rect->ymax = event->xy[1] - gesture->winrct.ymin;
+ rect->xmax = xy[0] - gesture->winrct.xmin;
+ rect->ymax = xy[1] - gesture->winrct.ymin;
}
}
else if (ELEM(type, WM_GESTURE_LINES, WM_GESTURE_LASSO)) {
@@ -72,8 +75,8 @@ wmGesture *WM_gesture_new(wmWindow *window, const ARegion *region, const wmEvent
gesture->points_alloc = 1024;
gesture->customdata = lasso = MEM_mallocN(sizeof(short[2]) * gesture->points_alloc,
"lasso points");
- lasso[0] = event->xy[0] - gesture->winrct.xmin;
- lasso[1] = event->xy[1] - gesture->winrct.ymin;
+ lasso[0] = xy[0] - gesture->winrct.xmin;
+ lasso[1] = xy[1] - gesture->winrct.ymin;
gesture->points = 1;
}
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 0dce8b8f000..2f5eef652f2 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -956,8 +956,13 @@ int WM_generic_select_modal(bContext *C, wmOperator *op, const wmEvent *event)
int WM_generic_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- RNA_int_set(op->ptr, "mouse_x", event->mval[0]);
- RNA_int_set(op->ptr, "mouse_y", event->mval[1]);
+ ARegion *region = CTX_wm_region(C);
+
+ int mval[2];
+ WM_event_drag_start_mval(event, region, mval);
+
+ RNA_int_set(op->ptr, "mouse_x", mval[0]);
+ RNA_int_set(op->ptr, "mouse_y", mval[1]);
op->customdata = POINTER_FROM_INT(0);