[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