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:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-11-13 17:16:03 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-11-13 20:22:07 +0300
commitfe4df40f3086d7fc135e17a15e0c4060f6b66dae (patch)
tree8b0730b6d70bcc63187b69d3c65dd0cf444a0aa3
parent81caa7fd6d2360c45c6cacf80eaca9627ca9a480 (diff)
Fix crash when Python creates modal keymaps without items.
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c2
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c33
2 files changed, 19 insertions, 16 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 129d8ab1f8e..fcda06a7c2d 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -4589,7 +4589,7 @@ bool WM_window_modal_keymap_status_draw(
}
}
}
- if (keymap == NULL) {
+ if (keymap == NULL || keymap->modal_items == NULL) {
return false;
}
const EnumPropertyItem *items = keymap->modal_items;
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 2bba4fc6f54..6078f0b92ce 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -802,21 +802,22 @@ wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, const char *idname, const Enu
{
wmKeyMap *km = WM_keymap_ensure(keyconf, idname, 0, 0);
km->flag |= KEYMAP_MODAL;
- km->modal_items = items;
- if (!items) {
- /* init modal items from default config */
- wmWindowManager *wm = G_MAIN->wm.first;
- if (wm->defaultconf) {
- wmKeyMap *defaultkm = WM_keymap_list_find(&wm->defaultconf->keymaps, km->idname, 0, 0);
+ /* init modal items from default config */
+ wmWindowManager *wm = G_MAIN->wm.first;
+ if (wm->defaultconf && wm->defaultconf != keyconf) {
+ wmKeyMap *defaultkm = WM_keymap_list_find(&wm->defaultconf->keymaps, km->idname, 0, 0);
- if (defaultkm) {
- km->modal_items = defaultkm->modal_items;
- km->poll = defaultkm->poll;
- }
+ if (defaultkm) {
+ km->modal_items = defaultkm->modal_items;
+ km->poll = defaultkm->poll;
}
}
+ if (items) {
+ km->modal_items = items;
+ }
+
return km;
}
@@ -920,11 +921,13 @@ static void wm_user_modal_keymap_set_items(wmWindowManager *wm, wmKeyMap *km)
km->modal_items = defaultkm->modal_items;
km->poll = defaultkm->poll;
- for (kmi = km->items.first; kmi; kmi = kmi->next) {
- if (kmi->propvalue_str[0]) {
- if (RNA_enum_value_from_id(km->modal_items, kmi->propvalue_str, &propvalue))
- kmi->propvalue = propvalue;
- kmi->propvalue_str[0] = '\0';
+ if (km->modal_items) {
+ for (kmi = km->items.first; kmi; kmi = kmi->next) {
+ if (kmi->propvalue_str[0]) {
+ if (RNA_enum_value_from_id(km->modal_items, kmi->propvalue_str, &propvalue))
+ kmi->propvalue = propvalue;
+ kmi->propvalue_str[0] = '\0';
+ }
}
}
}