diff options
author | Campbell Barton <campbell@blender.org> | 2022-03-07 13:47:00 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-03-07 13:47:00 +0300 |
commit | 0e51defcf42e1cb231d36da9ecc2cc0fbe6ae505 (patch) | |
tree | 237d73cf446d500bd7e7948f4c55c7b43bc5f181 | |
parent | 72e20785e1e2ed7b15a9765ebb6df646fd32dbff (diff) |
Fix T95591: Crash on drawing with measure tool with tweak fallback tool
Using press to activate the Tweak tool doesn't work well when used a
fallback tool as the drag event is often used by the current tool -
making it impossible not to select when dragging (unless the fallback
tool is disabled entirely).
Resolve this by using CLICK events when the Tweak tool is used as a
fallback.
Even though this avoids the crash, check for null-pointer de-reference
since changes to the key-map shouldn't cause operators to crash.
Note that the ability for operators to access a gizmo before it's fully
initialized is a more general problem that should be addressed, but out
of scope for a bug-fix.
Reviewed By: zeddb, JulienKaspar, Severin
Maniphest Tasks: T95591
Ref D14231
-rw-r--r-- | release/scripts/presets/keyconfig/keymap_data/blender_default.py | 23 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_gizmo_ruler.c | 20 |
2 files changed, 34 insertions, 9 deletions
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index eab97b30fff..3694f275d35 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -442,13 +442,18 @@ def _template_items_change_frame(params): # Tool System Templates -def _template_items_tool_select(params, operator, cursor_operator, *, extend): +def _template_items_tool_select(params, operator, cursor_operator, fallback, *, extend): if params.select_mouse == 'LEFTMOUSE': - # Immediate select without quick delay. + # By default use 'PRESS' for immediate select without quick delay. + # Fallback key-maps 'CLICK' since 'PRESS' events passes through (allowing either click or drag). + # + # NOTE: When the active (non-fallback) tool uses a key-map that activates it's primary tool on drag, + # it's important that this key-map uses click and not press. Otherwise it becomes impossible to use + # the tool without selecting elements under the cursor. return [ - (operator, {"type": 'LEFTMOUSE', "value": 'PRESS'}, + (operator, {"type": 'LEFTMOUSE', "value": 'CLICK' if fallback else 'PRESS'}, {"properties": [("deselect_all", True)]}), - (operator, {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, + (operator, {"type": 'LEFTMOUSE', "value": 'CLICK' if fallback else 'PRESS', "shift": True}, {"properties": [(extend, True)]}), ] else: @@ -6283,7 +6288,7 @@ def km_image_editor_tool_uv_select(params, *, fallback): {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'}, {"items": [ *([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select( - params, "uv.select", "uv.cursor_set", extend="extend")), + params, "uv.select", "uv.cursor_set", fallback, extend="extend")), *([] if (not params.use_fallback_tool_rmb) else _template_uv_select( type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy)), ]}, @@ -6490,7 +6495,7 @@ def km_3d_view_tool_select(params, *, fallback): {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ *([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select( - params, "view3d.select", "view3d.cursor3d", extend="toggle")), + params, "view3d.select", "view3d.cursor3d", fallback, extend="toggle")), *([] if (not params.use_fallback_tool_rmb) else _template_view3d_select( type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy, exclude_mod="ctrl")), ]}, @@ -7402,7 +7407,7 @@ def km_3d_view_tool_edit_gpencil_select(params, *, fallback): {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, {"items": [ *([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select( - params, "gpencil.select", "view3d.cursor3d", extend="toggle")), + params, "gpencil.select", "view3d.cursor3d", fallback, extend="toggle")), *([] if (not params.use_fallback_tool_rmb) else _template_view3d_gpencil_select( type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy)), ]}, @@ -7540,7 +7545,7 @@ def km_3d_view_tool_sculpt_gpencil_select(params): return ( "3D View Tool: Sculpt Gpencil, Tweak", {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, - {"items": _template_items_tool_select(params, "gpencil.select", "view3d.cursor3d", extend="toggle")}, + {"items": _template_items_tool_select(params, "gpencil.select", "view3d.cursor3d", False, extend="toggle")}, ) @@ -7580,7 +7585,7 @@ def km_sequencer_editor_tool_generic_select(params, *, fallback): {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'}, {"items": [ *([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select( - params, "sequencer.select", "sequencer.cursor_set", extend="toggle")), + params, "sequencer.select", "sequencer.cursor_set", fallback, extend="toggle")), *([] if (not params.use_fallback_tool_rmb) else _template_sequencer_preview_select( type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy)), diff --git a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c index 1082483dcd7..adcb101bca9 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c @@ -469,6 +469,19 @@ static bool view3d_ruler_item_mousemove(const bContext *C, return false; } +/** + * When the gizmo-group has been created immediately before running an operator + * to manipulate rulers, it's possible the new gizmo-group has not yet been initialized. + * in 3.0 this happened because left-click drag would both select and add a new ruler, + * significantly increasing the likelihood of this happening. + * Workaround this crash by checking the gizmo's custom-data has not been cleared. + * The key-map has also been modified not to trigger this bug, see T95591. + */ +static bool gizmo_ruler_check_for_operator(const wmGizmoGroup *gzgroup) +{ + return gzgroup->customdata != NULL; +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -1308,6 +1321,10 @@ static int view3d_ruler_add_invoke(bContext *C, wmOperator *op, const wmEvent *e wmGizmoGroup *gzgroup = WM_gizmomap_group_find(gzmap, view3d_gzgt_ruler_id); const bool use_depth = (v3d->shading.type >= OB_SOLID); + if (!gizmo_ruler_check_for_operator(gzgroup)) { + return OPERATOR_CANCELLED; + } + /* Create new line */ RulerItem *ruler_item; ruler_item = ruler_item_add(gzgroup); @@ -1383,6 +1400,9 @@ static int view3d_ruler_remove_invoke(bContext *C, wmOperator *op, const wmEvent wmGizmoMap *gzmap = region->gizmo_map; wmGizmoGroup *gzgroup = WM_gizmomap_group_find(gzmap, view3d_gzgt_ruler_id); if (gzgroup) { + if (!gizmo_ruler_check_for_operator(gzgroup)) { + return OPERATOR_CANCELLED; + } RulerInfo *ruler_info = gzgroup->customdata; if (ruler_info->item_active) { RulerItem *ruler_item = ruler_info->item_active; |