[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44708] trunk/blender/source/blender: patch [#30481] rna_Screen_scene_set does the wrong thing [patch]

Campbell Barton ideasman42 at gmail.com
Wed Mar 7 17:43:48 CET 2012


Revision: 44708
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44708
Author:   campbellbarton
Date:     2012-03-07 16:43:42 +0000 (Wed, 07 Mar 2012)
Log Message:
-----------
patch [#30481] rna_Screen_scene_set does the wrong thing [patch]
from Dan Eicher (dna)

--- from the tracker
Setting Screen.scene only uses the active screen through a call to CTX_wm_screen(C) instead of the actual referenced scene.

The attached py-op demonstrates this behavior, assuming at least two separate scenes in the VSE.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_screen.h
    trunk/blender/source/blender/editors/screen/screen_edit.c
    trunk/blender/source/blender/editors/screen/screen_ops.c
    trunk/blender/source/blender/editors/space_outliner/outliner_select.c
    trunk/blender/source/blender/editors/space_outliner/outliner_tools.c
    trunk/blender/source/blender/makesrna/intern/rna_main_api.c
    trunk/blender/source/blender/makesrna/intern/rna_screen.c

Modified: trunk/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_screen.h	2012-03-07 16:24:25 UTC (rev 44707)
+++ trunk/blender/source/blender/editors/include/ED_screen.h	2012-03-07 16:43:42 UTC (rev 44708)
@@ -100,7 +100,7 @@
 bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, const char *name);
 void	ED_screen_set(struct bContext *C, struct bScreen *sc);
 void	ED_screen_delete(struct bContext *C, struct bScreen *sc);
-void	ED_screen_set_scene(struct bContext *C, struct Scene *scene);
+void	ED_screen_set_scene(struct bContext *C, struct bScreen *screen, struct Scene *scene);
 void	ED_screen_delete_scene(struct bContext *C, struct Scene *scene);
 void	ED_screen_set_subwinactive(struct bContext *C, struct wmEvent *event);
 void	ED_screen_exit(struct bContext *C, struct wmWindow *window, struct bScreen *screen);

Modified: trunk/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_edit.c	2012-03-07 16:24:25 UTC (rev 44707)
+++ trunk/blender/source/blender/editors/screen/screen_edit.c	2012-03-07 16:43:42 UTC (rev 44708)
@@ -1424,16 +1424,19 @@
 }
 
 /* only call outside of area/region loops */
-void ED_screen_set_scene(bContext *C, Scene *scene)
+void ED_screen_set_scene(bContext *C, bScreen *screen, Scene *scene)
 {
 	Main *bmain= CTX_data_main(C);
 	bScreen *sc;
-	bScreen *curscreen= CTX_wm_screen(C);
+
+	if(screen == NULL)
+		return;
 	
-	ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
+	if(ed_screen_used(CTX_wm_manager(C), screen))
+		ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
 
 	for(sc= CTX_data_main(C)->screen.first; sc; sc= sc->id.next) {
-		if((U.flag & USER_SCENEGLOBAL) || sc==curscreen) {
+		if((U.flag & USER_SCENEGLOBAL) || sc==screen) {
 			
 			if(scene != sc->scene) {
 				/* all areas endlocalview */
@@ -1452,7 +1455,7 @@
 	
 	/* are there cameras in the views that are not in the scene? */
 	for(sc= CTX_data_main(C)->screen.first; sc; sc= sc->id.next) {
-		if( (U.flag & USER_SCENEGLOBAL) || sc==curscreen) {
+		if( (U.flag & USER_SCENEGLOBAL) || sc==screen) {
 			ScrArea *sa= sc->areabase.first;
 			while(sa) {
 				SpaceLink *sl= sa->spacedata.first;
@@ -1489,7 +1492,7 @@
 	set_scene_bg(bmain, scene);
 	
 	ED_render_engine_changed(bmain);
-	ED_update_for_newframe(bmain, scene, curscreen, 1);
+	ED_update_for_newframe(bmain, scene, screen, 1);
 	
 	/* complete redraw */
 	WM_event_add_notifier(C, NC_WINDOW, NULL);
@@ -1509,7 +1512,7 @@
 	else
 		return;
 
-	ED_screen_set_scene(C, newscene);
+	ED_screen_set_scene(C, CTX_wm_screen(C), newscene);
 
 	unlink_scene(bmain, scene, newscene);
 }

Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c	2012-03-07 16:24:25 UTC (rev 44707)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c	2012-03-07 16:43:42 UTC (rev 44708)
@@ -3326,7 +3326,7 @@
 		}
 	}
 	
-	ED_screen_set_scene(C, newscene);
+	ED_screen_set_scene(C, CTX_wm_screen(C), newscene);
 	
 	WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, newscene);
 	

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_select.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_select.c	2012-03-07 16:24:25 UTC (rev 44707)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_select.c	2012-03-07 16:43:42 UTC (rev 44708)
@@ -190,7 +190,7 @@
 	
 	sce= (Scene *)outliner_search_back(soops, te, ID_SCE);
 	if(sce && scene != sce) {
-		ED_screen_set_scene(C, sce);
+		ED_screen_set_scene(C, CTX_wm_screen(C), sce);
 	}
 	
 	/* find associated base in current scene */
@@ -374,7 +374,7 @@
 	
 	if(set) {	// make new scene active
 		if(sce && scene != sce) {
-			ED_screen_set_scene(C, sce);
+			ED_screen_set_scene(C, CTX_wm_screen(C), sce);
 		}
 	}
 	
@@ -761,7 +761,7 @@
 				/* editmode? */
 				if(te->idcode==ID_SCE) {
 					if(scene!=(Scene *)tselem->id) {
-						ED_screen_set_scene(C, (Scene *)tselem->id);
+						ED_screen_set_scene(C, CTX_wm_screen(C), (Scene *)tselem->id);
 					}
 				}
 				else if(te->idcode==ID_GR) {

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_tools.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_tools.c	2012-03-07 16:24:25 UTC (rev 44707)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_tools.c	2012-03-07 16:43:42 UTC (rev 44708)
@@ -409,7 +409,7 @@
 				// when objects selected in other scenes... dunno if that should be allowed
 				Scene *scene_owner= (Scene *)outliner_search_back(soops, te, ID_SCE);
 				if(scene_owner && scene_act != scene_owner) {
-					ED_screen_set_scene(C, scene_owner);
+					ED_screen_set_scene(C, CTX_wm_screen(C), scene_owner);
 				}
 				/* important to use 'scene_owner' not scene_act else deleting objects can crash.
 				 * only use 'scene_act' when 'scene_owner' is NULL, which can happen when the
@@ -561,7 +561,7 @@
 		Scene *sce= scene;	// to be able to delete, scenes are set...
 		outliner_do_object_operation(C, scene, soops, &soops->tree, object_select_cb);
 		if(scene != sce) {
-			ED_screen_set_scene(C, sce);
+			ED_screen_set_scene(C, CTX_wm_screen(C), sce);
 		}
 		
 		str= "Select Objects";

Modified: trunk/blender/source/blender/makesrna/intern/rna_main_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_main_api.c	2012-03-07 16:24:25 UTC (rev 44707)
+++ trunk/blender/source/blender/makesrna/intern/rna_main_api.c	2012-03-07 16:43:42 UTC (rev 44708)
@@ -131,7 +131,7 @@
 	}
 
 	if (CTX_wm_screen(C)->scene == scene)
-		ED_screen_set_scene(C, newscene);
+		ED_screen_set_scene(C, CTX_wm_screen(C), newscene);
 
 	unlink_scene(bmain, scene, newscene);
 }

Modified: trunk/blender/source/blender/makesrna/intern/rna_screen.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_screen.c	2012-03-07 16:24:25 UTC (rev 44707)
+++ trunk/blender/source/blender/makesrna/intern/rna_screen.c	2012-03-07 16:43:42 UTC (rev 44708)
@@ -72,7 +72,7 @@
 
 	/* exception: must use context so notifier gets to the right window  */
 	if (sc->newscene) {
-		ED_screen_set_scene(C, sc->newscene);
+		ED_screen_set_scene(C, sc, sc->newscene);
 		WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, sc->newscene);
 
 		if (G.f & G_DEBUG)




More information about the Bf-blender-cvs mailing list