diff options
-rw-r--r-- | source/blender/makesdna/DNA_windowmanager_types.h | 7 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_wm.c | 3 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_keymap.c | 9 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 6 |
4 files changed, 21 insertions, 4 deletions
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index 68d69a671ba..130b308f224 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -374,7 +374,12 @@ typedef struct wmKeyMapItem { /** Unique identifier. Positive for kmi that override builtins, negative otherwise. */ short id; char _pad[2]; - /** Rna pointer to access properties. */ + /** + * RNA pointer to access properties. + * + * \note The `ptr.owner_id` value must be NULL, as a signal not to use the context + * when running property callbacks such as ENUM item functions. + */ struct PointerRNA *ptr; } wmKeyMapItem; diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 4a51db4e652..d7a988383a7 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -880,6 +880,7 @@ static PointerRNA rna_KeyMapItem_properties_get(PointerRNA *ptr) wmKeyMapItem *kmi = ptr->data; if (kmi->ptr) { + BLI_assert(kmi->ptr->owner_id == NULL); return *(kmi->ptr); } @@ -1974,7 +1975,7 @@ static void rna_def_operator(BlenderRNA *brna) RNA_def_struct_refine_func(srna, "rna_OperatorProperties_refine"); RNA_def_struct_idprops_func(srna, "rna_OperatorProperties_idprops"); RNA_def_struct_property_tags(srna, rna_enum_operator_property_tags); - RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES); + RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES | STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID); RNA_def_struct_clear_flag(srna, STRUCT_UNDO); } diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 38d06ea83d3..0a157e63b09 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -80,6 +80,9 @@ static wmKeyMapItem *wm_keymap_item_copy(wmKeyMapItem *kmi) kmin->ptr = MEM_callocN(sizeof(PointerRNA), "UserKeyMapItemPtr"); WM_operator_properties_create(kmin->ptr, kmin->idname); + /* Signal for no context, see #STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID. */ + kmin->ptr->owner_id = NULL; + kmin->properties = IDP_CopyProperty(kmin->properties); kmin->ptr->data = kmin->properties; } @@ -106,6 +109,9 @@ static void wm_keymap_item_properties_set(wmKeyMapItem *kmi) { WM_operator_properties_alloc(&(kmi->ptr), &(kmi->properties), kmi->idname); WM_operator_properties_sanitize(kmi->ptr, 1); + + /* Signal for no context, see #STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID. */ + kmi->ptr->owner_id = NULL; } /** @@ -136,6 +142,9 @@ static void wm_keymap_item_properties_update_ot(wmKeyMapItem *kmi) kmi->ptr->data = kmi->properties; } WM_operator_properties_sanitize(kmi->ptr, 1); + + /* Signal for no context, see #STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID. */ + kmi->ptr->owner_id = NULL; } } else { diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 84c16999c1b..9499ac56932 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -583,7 +583,8 @@ char *WM_prop_pystring_assign(bContext *C, PointerRNA *ptr, PropertyRNA *prop, i void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot) { - RNA_pointer_create(NULL, ot->srna, NULL, ptr); + /* Set the ID so the context can be accessed: see #STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID. */ + RNA_pointer_create(G_MAIN->wm.first, ot->srna, NULL, ptr); } void WM_operator_properties_create(PointerRNA *ptr, const char *opstring) @@ -594,7 +595,8 @@ void WM_operator_properties_create(PointerRNA *ptr, const char *opstring) WM_operator_properties_create_ptr(ptr, ot); } else { - RNA_pointer_create(NULL, &RNA_OperatorProperties, NULL, ptr); + /* Set the ID so the context can be accessed: see #STRUCT_NO_CONTEXT_WITHOUT_OWNER_ID. */ + RNA_pointer_create(G_MAIN->wm.first, &RNA_OperatorProperties, NULL, ptr); } } |