[Bf-blender-cvs] [c0638a4afa5] workspaces: Fix crashes when appending workspaces

Julian Eisel noreply at git.blender.org
Tue Mar 28 23:02:01 CEST 2017


Commit: c0638a4afa5d0e870ac8f38377c7e37e3c4770d5
Author: Julian Eisel
Date:   Tue Mar 28 21:20:44 2017 +0200
Branches: workspaces
https://developer.blender.org/rBc0638a4afa5d0e870ac8f38377c7e37e3c4770d5

Fix crashes when appending workspaces

Also removed FileData access in after-lib-link versioning code, which
can't be used reliably.

===================================================================

M	source/blender/blenkernel/BKE_blender_version.h
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/readfile.h
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/editors/interface/interface_regions.c
M	source/blender/editors/workspace/workspace_edit.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index 4f4787f9da5..207631d36bd 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -28,7 +28,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION         278
-#define BLENDER_SUBVERSION      4
+#define BLENDER_SUBVERSION      5
 /* Several breakages with 270, e.g. constraint deg vs rad */
 #define BLENDER_MINVERSION      270
 #define BLENDER_MINSUBVERSION   6
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index d2a8eeacb0e..0f62314047e 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -8671,12 +8671,12 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
 	/* don't forget to set version number in BKE_blender_version.h! */
 }
 
-static void do_versions_after_linking(FileData *fd, Main *main)
+static void do_versions_after_linking(Main *main)
 {
 //	printf("%s for %s (%s), %d.%d\n", __func__, main->curlib ? main->curlib->name : main->name,
 //	       main->curlib ? "LIB" : "MAIN", main->versionfile, main->subversionfile);
 	do_versions_after_linking_270(main);
-	do_versions_after_linking_280(fd, main);
+	do_versions_after_linking_280(main);
 }
 
 static void lib_link_all(FileData *fd, Main *main)
@@ -8900,7 +8900,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath)
 		blo_split_main(&mainlist, bfd->main);
 		for (Main *mainvar = mainlist.first; mainvar; mainvar = mainvar->next) {
 			BLI_assert(mainvar->versionfile != 0);
-			do_versions_after_linking(fd, mainvar);
+			do_versions_after_linking(mainvar);
 		}
 		blo_join_main(&mainlist);
 	}
@@ -9977,6 +9977,9 @@ static void expand_workspace(FileData *fd, Main *mainvar, WorkSpace *workspace)
 		expand_doit(fd, mainvar, BKE_workspace_layout_screen_get(layout));
 	}
 	BKE_workspace_layout_iter_end;
+
+	/* unset render-layer, when changing workspace we'll assign one from the active scene then. */
+	BKE_workspace_render_layer_set(workspace, NULL);
 }
 
 /**
@@ -10548,7 +10551,7 @@ static void library_link_end(Main *mainl, FileData **fd, const short flag, Scene
 		/* We need to split out IDs already existing, or they will go again through do_versions - bad, very bad! */
 		split_main_newid(mainvar, &main_newid);
 
-		do_versions_after_linking(*fd, &main_newid);
+		do_versions_after_linking(&main_newid);
 
 		add_main_to_main(mainvar, &main_newid);
 	}
diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h
index 4d4bc120804..299c66f2bbb 100644
--- a/source/blender/blenloader/intern/readfile.h
+++ b/source/blender/blenloader/intern/readfile.h
@@ -176,7 +176,7 @@ void blo_do_versions_270(struct FileData *fd, struct Library *lib, struct Main *
 void blo_do_versions_280(struct FileData *fd, struct Library *lib, struct Main *main);
 
 void do_versions_after_linking_270(struct Main *main);
-void do_versions_after_linking_280(struct FileData *fd, struct Main *main);
+void do_versions_after_linking_280(struct Main *main);
 
 #endif
 
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index cc78537c344..6cb761cb4db 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -111,7 +111,7 @@ static void do_version_workspaces_after_lib_link(Main *main)
 	}
 }
 
-void do_versions_after_linking_280(FileData *fd, Main *main)
+void do_versions_after_linking_280(Main *main)
 {
 	if (!MAIN_VERSION_ATLEAST(main, 280, 0)) {
 		char version[48];
@@ -246,48 +246,45 @@ void do_versions_after_linking_280(FileData *fd, Main *main)
 
 	{
 		/* New workspace design */
-		if (!DNA_struct_find(fd->filesdna, "WorkSpace")) {
+		if (!MAIN_VERSION_ATLEAST(main, 278, 5)) {
 			do_version_workspaces_after_lib_link(main);
 		}
-	}
-
-	if (!MAIN_VERSION_ATLEAST(main, 280, 0)) {
-		BKE_workspace_iter_begin(workspace, main->workspaces.first)
-		{
-			SceneLayer *layer = BKE_workspace_render_layer_get(workspace);
-			const bool is_single_collection = BLI_listbase_count_ex(&layer->layer_collections, 2) == 1;
-			ListBase *layouts = BKE_workspace_layouts_get(workspace);
 
-			BKE_workspace_layout_iter_begin(layout, layouts->first)
+		if (!MAIN_VERSION_ATLEAST(main, 278, 5)) {
+			BKE_workspace_iter_begin(workspace, main->workspaces.first)
 			{
-				bScreen *screen = BKE_workspace_layout_screen_get(layout);
-
-				for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
-					for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
-						if (sl->spacetype == SPACE_OUTLINER) {
-							SpaceOops *soutliner = (SpaceOops *)sl;
-
-							soutliner->outlinevis = SO_ACT_LAYER;
-
-							if (is_single_collection) {
-								/* Create a tree store element for the collection. This is normally
-								 * done in check_persistent (outliner_tree.c), but we need to access
-								 * it here :/ (expand element if it's the only one) */
-								TreeStoreElem *tselem = BLI_mempool_alloc(soutliner->treestore);
-								tselem->type = TSE_LAYER_COLLECTION;
-								tselem->id = layer->layer_collections.first;
-								tselem->nr = tselem->used = 0;
-								tselem->flag &= ~TSE_CLOSED;
+				SceneLayer *layer = BKE_workspace_render_layer_get(workspace);
+				const bool is_single_collection = BLI_listbase_count_ex(&layer->layer_collections, 2) == 1;
+				ListBase *layouts = BKE_workspace_layouts_get(workspace);
+
+				BKE_workspace_layout_iter_begin(layout, layouts->first)
+				{
+					bScreen *screen = BKE_workspace_layout_screen_get(layout);
+
+					for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+						for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
+							if (sl->spacetype == SPACE_OUTLINER) {
+								SpaceOops *soutliner = (SpaceOops *)sl;
+
+								soutliner->outlinevis = SO_ACT_LAYER;
+
+								if (is_single_collection) {
+									/* Create a tree store element for the collection. This is normally
+									 * done in check_persistent (outliner_tree.c), but we need to access
+									 * it here :/ (expand element if it's the only one) */
+									TreeStoreElem *tselem = BLI_mempool_alloc(soutliner->treestore);
+									tselem->type = TSE_LAYER_COLLECTION;
+									tselem->id = layer->layer_collections.first;
+									tselem->nr = tselem->used = 0;
+									tselem->flag &= ~TSE_CLOSED;
+								}
 							}
 						}
 					}
 				}
+				BKE_workspace_layout_iter_end;
 			}
-			BKE_workspace_layout_iter_end;
-		}
-		BKE_workspace_iter_end;
-
-		for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
+			BKE_workspace_iter_end;
 		}
 	}
 }
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index ebc542a4936..eae3f920d23 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1704,7 +1704,7 @@ static void ui_block_region_draw(const bContext *C, ARegion *ar)
  * Use to refresh centered popups on screen resizing (for splash).
  */
 static void ui_block_region_popup_window_listener(
-        bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
+        bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn, const Scene *UNUSED(scene))
 {
 	switch (wmn->category) {
 		case NC_WINDOW:
diff --git a/source/blender/editors/workspace/workspace_edit.c b/source/blender/editors/workspace/workspace_edit.c
index 377583d2350..94670518d38 100644
--- a/source/blender/editors/workspace/workspace_edit.c
+++ b/source/blender/editors/workspace/workspace_edit.c
@@ -66,8 +66,9 @@ WorkSpace *ED_workspace_add(Main *bmain, const char *name, SceneLayer *act_rende
  * Changes the object mode (if needed) to the one set in \a workspace_new.
  * Object mode is still stored on object level. In future it should all be workspace level instead.
  */
-static void workspace_change_update_mode(const WorkSpace *workspace_old, const WorkSpace *workspace_new,
-                                         bContext *C, Object *ob_act, ReportList *reports)
+static void workspace_change_update_mode(
+        const WorkSpace *workspace_old, const WorkSpace *workspace_new,
+        bContext *C, Object *ob_act, ReportList *reports)
 {
 	ObjectMode mode_old = BKE_workspace_object_mode_get(workspace_old);
 	ObjectMode mode_new = BKE_workspace_object_mode_get(workspace_new);
@@ -79,18 +80,20 @@ static void workspace_change_update_mode(const WorkSpace *workspace_old, const W
 }
 #endif
 
-static void workspace_change_update_render_layer(WorkSpace *workspace_new, const Scene *scene)
+static void workspace_change_update_render_layer(
+        WorkSpace *workspace_new, const WorkSpace *workspace_old)
 {
 	if (!BKE_workspace_render_layer_get(workspace_new)) {
-		BKE_workspace_render_layer_set(workspace_new, scene->render_layers.first);
+		BKE_workspace_render_layer_set(workspace_new, BKE_workspace_render_layer_get(workspace_old));
 	}
 }
 
-static void workspace_change_update(WorkSpace *workspace_new, const WorkSpace *workspace_old,
-                                    bContext *C, wmWindowManager *wm, Scene *scene)
+static void workspace_change_update(
+        WorkSpace *workspace_new, const WorkSpace *workspace_old,
+        bContext *C, wmWindowManager *wm)
 {
 	/* needs to be done before changing mode! (to ensure right context) */
-	workspace_change_update_render_layer(workspace_new, scene);
+	workspace_change_update_render_layer(workspace_new, workspace_old);
 #ifdef USE_WORKSPACE_MODE
 	workspace_change_update_mode(workspace_old, workspace_new, C, CTX_data_active_object(C), &wm->reports);
 #else
@@ -109,11 +112,19 @@ static WorkSpaceLayout *workspace_change_get_new_layout(
 {
 	/* ED_workspace_duplicate may have stored a layout to activate once the workspace gets activated. */
 	WorkSpaceLayout *layout_temp_store = BKE_workspace_temp_layout_store_get(win->workspace_hook);
-	WorkSpaceLayout *

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list