diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-10-25 13:05:12 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-10-25 13:47:16 +0300 |
commit | 7137d89daaaea948c9018b3719e453e67803b32d (patch) | |
tree | f752b627de42348f91c6efa69401937b9afbf80f /source/blender/blenkernel/intern/keyconfig.c | |
parent | 892c3891ed0b3228f556b57047f5789777f4a6f4 (diff) |
Preferences: remove keymap items created with invalid data path
Before T65397 was fixed, invalid "(null)" data paths were being created.
Remove these keymap items from preferences.
Diffstat (limited to 'source/blender/blenkernel/intern/keyconfig.c')
-rw-r--r-- | source/blender/blenkernel/intern/keyconfig.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/keyconfig.c b/source/blender/blenkernel/intern/keyconfig.c index c6f2727df08..9630420be0c 100644 --- a/source/blender/blenkernel/intern/keyconfig.c +++ b/source/blender/blenkernel/intern/keyconfig.c @@ -114,6 +114,12 @@ void BKE_keyconfig_pref_type_free(void) global_keyconfigpreftype_hash = NULL; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Key-Config Versioning + * \{ */ + /* Set select mouse, for versioning code. */ void BKE_keyconfig_pref_set_select_mouse(UserDef *userdef, int value, bool override) { @@ -130,4 +136,82 @@ void BKE_keyconfig_pref_set_select_mouse(UserDef *userdef, int value, bool overr } } +static void keymap_item_free(wmKeyMapItem *kmi) +{ + IDP_FreeProperty(kmi->properties); + if (kmi->ptr) { + MEM_freeN(kmi->ptr); + } + MEM_freeN(kmi); +} + +static void keymap_diff_item_free(wmKeyMapDiffItem *kmdi) +{ + if (kmdi->add_item) { + keymap_item_free(kmdi->add_item); + } + if (kmdi->remove_item) { + keymap_item_free(kmdi->remove_item); + } + MEM_freeN(kmdi); +} + +void BKE_keyconfig_keymap_filter_item(wmKeyMap *keymap, + const struct wmKeyConfigFilterItemParams *params, + bool (*filter_fn)(wmKeyMapItem *kmi, void *user_data), + void *user_data) +{ + if (params->check_diff_item_add || params->check_diff_item_remove) { + for (wmKeyMapDiffItem *kmdi = keymap->diff_items.first, *kmdi_next; kmdi; kmdi = kmdi_next) { + kmdi_next = kmdi->next; + bool remove = false; + + if (params->check_diff_item_add) { + if (kmdi->add_item) { + if (filter_fn(kmdi->add_item, user_data)) { + remove = true; + } + } + } + + if (!remove && params->check_diff_item_remove) { + if (kmdi->remove_item) { + if (filter_fn(kmdi->remove_item, user_data)) { + remove = true; + } + } + } + + if (remove) { + BLI_remlink(&keymap->diff_items, kmdi); + keymap_diff_item_free(kmdi); + } + } + } + + if (params->check_item) { + for (wmKeyMapItem *kmi = keymap->items.first, *kmi_next; kmi; kmi = kmi_next) { + kmi_next = kmi->next; + if (filter_fn(kmi, user_data)) { + BLI_remlink(&keymap->items, kmi); + keymap_item_free(kmi); + } + } + } +} + +/** + * Filter & optionally remove key-map items, + * intended for versioning, but may be used in other situatuons too. + */ +void BKE_keyconfig_pref_filter_items(struct UserDef *userdef, + const struct wmKeyConfigFilterItemParams *params, + bool (*filter_fn)(wmKeyMapItem *kmi, void *user_data), + void *user_data) +{ + for (wmKeyMap *keymap = userdef->user_keymaps.first; keymap; keymap = keymap->next) { + BKE_keyconfig_keymap_filter_item(keymap, params, filter_fn, user_data); + } +} + /** \} */ |