[Bf-blender-cvs] [759355374d5] temp-workspace-multi-window: Don't create workspace or screen-layout when opening temp windows (e.g user prefs)

Julian Eisel noreply at git.blender.org
Thu Mar 9 12:58:41 CET 2017


Commit: 759355374d555cbed28704fb7aae6066f47437a5
Author: Julian Eisel
Date:   Thu Mar 9 12:56:56 2017 +0100
Branches: temp-workspace-multi-window
https://developer.blender.org/rB759355374d555cbed28704fb7aae6066f47437a5

Don't create workspace or screen-layout when opening temp windows (e.g user prefs)

Not sure how safe change in area.c is, had to do that to avoid weird
scroll offset when opening user pref window.

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

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/workspace/area.c
M	source/blender/editors/workspace/screen_ops.c
M	source/blender/editors/workspace/workspace_layout_edit.c
M	source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index c074bdcfda2..903a51a31ff 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -142,6 +142,7 @@ void ED_workspace_scene_data_sync(struct WorkSpaceHook *hook, Scene *scene);
 bool ED_workspace_layout_delete(
         struct bContext *C, struct wmWindow *win, struct WorkSpace *workspace, struct WorkSpaceLayout *layout_old) ATTR_NONNULL();
 bool ED_workspace_layout_cycle(struct bContext *C, struct WorkSpace *workspace, const short direction) ATTR_NONNULL();
+void ED_workspace_layout_make_single_area(struct bScreen *screen, const int size_x, const int size_y);
 
 /* anim */
 void    ED_update_for_newframe(struct Main *bmain, struct Scene *scene, int mute);
diff --git a/source/blender/editors/workspace/area.c b/source/blender/editors/workspace/area.c
index a8a18264be5..6de09386707 100644
--- a/source/blender/editors/workspace/area.c
+++ b/source/blender/editors/workspace/area.c
@@ -1518,6 +1518,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
 	
 	/* region windows, default and own handlers */
 	for (ar = sa->regionbase.first; ar; ar = ar->next) {
+		ar->v2d.flag &= ~V2D_IS_INITIALISED;
 		region_subwindow(win, ar, false);
 		
 		if (ar->swinid) {
diff --git a/source/blender/editors/workspace/screen_ops.c b/source/blender/editors/workspace/screen_ops.c
index 303d776d0ab..2af8e5258ce 100644
--- a/source/blender/editors/workspace/screen_ops.c
+++ b/source/blender/editors/workspace/screen_ops.c
@@ -983,7 +983,6 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 	wmWindow *newwin, *win = CTX_wm_window(C);
 	Scene *scene = CTX_data_scene(C);
 	WorkSpace *workspace = WM_window_get_active_workspace(win);
-	ScreenLayoutData layout_data = {};
 	bScreen *newsc;
 	ScrArea *sa = CTX_wm_area(C);
 	rcti rect;
@@ -1019,12 +1018,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 	newsc = BKE_workspace_hook_active_screen_get(newwin->workspace_hook);
 
 	/* remove all data from screen, and add a new empty area */
-	BKE_screen_free(newsc);
-	ED_screen_empty_data_create(BLI_rcti_size_x(&rect), BLI_rcti_size_y(&rect), &layout_data);
-	newsc->areabase = layout_data.areabase;
-	newsc->vertbase = layout_data.vertbase;
-	newsc->edgebase = layout_data.edgebase;
-	BLI_assert(BLI_listbase_count(&newsc->areabase) == 1);
+	ED_workspace_layout_make_single_area(newsc, BLI_rcti_size_x(&rect), BLI_rcti_size_y(&rect));
 
 	/* copy area to new screen */
 	BKE_screen_area_data_copy((ScrArea *)newsc->areabase.first, sa, false);
diff --git a/source/blender/editors/workspace/workspace_layout_edit.c b/source/blender/editors/workspace/workspace_layout_edit.c
index 77c7ff875bc..8db26515917 100644
--- a/source/blender/editors/workspace/workspace_layout_edit.c
+++ b/source/blender/editors/workspace/workspace_layout_edit.c
@@ -234,3 +234,19 @@ bool ED_workspace_layout_cycle(bContext *C, WorkSpace *workspace, const short di
 
 	return changed;
 }
+
+/**
+ * Delete data from \a screen and create an empty area into it.
+ * \note Doesn't exit \a screen (usually not needed).
+ */
+void ED_workspace_layout_make_single_area(bScreen *screen, const int size_x, const int size_y)
+{
+	ScreenLayoutData layout_data = {};
+
+	BKE_screen_free(screen);
+	ED_screen_empty_data_create(size_y, size_x, &layout_data);
+	screen->areabase = layout_data.areabase;
+	screen->vertbase = layout_data.vertbase;
+	screen->edgebase = layout_data.edgebase;
+	BLI_assert(BLI_listbase_count(&screen->areabase) == 1);
+}
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 0c2d6ee424d..5b7d65d831d 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -650,8 +650,6 @@ wmWindow *WM_window_open_temp(bContext *C, const rcti *rect_init, int type)
 		win->posy = rect.ymin;
 	}
 
-	screen = WM_window_get_active_screen(win);
-
 	/* multiply with virtual pixelsize, ghost handles native one (e.g. for retina) */
 	win->sizex = BLI_rcti_size_x(&rect) * px_virtual;
 	win->sizey = BLI_rcti_size_y(&rect) * px_virtual;
@@ -662,19 +660,11 @@ wmWindow *WM_window_open_temp(bContext *C, const rcti *rect_init, int type)
 	}
 
 	if (WM_window_get_active_workspace(win) == NULL) {
-		WorkSpace *workspace = ED_workspace_add(bmain, "Temp", scene->render_layers.first);
-		WM_window_set_active_workspace(win, workspace);
-	}
-
-	if (screen == NULL) {
-		/* add new screen layout */
-		WorkSpace *workspace = WM_window_get_active_workspace(win);
-		ScreenLayoutData layout_data = {};
-
-		ED_screen_empty_data_create(win->sizex, win->sizey, &layout_data);
-		ED_workspace_layout_add(workspace, &wm->windows, "temp", layout_data);
-		screen = WM_window_get_active_screen(win);
+		/* same workspace as active window */
+		WM_window_set_active_workspace(win, WM_window_get_active_workspace(win_prev));
 	}
+	screen = WM_window_get_active_screen(win);
+	ED_workspace_layout_make_single_area(screen, win->sizex, win->sizey);
 
 	if (WM_window_get_active_scene(win) != scene) {
 		WM_window_change_active_scene(bmain, C, win, scene);




More information about the Bf-blender-cvs mailing list