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);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to