[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33160] trunk/blender: bugfix [#22615] Opening a blend file in python (bpy.ops.wm.open_mainfile() (r29489)

Campbell Barton ideasman42 at gmail.com
Thu Nov 18 17:33:13 CET 2010


Revision: 33160
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33160
Author:   campbellbarton
Date:     2010-11-18 17:33:13 +0100 (Thu, 18 Nov 2010)

Log Message:
-----------
bugfix [#22615] Opening a blend file in python (bpy.ops.wm.open_mainfile() (r29489)
       [#22557] bpy.ops.wm.read_homefile() causes segfault (r29372)

Modified Paths:
--------------
    trunk/blender/release/scripts/modules/bpy/ops.py
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: trunk/blender/release/scripts/modules/bpy/ops.py
===================================================================
--- trunk/blender/release/scripts/modules/bpy/ops.py	2010-11-18 14:10:09 UTC (rev 33159)
+++ trunk/blender/release/scripts/modules/bpy/ops.py	2010-11-18 16:33:13 UTC (rev 33160)
@@ -153,21 +153,24 @@
         return self.module + "." + self.func
 
     def __call__(self, *args, **kw):
+        import bpy
+        context = bpy.context
 
         # Get the operator from blender
+        wm = context.window_manager
+
         if args:
             C_dict, C_exec = __class__._parse_args(args)
             ret = op_call(self.idname_py(), C_dict, kw, C_exec)
         else:
             ret = op_call(self.idname_py(), None, kw)
 
-        if 'FINISHED' in ret:
-            import bpy
-            scene = bpy.context.scene
-            if scene:  # None in backgroud mode
+        if 'FINISHED' in ret and context.window_manager == wm:
+            scene = context.scene
+            if scene: # None in backgroud mode
                 scene.update()
             else:
-                for scene in bpy.data.scenes:
+                for scene in data.scenes:
                     scene.update()
 
         return ret

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-11-18 14:10:09 UTC (rev 33159)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-11-18 16:33:13 UTC (rev 33160)
@@ -438,7 +438,7 @@
  */
 static int wm_operator_register_check(wmWindowManager *wm, wmOperatorType *ot)
 {
-	return (wm->op_undo_depth == 0) && (ot->flag & OPTYPE_REGISTER);
+	return wm && (wm->op_undo_depth == 0) && (ot->flag & OPTYPE_REGISTER);
 }
 
 static void wm_operator_finished(bContext *C, wmOperator *op, int repeat)
@@ -831,7 +831,6 @@
 */
 int WM_operator_call_py(bContext *C, wmOperatorType *ot, int context, PointerRNA *properties, ReportList *reports)
 {
-	wmWindowManager *wm=	CTX_wm_manager(C);
 	int retval= OPERATOR_CANCELLED;
 
 #if 0
@@ -855,7 +854,7 @@
 	
 	/* keep the reports around if needed later */
 	if (	(retval & OPERATOR_RUNNING_MODAL) ||
-			((retval & OPERATOR_FINISHED) && wm_operator_register_check(wm, ot))
+			((retval & OPERATOR_FINISHED) && wm_operator_register_check(CTX_wm_manager(C), ot))
 	) {
 		reports->flag |= RPT_FREE; /* let blender manage freeing */
 	}
@@ -1722,7 +1721,11 @@
 									}
 									
 									action |= wm_handlers_do(C, event, &ar->handlers);
-									
+
+									/* fileread case (python), [#29489] */
+									if(CTX_wm_window(C)==NULL)
+										return;
+
 									doit |= (BLI_in_rcti(&ar->winrct, event->x, event->y));
 									
 									if(action & WM_HANDLER_BREAK)





More information about the Bf-blender-cvs mailing list