[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32796] trunk/blender: bugfix [#24466] Selecting of object with pattern leads to strange behavior
Campbell Barton
ideasman42 at gmail.com
Sun Oct 31 15:43:31 CET 2010
Revision: 32796
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32796
Author: campbellbarton
Date: 2010-10-31 15:43:30 +0100 (Sun, 31 Oct 2010)
Log Message:
-----------
bugfix [#24466] Selecting of object with pattern leads to strange behavior
The undo problem was caused by python operators returning 'RUNNING_MODAL' rather then the return value from wm.invoke_props_popup(self, event) - 'FINISHED'.
This was done because returning FINISHED would free the operator causing the buttons redo handler to try and run a freed operator and crash.
So the real fix is to disallow any operators to use wm.invoke_props_popup(self, event) if they dont have the REGISTER option enabled, fixing the crash and redo problem.
Modified Paths:
--------------
trunk/blender/release/scripts/op/object.py
trunk/blender/release/scripts/op/presets.py
trunk/blender/release/scripts/op/wm.py
trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
trunk/blender/source/blender/windowmanager/intern/wm_operators.c
Modified: trunk/blender/release/scripts/op/object.py
===================================================================
--- trunk/blender/release/scripts/op/object.py 2010-10-31 14:21:06 UTC (rev 32795)
+++ trunk/blender/release/scripts/op/object.py 2010-10-31 14:43:30 UTC (rev 32796)
@@ -60,9 +60,7 @@
def invoke(self, context, event):
wm = context.window_manager
- # return wm.invoke_props_popup(self, event)
- wm.invoke_props_popup(self, event)
- return {'RUNNING_MODAL'}
+ return wm.invoke_props_popup(self, event)
def draw(self, context):
layout = self.layout
Modified: trunk/blender/release/scripts/op/presets.py
===================================================================
--- trunk/blender/release/scripts/op/presets.py 2010-10-31 14:21:06 UTC (rev 32795)
+++ trunk/blender/release/scripts/op/presets.py 2010-10-31 14:43:30 UTC (rev 32796)
@@ -29,6 +29,7 @@
- preset_subdir '''
# bl_idname = "script.preset_base_add"
# bl_label = "Add a Python Preset"
+ bl_options = {'REGISTER'} # only because invoke_props_popup requires.
name = bpy.props.StringProperty(name="Name", description="Name of the preset, used to make the path name", maxlen=64, default="")
remove_active = bpy.props.BoolProperty(default=False, options={'HIDDEN'})
@@ -110,11 +111,7 @@
def invoke(self, context, event):
if not self.remove_active:
wm = context.window_manager
- #crashes, TODO - fix
- #return wm.invoke_props_popup(self, event)
-
- wm.invoke_props_popup(self, event)
- return {'RUNNING_MODAL'}
+ return wm.invoke_props_popup(self, event)
else:
return self.execute(context)
Modified: trunk/blender/release/scripts/op/wm.py
===================================================================
--- trunk/blender/release/scripts/op/wm.py 2010-10-31 14:21:06 UTC (rev 32795)
+++ trunk/blender/release/scripts/op/wm.py 2010-10-31 14:43:30 UTC (rev 32796)
@@ -661,6 +661,7 @@
'''Internal use (edit a property data_path)'''
bl_idname = "wm.properties_edit"
bl_label = "Edit Property"
+ bl_options = {'REGISTER'} # only because invoke_props_popup requires.
data_path = rna_path
property = rna_property
@@ -721,13 +722,9 @@
self.description = prop_ui.get("description", "")
wm = context.window_manager
- # This crashes, TODO - fix
- #return wm.invoke_props_popup(self, event)
+ return wm.invoke_props_popup(self, event)
- wm.invoke_props_popup(self, event)
- return {'RUNNING_MODAL'}
-
class WM_OT_properties_add(bpy.types.Operator):
'''Internal use (edit a property data_path)'''
bl_idname = "wm.properties_add"
Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 2010-10-31 14:21:06 UTC (rev 32795)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 2010-10-31 14:43:30 UTC (rev 32796)
@@ -364,9 +364,9 @@
wmOperatorTypeMacro *otmacro;
for(otmacro= ot->macro.first; otmacro; otmacro= otmacro->next) {
- wmOperatorType *ot= WM_operatortype_find(otmacro->idname, 0);
+ wmOperatorType *ot_macro= WM_operatortype_find(otmacro->idname, 0);
- if(0==WM_operator_poll(C, ot))
+ if(0==WM_operator_poll(C, ot_macro))
return 0;
}
Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c 2010-10-31 14:21:06 UTC (rev 32795)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c 2010-10-31 14:43:30 UTC (rev 32796)
@@ -31,6 +31,7 @@
#include <ctype.h>
#include <stdio.h>
#include <stddef.h>
+#include <assert.h>
#ifdef WIN32
#include <windows.h>
#include <io.h>
@@ -889,6 +890,11 @@
block= uiBeginBlock(C, ar, "redo_popup", UI_EMBOSS);
uiBlockClearFlag(block, UI_BLOCK_LOOP);
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
+
+ /* if register is not enabled, the operator gets freed on OPERATOR_FINISHED
+ * ui_apply_but_funcs_after calls redo_cb and crashes */
+ assert(op->type->flag & OPTYPE_REGISTER);
+
uiBlockSetHandleFunc(block, redo_cb, arg_op);
if(!op->properties) {
@@ -1021,6 +1027,11 @@
{
int retval= OPERATOR_CANCELLED;
+ if((op->type->flag & OPTYPE_REGISTER)==0) {
+ BKE_reportf(op->reports, RPT_ERROR, "Operator '%s' does not have register enabled, incorrect invoke function.", op->type->idname);
+ return OPERATOR_CANCELLED;
+ }
+
if(op->type->exec) {
retval= op->type->exec(C, op);
@@ -1059,6 +1070,11 @@
int WM_operator_redo_popup(bContext *C, wmOperator *op)
{
+ if((op->type->flag & OPTYPE_REGISTER)==0) {
+ BKE_reportf(op->reports, RPT_ERROR, "Operator '%s' does not have register enabled, incorrect invoke function.", op->type->idname);
+ return OPERATOR_CANCELLED;
+ }
+
uiPupBlock(C, wm_block_create_redo, op);
return OPERATOR_CANCELLED;
More information about the Bf-blender-cvs
mailing list