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.
This commit is contained in:
parent
892c3891ed
commit
7137d89daa
|
@ -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
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue