diff options
-rw-r--r-- | source/blender/editors/screen/area.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 86 |
3 files changed, 66 insertions, 24 deletions
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index e3070903ccc..98bee156090 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -1595,6 +1595,8 @@ static void ed_default_handlers( } } if (flag & ED_KEYMAP_TOOL) { + WM_event_add_keymap_handler_dynamic( + &ar->handlers, WM_event_get_keymap_from_toolsystem_fallback, sa); WM_event_add_keymap_handler_dynamic(&ar->handlers, WM_event_get_keymap_from_toolsystem, sa); } if (flag & ED_KEYMAP_VIEW2D) { diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 72ccbb0fb55..d24157a22a6 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -228,6 +228,8 @@ struct wmEventHandler_Keymap *WM_event_add_keymap_handler_priority(ListBase *han typedef struct wmKeyMap *(wmEventHandler_KeymapDynamicFn)( wmWindowManager *wm, struct wmEventHandler_Keymap *handler)ATTR_WARN_UNUSED_RESULT; +struct wmKeyMap *WM_event_get_keymap_from_toolsystem_fallback( + struct wmWindowManager *wm, struct wmEventHandler_Keymap *handler); struct wmKeyMap *WM_event_get_keymap_from_toolsystem(struct wmWindowManager *wm, struct wmEventHandler_Keymap *handler); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index c1b56c0b9ae..77d59dd3a8f 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -3736,44 +3736,82 @@ wmEventHandler_Keymap *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap return handler; } -/** Follow #wmEventHandler_KeymapDynamicFn signature. */ -wmKeyMap *WM_event_get_keymap_from_toolsystem(wmWindowManager *wm, wmEventHandler_Keymap *handler) +/** + * Implements fallback tool when enabled by: + * #SCE_WORKSPACE_TOOL_FALLBACK, #WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP. + * + * This runs before #WM_event_get_keymap_from_toolsystem, + * allowing both the fallback-tool and active-tool to be activated + * providing the key-map is configured so the keys don't conflict. + * For example one mouse button can run the active-tool, another button for the fallback-tool. + * See T72567. + * + * Follow #wmEventHandler_KeymapDynamicFn signature. + */ +wmKeyMap *WM_event_get_keymap_from_toolsystem_fallback(wmWindowManager *wm, + wmEventHandler_Keymap *handler) { + if (!USER_EXPERIMENTAL_TEST(&U, use_tool_fallback)) { + return NULL; + } + ScrArea *sa = handler->dynamic.user_data; handler->keymap_tool = NULL; bToolRef_Runtime *tref_rt = sa->runtime.tool ? sa->runtime.tool->runtime : NULL; - if (tref_rt && (tref_rt->keymap[0] || tref_rt->keymap_fallback[0])) { - const char *keymap_id = tref_rt->keymap; + if (tref_rt && tref_rt->keymap_fallback[0]) { + const char *keymap_id = NULL; /* Support for the gizmo owning the tool keymap. */ - if (USER_EXPERIMENTAL_TEST(&U, use_tool_fallback)) { - if (tref_rt->gizmo_group[0] != '\0' && tref_rt->keymap_fallback[0] != '\n') { - wmGizmoMap *gzmap = NULL; - wmGizmoGroup *gzgroup = NULL; - for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { - if (ar->gizmo_map != NULL) { - gzmap = ar->gizmo_map; - gzgroup = WM_gizmomap_group_find(gzmap, tref_rt->gizmo_group); - if (gzgroup != NULL) { - break; - } + if (tref_rt->gizmo_group[0] != '\0' && tref_rt->keymap_fallback[0] != '\n') { + wmGizmoMap *gzmap = NULL; + wmGizmoGroup *gzgroup = NULL; + for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { + if (ar->gizmo_map != NULL) { + gzmap = ar->gizmo_map; + gzgroup = WM_gizmomap_group_find(gzmap, tref_rt->gizmo_group); + if (gzgroup != NULL) { + break; } } - if (gzgroup != NULL) { - if (gzgroup->type->flag & WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP) { - /* If all are hidden, don't override. */ - if (gzgroup->use_fallback_keymap) { - wmGizmo *highlight = wm_gizmomap_highlight_get(gzmap); - if (highlight == NULL) { - keymap_id = tref_rt->keymap_fallback; - } + } + if (gzgroup != NULL) { + if (gzgroup->type->flag & WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP) { + /* If all are hidden, don't override. */ + if (gzgroup->use_fallback_keymap) { + wmGizmo *highlight = wm_gizmomap_highlight_get(gzmap); + if (highlight == NULL) { + keymap_id = tref_rt->keymap_fallback; } } } } } - if (keymap_id[0]) { + if (keymap_id && keymap_id[0]) { + wmKeyMap *km = WM_keymap_list_find_spaceid_or_empty( + &wm->userconf->keymaps, keymap_id, sa->spacetype, RGN_TYPE_WINDOW); + /* We shouldn't use keymaps from unrelated spaces. */ + if (km != NULL) { + handler->keymap_tool = sa->runtime.tool; + return km; + } + else { + printf( + "Keymap: '%s' not found for tool '%s'\n", tref_rt->keymap, sa->runtime.tool->idname); + } + } + } + return NULL; +} + +wmKeyMap *WM_event_get_keymap_from_toolsystem(wmWindowManager *wm, wmEventHandler_Keymap *handler) +{ + ScrArea *sa = handler->dynamic.user_data; + handler->keymap_tool = NULL; + bToolRef_Runtime *tref_rt = sa->runtime.tool ? sa->runtime.tool->runtime : NULL; + if (tref_rt && tref_rt->keymap[0]) { + const char *keymap_id = tref_rt->keymap; + { wmKeyMap *km = WM_keymap_list_find_spaceid_or_empty( &wm->userconf->keymaps, keymap_id, sa->spacetype, RGN_TYPE_WINDOW); /* We shouldn't use keymaps from unrelated spaces. */ |