diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_keymap.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_keymap.c | 94 |
1 files changed, 63 insertions, 31 deletions
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index f1873b14232..57b84fc18f4 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -26,6 +26,11 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file blender/windowmanager/intern/wm_keymap.c + * \ingroup wm + */ + + #include <string.h> #include "DNA_object_types.h" @@ -37,6 +42,7 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_utildefines.h" #include "BKE_blender.h" #include "BKE_context.h" @@ -44,7 +50,7 @@ #include "BKE_library.h" #include "BKE_main.h" #include "BKE_screen.h" -#include "BKE_utildefines.h" + #include "RNA_access.h" #include "RNA_enum_types.h" @@ -63,18 +69,19 @@ static void keymap_properties_set(wmKeyMapItem *kmi) WM_operator_properties_sanitize(kmi->ptr, 1); } -void WM_keymap_properties_reset(wmKeyMapItem *kmi) +/* properties can be NULL, otherwise the arg passed is used and ownership is given to the kmi */ +void WM_keymap_properties_reset(wmKeyMapItem *kmi, struct IDProperty *properties) { WM_operator_properties_free(kmi->ptr); MEM_freeN(kmi->ptr); kmi->ptr = NULL; - kmi->properties = NULL; + kmi->properties = properties; keymap_properties_set(kmi); } -wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, char *idname) +wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, const char *idname) { wmKeyConfig *keyconf; @@ -85,7 +92,7 @@ wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, char *idname) return keyconf; } -wmKeyConfig *WM_keyconfig_new_user(wmWindowManager *wm, char *idname) +wmKeyConfig *WM_keyconfig_new_user(wmWindowManager *wm, const char *idname) { wmKeyConfig *keyconf = WM_keyconfig_new(wm, idname); @@ -118,7 +125,7 @@ void WM_keyconfig_free(wmKeyConfig *keyconf) MEM_freeN(keyconf); } -void WM_keyconfig_userdef(wmWindowManager *wm) +void WM_keyconfig_userdef(void) { wmKeyMap *km; wmKeyMapItem *kmi; @@ -195,8 +202,18 @@ static void keymap_event_set(wmKeyMapItem *kmi, short type, short val, int modif } } +static void keymap_item_set_id(wmKeyMap *keymap, wmKeyMapItem *kmi) +{ + keymap->kmi_id++; + if ((keymap->flag & KEYMAP_USER) == 0) { + kmi->id = keymap->kmi_id; + } else { + kmi->id = -keymap->kmi_id; // User defined keymap entries have negative ids + } +} + /* if item was added, then bail out */ -wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, int type, int val, int modifier, int keymodifier) +wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier) { wmKeyMapItem *kmi; @@ -209,10 +226,7 @@ wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, int type, in BLI_addtail(&keymap->items, kmi); BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME); - if ((keymap->flag & KEYMAP_USER) == 0) { - keymap->kmi_id++; - kmi->id = keymap->kmi_id; - } + keymap_item_set_id(keymap, kmi); keymap_event_set(kmi, type, val, modifier, keymodifier); keymap_properties_set(kmi); @@ -221,7 +235,7 @@ wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, int type, in } /* always add item */ -wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, char *idname, int type, int val, int modifier, int keymodifier) +wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier) { wmKeyMapItem *kmi= MEM_callocN(sizeof(wmKeyMapItem), "keymap entry"); @@ -231,16 +245,13 @@ wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, char *idname, int type, int v keymap_event_set(kmi, type, val, modifier, keymodifier); keymap_properties_set(kmi); - if ((keymap->flag & KEYMAP_USER) == 0) { - keymap->kmi_id++; - kmi->id = keymap->kmi_id; - } + keymap_item_set_id(keymap, kmi); return kmi; } /* menu wrapper for WM_keymap_add_item */ -wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap, char *idname, int type, int val, int modifier, int keymodifier) +wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier) { wmKeyMapItem *kmi= WM_keymap_add_item(keymap, "WM_OT_call_menu", type, val, modifier, keymodifier); RNA_string_set(kmi->ptr, "name", idname); @@ -264,7 +275,7 @@ void WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi) space/region ids are same as DNA_space_types.h */ /* gets free'd in wm.c */ -wmKeyMap *WM_keymap_list_find(ListBase *lb, char *idname, int spaceid, int regionid) +wmKeyMap *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid) { wmKeyMap *km; @@ -276,7 +287,7 @@ wmKeyMap *WM_keymap_list_find(ListBase *lb, char *idname, int spaceid, int regio return NULL; } -wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, char *idname, int spaceid, int regionid) +wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid) { wmKeyMap *km= WM_keymap_list_find(&keyconf->keymaps, idname, spaceid, regionid); @@ -291,7 +302,7 @@ wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, char *idname, int spaceid, int re return km; } -wmKeyMap *WM_keymap_find_all(const bContext *C, char *idname, int spaceid, int regionid) +wmKeyMap *WM_keymap_find_all(const bContext *C, const char *idname, int spaceid, int regionid) { wmWindowManager *wm = CTX_wm_manager(C); wmKeyConfig *keyconf; @@ -322,7 +333,7 @@ wmKeyMap *WM_keymap_find_all(const bContext *C, char *idname, int spaceid, int r /* modal maps get linked to a running operator, and filter the keys before sending to modal() callback */ -wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, char *idname, EnumPropertyItem *items) +wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, const char *idname, EnumPropertyItem *items) { wmKeyMap *km= WM_keymap_find(keyconf, idname, 0, 0); km->flag |= KEYMAP_MODAL; @@ -331,7 +342,7 @@ wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, char *idname, EnumPropertyIte return km; } -wmKeyMap *WM_modalkeymap_get(wmKeyConfig *keyconf, char *idname) +wmKeyMap *WM_modalkeymap_get(wmKeyConfig *keyconf, const char *idname) { wmKeyMap *km; @@ -353,15 +364,12 @@ wmKeyMapItem *WM_modalkeymap_add_item(wmKeyMap *km, int type, int val, int modif keymap_event_set(kmi, type, val, modifier, keymodifier); - if ((km->flag & KEYMAP_USER) == 0) { - km->kmi_id++; - kmi->id = km->kmi_id; - } + keymap_item_set_id(km, kmi); return kmi; } -void WM_modalkeymap_assign(wmKeyMap *km, char *opname) +void WM_modalkeymap_assign(wmKeyMap *km, const char *opname) { wmOperatorType *ot= WM_operatortype_find(opname, 0); @@ -419,7 +427,7 @@ char *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len) return str; } -static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, ListBase *handlers, const char *opname, int opcontext, IDProperty *properties, int compare_props, int hotkey, wmKeyMap **keymap_r) +static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, ListBase *handlers, const char *opname, int UNUSED(opcontext), IDProperty *properties, int compare_props, int hotkey, wmKeyMap **keymap_r) { wmWindowManager *wm= CTX_wm_manager(C); wmEventHandler *handler; @@ -432,6 +440,7 @@ static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, ListBase *h if(keymap && (!keymap->poll || keymap->poll((bContext*)C))) { for(kmi=keymap->items.first; kmi; kmi=kmi->next) { + if(strcmp(kmi->idname, opname) == 0 && WM_key_event_string(kmi->type)[0]) { if (hotkey) if (!ISHOTKEY(kmi->type)) @@ -650,6 +659,10 @@ wmKeyMap *WM_keymap_copy_to_user(wmKeyMap *keymap) usermap= WM_keymap_list_find(&U.keymaps, keymap->idname, keymap->spaceid, keymap->regionid); + /* XXX this function is only used by RMB setting hotkeys, and it clears maps on 2nd try this way */ + if(keymap==usermap) + return keymap; + if(!usermap) { /* not saved yet, duplicate existing */ usermap= MEM_dupallocN(keymap); @@ -706,7 +719,7 @@ void WM_keymap_restore_item_to_default(bContext *C, wmKeyMap *keymap, wmKeyMapIt if(strcmp(orig->idname, kmi->idname) != 0) { BLI_strncpy(kmi->idname, orig->idname, sizeof(kmi->idname)); - WM_keymap_properties_reset(kmi); + WM_keymap_properties_reset(kmi, NULL); } if (orig->properties) { @@ -756,7 +769,7 @@ wmKeyMapItem *WM_keymap_item_find_id(wmKeyMap *keymap, int id) /* 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, char *opname) +wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) { wmKeyMap *km=NULL; SpaceLink *sl = CTX_wm_space_data(C); @@ -791,9 +804,19 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, char *opname) /* Editing Modes */ else if (strstr(opname, "MESH_OT")) { km = WM_keymap_find_all(C, "Mesh", 0, 0); + + /* some mesh operators are active in object mode too, like add-prim */ + if(km && km->poll && km->poll((bContext *)C)==0) { + km = WM_keymap_find_all(C, "Object Mode", 0, 0); + } } else if (strstr(opname, "CURVE_OT")) { km = WM_keymap_find_all(C, "Curve", 0, 0); + + /* some curve operators are active in object mode too, like add-prim */ + if(km && km->poll && km->poll((bContext *)C)==0) { + km = WM_keymap_find_all(C, "Object Mode", 0, 0); + } } else if (strstr(opname, "ARMATURE_OT")) { km = WM_keymap_find_all(C, "Armature", 0, 0); @@ -806,6 +829,11 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, char *opname) } else if (strstr(opname, "MBALL_OT")) { km = WM_keymap_find_all(C, "Metaball", 0, 0); + + /* some mball operators are active in object mode too, like add-prim */ + if(km && km->poll && km->poll((bContext *)C)==0) { + km = WM_keymap_find_all(C, "Object Mode", 0, 0); + } } else if (strstr(opname, "LATTICE_OT")) { km = WM_keymap_find_all(C, "Lattice", 0, 0); @@ -887,6 +915,10 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, char *opname) else if (strstr(opname, "CONSOLE_OT")) { km = WM_keymap_find_all(C, "Console", sl->spacetype, 0); } + /* Console */ + else if (strstr(opname, "INFO_OT")) { + km = WM_keymap_find_all(C, "Info", sl->spacetype, 0); + } /* Transform */ else if (strstr(opname, "TRANSFORM_OT")) { |