[Bf-blender-cvs] [e5f3acb123] workspaces: Merge branch 'blender2.8' into workspaces

Julian Eisel noreply at git.blender.org
Thu Mar 16 19:55:13 CET 2017


Commit: e5f3acb123dcf8a753eda1c408bd0351643f3521
Author: Julian Eisel
Date:   Thu Mar 16 19:54:35 2017 +0100
Branches: workspaces
https://developer.blender.org/rBe5f3acb123dcf8a753eda1c408bd0351643f3521

Merge branch 'blender2.8' into workspaces

Conflicts:
	source/blender/blenloader/intern/versioning_280.c
	source/blenderplayer/bad_level_call_stubs/stubs.c

Also had to do some more changes in versioning_280.c to prevent startup
crash.

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



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

diff --cc source/blender/blenkernel/BKE_layer.h
index 85e4aab49e,4bb775362e..f2ed15b043
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@@ -55,7 -55,7 +55,8 @@@ struct SceneCollection
  struct SceneLayer;
  
  struct SceneLayer *BKE_scene_layer_render_active(const struct Scene *scene);
 -struct SceneLayer *BKE_scene_layer_context_active(struct Scene *scene);
++struct SceneLayer *BKE_scene_layer_context_active_ex(const struct Main *bmain, const struct Scene *scene);
 +struct SceneLayer *BKE_scene_layer_context_active(const struct Scene *scene);
  struct SceneLayer *BKE_scene_layer_add(struct Scene *scene, const char *name);
  
  bool BKE_scene_layer_remove(struct Main *bmain, struct Scene *scene, struct SceneLayer *sl);
diff --cc source/blender/blenkernel/intern/layer.c
index 182cf250c6,418dc68a50..50922482f2
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@@ -79,19 -76,12 +79,23 @@@ SceneLayer *BKE_scene_layer_render_acti
   * Returns the SceneLayer to be used for drawing, outliner, and
   * other context related areas.
   */
- SceneLayer *BKE_scene_layer_context_active(const Scene *scene)
 -SceneLayer *BKE_scene_layer_context_active(Scene *scene)
++SceneLayer *BKE_scene_layer_context_active_ex(const Main *bmain, const Scene *scene)
  {
 -	/* waiting for workspace to get the layer from context*/
 -	TODO_LAYER_CONTEXT;
 -	return BKE_scene_layer_render_active(scene);
 +	/* XXX iterating over windows here is not so nice, we could pass the workspace or the window as argument. */
- 	for (wmWindowManager *wm = G.main->wm.first; wm; wm = wm->id.next) {
++	for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) {
 +		for (wmWindow *win = wm->windows.first; win; win = win->next) {
 +			if (win->scene == scene) {
 +				return BKE_workspace_render_layer_get(BKE_workspace_active_get(win->workspace_hook));
 +			}
 +		}
 +	}
 +
 +	return NULL;
 +}
++SceneLayer *BKE_scene_layer_context_active(const Scene *scene)
++{
++	return BKE_scene_layer_context_active_ex(G.main, scene);
+ }
  
  /**
   * Add a new renderlayer
diff --cc source/blender/blenloader/intern/versioning_280.c
index 190e4f211c,ac3f703fbd..cc78537c34
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@@ -39,9 -40,9 +40,10 @@@
  #include "BKE_layer.h"
  #include "BKE_main.h"
  #include "BKE_scene.h"
 +#include "BKE_workspace.h"
  
  #include "BLI_listbase.h"
+ #include "BLI_mempool.h"
  #include "BLI_string.h"
  
  #include "BLO_readfile.h"
@@@ -49,69 -50,12 +51,72 @@@
  
  #include "MEM_guardedalloc.h"
  
 -void do_versions_after_linking_280(Main *main)
 +/**
 + * \brief Before lib-link versioning for new workspace design.
 + *
 + * Adds a workspace for each screen of the old file and adds the needed workspace-layout to wrap the screen.
 + * Rest of the conversion is done in #do_version_workspaces_after_lib_link.
 + *
 + * Note that some of the created workspaces might be deleted again in case of reading the default startup.blend.
 + */
 +static void do_version_workspaces_before_lib_link(Main *main)
 +{
 +	BLI_assert(BLI_listbase_is_empty(&main->workspaces));
 +
 +	for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
 +		WorkSpace *ws = BKE_workspace_add(main, screen->id.name + 2);
 +		BKE_workspace_layout_add(ws, screen, screen->id.name + 2);
 +
 +		/* For compatibility, the workspace should be activated that represents the active
 +		 * screen of the old file. This is done in blo_do_versions_after_linking_270. */
 +	}
 +
 +	for (wmWindowManager *wm = main->wm.first; wm; wm = wm->id.next) {
 +		for (wmWindow *win = wm->windows.first; win; win = win->next) {
 +			win->workspace_hook = BKE_workspace_instance_hook_create(main);
 +		}
 +	}
 +}
 +
 +/**
 + * \brief After lib-link versioning for new workspace design.
 + *
 + *  *  Active screen isn't stored directly in window anymore, but in the active workspace.
 + *     We already created a new workspace for each screen in #do_version_workspaces_before_lib_link,
 + *     here we need to find and activate the workspace that contains the active screen of the old file.
 + *  *  Active scene isn't stored in screen anymore, but in window.
 + */
 +static void do_version_workspaces_after_lib_link(Main *main)
 +{
 +	for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
 +		WorkSpace *workspace = BLI_findstring(&main->workspaces, screen->id.name + 2, offsetof(ID, name) + 2);
 +
 +		BKE_workspace_render_layer_set(workspace, screen->scene->render_layers.first);
 +	}
 +
 +	for (wmWindowManager *wm = main->wm.first; wm; wm = wm->id.next) {
 +		for (wmWindow *win = wm->windows.first; win; win = win->next) {
 +			bScreen *screen = win->screen;
 +			WorkSpace *workspace = BLI_findstring(&main->workspaces, screen->id.name + 2, offsetof(ID, name) + 2);
 +			ListBase *layouts = BKE_workspace_layouts_get(workspace);
 +
 +			BKE_workspace_active_set(win->workspace_hook, workspace);
 +			win->scene = screen->scene;
 +			BKE_workspace_active_layout_set(win->workspace_hook, layouts->first);
 +
 +			/* Deprecated from now on! */
 +			win->screen = NULL;
 +			screen->scene = NULL;
 +		}
 +	}
 +}
 +
 +void do_versions_after_linking_280(FileData *fd, Main *main)
  {
  	if (!MAIN_VERSION_ATLEAST(main, 280, 0)) {
+ 		char version[48];
+ 		BKE_blender_version_string(version, sizeof(version), main->versionfile, main->subversionfile, false, false);
+ 
  		for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
  			/* since we don't have access to FileData we check the (always valid) first render layer instead */
  			if (scene->render_layers.first == NULL) {
@@@ -232,14 -181,31 +242,54 @@@
  				scene->basact = NULL;
  			}
  		}
 +	}
  
 -		for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
 -			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;
 -						SceneLayer *layer = BKE_scene_layer_context_active(screen->scene);
 -
 -						soutliner->outlinevis = SO_ACT_LAYER;
 -
 -						if (BLI_listbase_count_ex(&layer->layer_collections, 2) == 1) {
 -							/* 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;
 +	{
 +		/* New workspace design */
 +		if (!DNA_struct_find(fd->filesdna, "WorkSpace")) {
 +			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)
++			{
++				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_iter_end;
++
++		for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) {
+ 		}
+ 	}
  }
  
  static void blo_do_version_temporary(Main *main)
diff --cc source/blenderplayer/bad_level_call_stubs/stubs.c
index cf18a7173e,09869664d6..9aaa1c910f
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@@ -310,12 -310,7 +310,13 @@@ int WM_operator_confirm(struct bContex
  struct MenuType *WM_menutype_find(const char *idname, bool quiet) RET_NULL
  void WM_operator_stack_clear(struct wmWindowManager *wm) RET_NONE
  void WM_operator_handlers_clear(wmWindowManager *wm, struct wmOperatorType *ot) RET_NONE
+ bool WM_operator_is_repeat(const struct bContext *C, const struct wmOperator *op) RET_ZERO;
 +void WM_windows_scene_data_sync(const struct ListBase *win_lb, struct Scene *scene) RET_NONE
 +struct Scene *WM_windows_scene_get_from_screen(const struct wmWindowManager *wm, const struct bScreen *screen) RET_NULL
 +struct bScreen *WM_window_get_active_screen(const struct wmWindow *win) RET_NULL
 +struct Scene *WM_window_get_active_scene(const struct wmWindow *win) RET_NULL
 +void WM_window_change_active_scene(struct Main *bmain, struct bContext *C, struct wmWindow *win, struct Scene *scene_new) RET_NONE
 +bool WM_window_is_temp_screen(const struct wmWindow *win) RET_ZERO
  
  void WM_autosave_init(wmWindowManager *wm) RET_NONE
  void WM_jobs_kill_all_except(struct wmWindowManager *wm, void *owner) RET_NONE




More information about the Bf-blender-cvs mailing list