[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