workaround [#25845] Empty UI panels
- now writing to RNA is disabled when inside render() call. - disallow calling operators when writes are disabled. Rendering runs in a thread so running operators from the thread is not safe unless rendering becomes a blocking operator again.
This commit is contained in:
@@ -138,6 +138,11 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(!pyrna_write_check()) {
|
||||
PyErr_Format(PyExc_SystemError, "Calling operator \"bpy.ops.%s\" error, can't modify blend data in this state (drawing/rendering)", opname);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(context_str) {
|
||||
if(RNA_enum_value_from_id(operator_context_items, context_str, &context)==0) {
|
||||
char *enum_str= BPy_enum_as_string(operator_context_items);
|
||||
|
||||
@@ -83,7 +83,19 @@ static int rna_id_write_error(PointerRNA *ptr, PyObject *key)
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
#endif // USE_PEDANTIC_WRITE
|
||||
|
||||
|
||||
#ifdef USE_PEDANTIC_WRITE
|
||||
int pyrna_write_check(void)
|
||||
{
|
||||
return !rna_disallow_writes;
|
||||
}
|
||||
#else // USE_PEDANTIC_WRITE
|
||||
int pyrna_write_check(void)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
#endif // USE_PEDANTIC_WRITE
|
||||
|
||||
static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self);
|
||||
@@ -5324,8 +5336,9 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
||||
PyGILState_STATE gilstate;
|
||||
|
||||
#ifdef USE_PEDANTIC_WRITE
|
||||
const char *func_id= RNA_function_identifier(func);
|
||||
/* testing, for correctness, not operator and not draw function */
|
||||
const short is_readonly= strstr("draw", RNA_function_identifier(func)) || !RNA_struct_is_a(ptr->type, &RNA_Operator);
|
||||
const short is_readonly= strstr("draw", func_id) || strstr("render", func_id) || !RNA_struct_is_a(ptr->type, &RNA_Operator);
|
||||
#endif
|
||||
|
||||
py_class= RNA_struct_py_type_get(ptr->type);
|
||||
|
||||
@@ -108,4 +108,6 @@ PyObject *pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr,
|
||||
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop);
|
||||
int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value);
|
||||
|
||||
int pyrna_write_check(void);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user