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 | |
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')
-rw-r--r-- | source/blender/blenkernel/BKE_blender_version.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_keyconfig.h | 22 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/keyconfig.c | 84 |
3 files changed, 105 insertions, 3 deletions
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index a1900c1af94..b6040931923 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -27,7 +27,7 @@ * \note Use #STRINGIFY() rather than defining with quotes. */ #define BLENDER_VERSION 281 -#define BLENDER_SUBVERSION 15 +#define BLENDER_SUBVERSION 16 /** Several breakages with 280, e.g. collections vs layers. */ #define BLENDER_MINVERSION 280 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/BKE_keyconfig.h b/source/blender/blenkernel/BKE_keyconfig.h index e5717113114..3e037b901dc 100644 --- a/source/blender/blenkernel/BKE_keyconfig.h +++ b/source/blender/blenkernel/BKE_keyconfig.h @@ -24,6 +24,8 @@ struct UserDef; struct wmKeyConfigPref; +struct wmKeyMap; +struct wmKeyMapItem; /** Actual data is stored in #wmKeyConfigPref. */ #if defined(__RNA_TYPES_H__) @@ -46,9 +48,25 @@ struct wmKeyConfigPrefType_Runtime *BKE_keyconfig_pref_type_find(const char *idn void BKE_keyconfig_pref_type_add(struct wmKeyConfigPrefType_Runtime *kpt_rt); void BKE_keyconfig_pref_type_remove(const struct wmKeyConfigPrefType_Runtime *kpt_rt); -void BKE_keyconfig_pref_set_select_mouse(struct UserDef *userdef, int value, bool override); - void BKE_keyconfig_pref_type_init(void); void BKE_keyconfig_pref_type_free(void); +/* Versioning. */ +void BKE_keyconfig_pref_set_select_mouse(struct UserDef *userdef, int value, bool override); + +struct wmKeyConfigFilterItemParams { + uint check_item : 1; + uint check_diff_item_add : 1; + uint check_diff_item_remove : 1; +}; + +void BKE_keyconfig_keymap_filter_item(struct wmKeyMap *keymap, + const struct wmKeyConfigFilterItemParams *params, + bool (*filter_fn)(struct wmKeyMapItem *kmi, void *user_data), + void *user_data); +void BKE_keyconfig_pref_filter_items(struct UserDef *userdef, + const struct wmKeyConfigFilterItemParams *params, + bool (*filter_fn)(struct wmKeyMapItem *kmi, void *user_data), + void *user_data); + #endif /* __BKE_KEYCONFIG_H__ */ 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); + } +} + /** \} */ |