diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 9379853af29..798150aee3c 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -103,7 +103,7 @@ typedef struct bContextStore { /* for the context's rna mode enum * keep aligned with data_mode_strings in context.c */ -enum { +enum eContextObjectMode { CTX_MODE_EDIT_MESH = 0, CTX_MODE_EDIT_CURVE, CTX_MODE_EDIT_SURFACE, @@ -122,8 +122,8 @@ enum { CTX_MODE_GPENCIL_EDIT, CTX_MODE_GPENCIL_SCULPT, CTX_MODE_GPENCIL_WEIGHT, - CTX_MODE_NUM /* must be last */ }; +#define CTX_MODE_NUM (CTX_MODE_GPENCIL_WEIGHT + 1) /* Context */ diff --git a/source/blender/windowmanager/WM_keymap.h b/source/blender/windowmanager/WM_keymap.h index f93ef005b2a..6072749b283 100644 --- a/source/blender/windowmanager/WM_keymap.h +++ b/source/blender/windowmanager/WM_keymap.h @@ -101,6 +101,7 @@ void WM_keymap_add_context_enum_set_items( wmKeyMap *keymap, const struct EnumPropertyItem *items, const char *data_path, int type_start, int val, int modifier, int keymodifier); +wmKeyMap *WM_keymap_guess_from_context(const struct bContext *C); wmKeyMap *WM_keymap_guess_opname(const struct bContext *C, const char *opname); void WM_keymap_fix_linking(void); diff --git a/source/blender/windowmanager/intern/wm_keymap_utils.c b/source/blender/windowmanager/intern/wm_keymap_utils.c index 47dc07f556e..e3fe1b7abdd 100644 --- a/source/blender/windowmanager/intern/wm_keymap_utils.c +++ b/source/blender/windowmanager/intern/wm_keymap_utils.c @@ -102,6 +102,52 @@ void WM_keymap_add_context_enum_set_items( /** \name Introspection * \{ */ +wmKeyMap *WM_keymap_guess_from_context(const bContext *C) +{ + SpaceLink *sl = CTX_wm_space_data(C); + const char *km_id = NULL; + if (sl->spacetype == SPACE_VIEW3D) { + const enum eContextObjectMode mode = CTX_data_mode_enum(C); + switch (mode) { + case CTX_MODE_EDIT_MESH: km_id = "Mesh"; break; + case CTX_MODE_EDIT_CURVE: km_id = "Curve"; break; + case CTX_MODE_EDIT_SURFACE: km_id = "Curve"; break; + case CTX_MODE_EDIT_TEXT: km_id = "Font"; break; + case CTX_MODE_EDIT_ARMATURE: km_id = "Armature"; break; + case CTX_MODE_EDIT_METABALL: km_id = "Metaball"; break; + case CTX_MODE_EDIT_LATTICE: km_id = "Lattice"; break; + case CTX_MODE_POSE: km_id = "Pose"; break; + case CTX_MODE_SCULPT: km_id = "Sculpt"; break; + case CTX_MODE_PAINT_WEIGHT: km_id = "Weight Paint"; break; + case CTX_MODE_PAINT_VERTEX: km_id = "Vertex Paint"; break; + case CTX_MODE_PAINT_TEXTURE: km_id = "Image Paint"; break; + case CTX_MODE_PARTICLE: km_id = "Particle"; break; + case CTX_MODE_OBJECT: km_id = "Object Mode"; break; + case CTX_MODE_GPENCIL_PAINT: km_id = "Grease Pencil Stroke Paint Mode"; break; + case CTX_MODE_GPENCIL_EDIT: km_id = "Grease Pencil Stroke Edit Mode"; break; + case CTX_MODE_GPENCIL_SCULPT: km_id = "Grease Pencil Stroke Sculpt Mode"; break; + case CTX_MODE_GPENCIL_WEIGHT: km_id = "Grease Pencil Stroke Weight Mode"; break; + } + } + else if (sl->spacetype == SPACE_IMAGE) { + const SpaceImage *sima = (SpaceImage *)sl; + const eSpaceImage_Mode mode = sima->mode; + switch (mode) { + case SI_MODE_VIEW: km_id = "Image"; break; + case SI_MODE_PAINT: km_id = "Image Paint"; break; + case SI_MODE_MASK: km_id = "Mask Editing"; break; + case SI_MODE_UV: km_id = "UV Editor"; break; + } + } + else { + return NULL; + } + + wmKeyMap *km = WM_keymap_find_all(C, km_id, 0, 0); + BLI_assert(km); + return km; +} + /* Guess an appropriate keymap from the operator name */ /* Needs to be kept up to date with Keymap and Operator naming */ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) @@ -125,7 +171,13 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) /* Window */ if (STRPREFIX(opname, "WM_OT")) { - km = WM_keymap_find_all(C, "Window", 0, 0); + if (STREQ(opname, "WM_OT_tool_set_by_name")) { + km = WM_keymap_guess_from_context(C); + } + + if (km == NULL) { + km = WM_keymap_find_all(C, "Window", 0, 0); + } } /* Screen & Render */ else if (STRPREFIX(opname, "SCREEN_OT") ||