[Bf-blender-cvs] [7137d89daaa] blender-v2.81-release: Preferences: remove keymap items created with invalid data path

Campbell Barton noreply at git.blender.org
Fri Oct 25 12:47:44 CEST 2019


Commit: 7137d89daaaea948c9018b3719e453e67803b32d
Author: Campbell Barton
Date:   Fri Oct 25 21:05:12 2019 +1100
Branches: blender-v2.81-release
https://developer.blender.org/rB7137d89daaaea948c9018b3719e453e67803b32d

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.

===================================================================

M	source/blender/blenkernel/BKE_blender_version.h
M	source/blender/blenkernel/BKE_keyconfig.h
M	source/blender/blenkernel/intern/keyconfig.c
M	source/blender/blenloader/intern/versioning_userdef.c

===================================================================

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);
+  }
+}
+
 /** \} */
diff --git a/source/blender/blenloader/intern/versioning_userdef.c b/source/blender/blenloader/intern/versioning_userdef.c
index d2192f1e22a..8328893f524 100644
--- a/source/blender/blenloader/intern/versioning_userdef.c
+++ b/source/blender/blenloader/intern/versioning_userdef.c
@@ -35,6 +35,7 @@
 #include "BKE_addon.h"
 #include "BKE_colorband.h"
 #include "BKE_main.h"
+#include "BKE_idprop.h"
 #include "BKE_keyconfig.h"
 
 #include "BLO_readfile.h" /* Own include. */
@@ -198,6 +199,18 @@ static void do_version_select_mouse(UserDef *userdef, wmKeyMapItem *kmi)
   }
 }
 
+static bool keymap_item_has_invalid_wm_context_data_path(wmKeyMapItem *kmi,
+                                                         void *UNUSED(user_data))
+{
+  if (STRPREFIX(kmi->idname, "WM_OT_context_") && kmi->properties) {
+    IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, "data_path");
+    if (idprop && (idprop->type == IDP_STRING) && STRPREFIX(idprop->data.pointer, "(null)")) {
+      return true;
+    }
+  }
+  return false;
+}
+
 /* patching UserDef struct and Themes */
 void BLO_version_defaults_userpref_blend(Main *bmain, UserDef *userdef)
 {
@@ -637,6 +650,16 @@ void BLO_version_defaults_userpref_blend(Main *bmain, UserDef *userdef)
     }
   }
 
+  if (!USER_VERSION_ATLEAST(281, 16)) {
+    BKE_keyconfig_pref_filter_items(userdef,
+                                    &((struct wmKeyConfigFilterItemParams){
+                                        .check_item = true,
+                                        .check_diff_item_add = true,
+                                    }),
+                                    keymap_item_has_invalid_wm_context_data_path,
+                                    NULL);
+  }
+
   /**
    * Include next version bump.
    */



More information about the Bf-blender-cvs mailing list