Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-11-12 16:53:08 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-11-13 20:22:07 +0300
commit7aae28af2d7dd9d593c4208d8c73d06d9e274044 (patch)
treeeee275d3771c0c941f2c08576493f6406fee2a22 /source/blender/windowmanager/intern/wm_keymap.c
parentfe4df40f3086d7fc135e17a15e0c4060f6b66dae (diff)
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.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_keymap.c')
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c63
1 files changed, 41 insertions, 22 deletions
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);