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