From 7aae28af2d7dd9d593c4208d8c73d06d9e274044 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 12 Nov 2018 14:53:08 +0100 Subject: Keymaps: refactor loading of default keymap, fix bugs. This refactors loading of key configurations to clear and refill existing ones, rather than adding a new one and then removing the old one. This fixes broken loading of non-default configurations after recent changes, and prepares for future changes to make it possible to dynamically change key configurations based on user preferences. --- source/blender/windowmanager/intern/wm_keymap.c | 63 ++++++++++++++++--------- 1 file changed, 41 insertions(+), 22 deletions(-) (limited to 'source/blender/windowmanager/intern/wm_keymap.c') diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 6078f0b92ce..4032f47eec2 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -259,24 +259,40 @@ static void wm_keymap_diff_item_free(wmKeyMapDiffItem *kmdi) * List of keymaps for all editors, modes, ... . There is a builtin default key * configuration, a user key configuration, and other preset configurations. */ -wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, const char *idname) -{ - wmKeyConfig *keyconf; +wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, const char *idname, bool user_defined) +{ + wmKeyConfig *keyconf = BLI_findstring(&wm->keyconfigs, idname, offsetof(wmKeyConfig, idname)); + if (keyconf) { + if (keyconf == wm->defaultconf) { + /* For default configuration, we need to keep keymap + * modal items and poll functions intact. */ + for (wmKeyMap *km = keyconf->keymaps.first; km; km = km->next) { + WM_keymap_clear(km); + } + } + else { + /* For user defined key configuration, clear all keymaps. */ + WM_keyconfig_clear(keyconf); + } + return keyconf; + } + + /* Create new configuration. */ keyconf = MEM_callocN(sizeof(wmKeyConfig), "wmKeyConfig"); BLI_strncpy(keyconf->idname, idname, sizeof(keyconf->idname)); BLI_addtail(&wm->keyconfigs, keyconf); + if (user_defined) { + keyconf->flag |= KEYCONF_USER; + } + return keyconf; } wmKeyConfig *WM_keyconfig_new_user(wmWindowManager *wm, const char *idname) { - wmKeyConfig *keyconf = WM_keyconfig_new(wm, idname); - - keyconf->flag |= KEYCONF_USER; - - return keyconf; + return WM_keyconfig_new(wm, idname, true); } bool WM_keyconfig_remove(wmWindowManager *wm, wmKeyConfig *keyconf) @@ -297,15 +313,18 @@ bool WM_keyconfig_remove(wmWindowManager *wm, wmKeyConfig *keyconf) } } -void WM_keyconfig_free(wmKeyConfig *keyconf) +void WM_keyconfig_clear(wmKeyConfig *keyconf) { - wmKeyMap *km; - - while ((km = keyconf->keymaps.first)) { - WM_keymap_free(km); - BLI_freelinkN(&keyconf->keymaps, km); + for (wmKeyMap *km = keyconf->keymaps.first; km; km = km->next) { + WM_keymap_clear(km); } + BLI_freelistN(&keyconf->keymaps); +} + +void WM_keyconfig_free(wmKeyConfig *keyconf) +{ + WM_keyconfig_clear(keyconf); MEM_freeN(keyconf); } @@ -379,7 +398,7 @@ static wmKeyMap *wm_keymap_copy(wmKeyMap *keymap) return keymapn; } -void WM_keymap_free(wmKeyMap *keymap) +void WM_keymap_clear(wmKeyMap *keymap) { wmKeyMapItem *kmi; wmKeyMapDiffItem *kmdi; @@ -398,7 +417,7 @@ bool WM_keymap_remove(wmKeyConfig *keyconf, wmKeyMap *keymap) { if (BLI_findindex(&keyconf->keymaps, keymap) != -1) { - WM_keymap_free(keymap); + WM_keymap_clear(keymap); BLI_remlink(&keyconf->keymaps, keymap); MEM_freeN(keymap); @@ -665,7 +684,7 @@ static wmKeyMap *wm_keymap_patch_update(ListBase *lb, wmKeyMap *defaultmap, wmKe km = WM_keymap_list_find(lb, defaultmap->idname, defaultmap->spaceid, defaultmap->regionid); if (km) { expanded = (km->flag & (KEYMAP_EXPANDED | KEYMAP_CHILDREN_EXPANDED)); - WM_keymap_free(km); + WM_keymap_clear(km); BLI_freelinkN(lb, km); } @@ -728,7 +747,7 @@ static void wm_keymap_diff_update(ListBase *lb, wmKeyMap *defaultmap, wmKeyMap * /* remove previous diff keymap in list, we will replace it */ prevmap = WM_keymap_list_find(lb, km->idname, km->spaceid, km->regionid); if (prevmap) { - WM_keymap_free(prevmap); + WM_keymap_clear(prevmap); BLI_freelinkN(lb, prevmap); } @@ -744,13 +763,13 @@ static void wm_keymap_diff_update(ListBase *lb, wmKeyMap *defaultmap, wmKeyMap * BLI_addtail(lb, diffmap); } else { - WM_keymap_free(diffmap); + WM_keymap_clear(diffmap); MEM_freeN(diffmap); } /* free temporary default map */ if (addonmap) { - WM_keymap_free(defaultmap); + WM_keymap_clear(defaultmap); MEM_freeN(defaultmap); } } @@ -1630,7 +1649,7 @@ void WM_keymap_restore_item_to_default(bContext *C, wmKeyMap *keymap, wmKeyMapIt /* free temporary keymap */ if (addonmap) { - WM_keymap_free(defaultmap); + WM_keymap_clear(defaultmap); MEM_freeN(defaultmap); } } @@ -1644,7 +1663,7 @@ void WM_keymap_restore_to_default(wmKeyMap *keymap, bContext *C) usermap = WM_keymap_list_find(&U.user_keymaps, keymap->idname, keymap->spaceid, keymap->regionid); if (usermap) { - WM_keymap_free(usermap); + WM_keymap_clear(usermap); BLI_freelinkN(&U.user_keymaps, usermap); WM_keyconfig_update_tag(NULL, NULL); -- cgit v1.2.3