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:
authorCampbell Barton <ideasman42@gmail.com>2019-10-25 13:05:12 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-10-25 13:47:16 +0300
commit7137d89daaaea948c9018b3719e453e67803b32d (patch)
treef752b627de42348f91c6efa69401937b9afbf80f /source/blender/blenkernel
parent892c3891ed0b3228f556b57047f5789777f4a6f4 (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.h2
-rw-r--r--source/blender/blenkernel/BKE_keyconfig.h22
-rw-r--r--source/blender/blenkernel/intern/keyconfig.c84
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);
+ }
+}
+
/** \} */