Commit: 9818bf0d56ebd6ae694312abd50cd293b990679e Author: Julian Eisel Date: Sat Feb 25 00:07:41 2017 +0100 Branches: temp-workspace-multi-window https://developer.blender.org/rB9818bf0d56ebd6ae694312abd50cd293b990679e
Add WorkSpaceHook struct as bridge between workspace and window-manager This way we can keep workspace and window-manager data separate and further steps are made a bit easier. =================================================================== M source/blender/blenkernel/BKE_workspace.h M source/blender/blenkernel/intern/context.c M source/blender/blenkernel/intern/image.c M source/blender/blenkernel/intern/library_query.c M source/blender/blenkernel/intern/scene.c M source/blender/blenkernel/intern/workspace.c M source/blender/blenloader/intern/readfile.c M source/blender/blenloader/intern/versioning_270.c M source/blender/blenloader/intern/writefile.c M source/blender/depsgraph/intern/depsgraph_tag.cc M source/blender/editors/workspace/workspace_layout_edit.c M source/blender/makesdna/DNA_windowmanager_types.h M source/blender/makesdna/dna_workspace_types.h M source/blender/makesrna/intern/rna_wm.c M source/blender/windowmanager/intern/wm_window.c =================================================================== diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h index 69d4066b3a..be05da62f4 100644 --- a/source/blender/blenkernel/BKE_workspace.h +++ b/source/blender/blenkernel/BKE_workspace.h @@ -35,6 +35,7 @@ struct TransformOrientation; struct WorkSpace; typedef struct WorkSpace WorkSpace; +typedef struct WorkSpaceHook WorkSpaceHook; typedef struct WorkSpaceLayout WorkSpaceLayout; typedef struct WorkSpaceLayoutType WorkSpaceLayoutType; @@ -60,6 +61,8 @@ WorkSpaceLayout *BKE_workspace_layout_add_from_type(WorkSpace *workspace, WorkSp WorkSpaceLayoutType *BKE_workspace_layout_type_add(WorkSpace *workspace, const char *name) ATTR_NONNULL(); WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, struct bScreen *screen) ATTR_NONNULL(); void BKE_workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout *layout, struct Main *bmain) ATTR_NONNULL(); +WorkSpaceHook *BKE_workspace_hook_new(void) ATTR_WARN_UNUSED_RESULT; +void BKE_workspace_hook_delete(WorkSpaceHook *hook) ATTR_NONNULL(); /* -------------------------------------------------------------------- */ @@ -127,6 +130,12 @@ void BKE_workspace_layout_screen_set(WorkSpaceLayout *layout, struct WorkSpaceLayout *BKE_workspace_layout_next_get(const WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; WorkSpaceLayout *BKE_workspace_layout_prev_get(const WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; +WorkSpace *BKE_workspace_active_get(const WorkSpaceHook *hook) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; +void BKE_workspace_active_set(WorkSpaceHook *hook, WorkSpace *workspace) ATTR_NONNULL(1); +WorkSpace *BKE_workspace_active_delayed_get(const WorkSpaceHook *hook) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; +void BKE_workspace_active_delayed_set(WorkSpaceHook *hook, WorkSpace *workspace) ATTR_NONNULL(1); +struct ListBase *BKE_workspace_hook_layouts_get(WorkSpaceHook *workspace_hook) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; + /* -------------------------------------------------------------------- */ /* Don't use outside of BKE! */ diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index d4dd4887e3..d1ac491e4e 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -837,7 +837,7 @@ void CTX_wm_window_set(bContext *C, wmWindow *win) if (C->wm.window) { C->data.scene = C->wm.window->scene; } - C->wm.workspace = (win) ? win->workspace : NULL; + C->wm.workspace = (win) ? BKE_workspace_active_get(win->workspace_hook) : NULL; C->wm.screen = (win) ? BKE_workspace_active_screen_get(C->wm.workspace) : NULL; C->wm.area = NULL; C->wm.region = NULL; diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index c14d03b24c..4ba48260d3 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -2542,7 +2542,8 @@ void BKE_image_walk_all_users(const Main *mainp, void *customdata, /* image window, compo node users */ for (wm = mainp->wm.first; wm; wm = wm->id.next) { /* only 1 wm */ for (win = wm->windows.first; win; win = win->next) { - const bScreen *screen = BKE_workspace_active_screen_get(win->workspace); + WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); + const bScreen *screen = BKE_workspace_active_screen_get(workspace); for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { if (sa->spacetype == SPACE_VIEW3D) { diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c index 04c3ae034b..5371ef7b9a 100644 --- a/source/blender/blenkernel/intern/library_query.c +++ b/source/blender/blenkernel/intern/library_query.c @@ -913,11 +913,13 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call wmWindowManager *wm = (wmWindowManager *)id; for (wmWindow *win = wm->windows.first; win; win = win->next) { - ID *workspace = BKE_workspace_id_get(win->workspace); + WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); + ListBase *layouts = BKE_workspace_hook_layouts_get(win->workspace_hook); + ID *workspace_id = BKE_workspace_id_get(workspace); CALLBACK_INVOKE(win->scene, IDWALK_CB_USER_ONE); - BKE_workspace_layout_iter_begin(layout, win->workspace_layouts.first) + BKE_workspace_layout_iter_begin(layout, layouts->first) { bScreen *screen = BKE_workspace_layout_screen_get(layout); @@ -927,9 +929,9 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call } BKE_workspace_layout_iter_end; - CALLBACK_INVOKE_ID(workspace, IDWALK_CB_NOP); + CALLBACK_INVOKE_ID(workspace_id, IDWALK_CB_NOP); /* allow callback to set a different workspace */ - win->workspace = (WorkSpace *)workspace; + BKE_workspace_active_set(win->workspace_hook, (WorkSpace *)workspace_id); } break; } diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index ec4f249914..06ef7a2688 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1391,7 +1391,8 @@ static bool check_rendered_viewport_visible(Main *bmain) wmWindowManager *wm = bmain->wm.first; wmWindow *window; for (window = wm->windows.first; window != NULL; window = window->next) { - const bScreen *screen = BKE_workspace_active_screen_get(window->workspace); + const WorkSpace *workspace = BKE_workspace_active_get(window->workspace_hook); + const bScreen *screen = BKE_workspace_active_screen_get(workspace); for (ScrArea *area = screen->areabase.first; area != NULL; area = area->next) { View3D *v3d = area->spacedata.first; diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c index d3206b9ad3..d2efa9d0b1 100644 --- a/source/blender/blenkernel/intern/workspace.c +++ b/source/blender/blenkernel/intern/workspace.c @@ -141,6 +141,16 @@ void BKE_workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout *layout, workspace_layout_type_remove(workspace, layout_type); } +WorkSpaceHook *BKE_workspace_hook_new(void) +{ + return MEM_callocN(sizeof(WorkSpaceHook), __func__); +} + +void BKE_workspace_hook_delete(WorkSpaceHook *hook) +{ + MEM_freeN(hook); +} + /* -------------------------------------------------------------------- */ /* General Utils */ @@ -337,3 +347,26 @@ WorkSpaceLayout *BKE_workspace_layout_prev_get(const WorkSpaceLayout *layout) { return layout->prev; } + +WorkSpace *BKE_workspace_active_get(const WorkSpaceHook *hook) +{ + return hook->act_workspace; +} +void BKE_workspace_active_set(WorkSpaceHook *hook, WorkSpace *workspace) +{ + hook->act_workspace = workspace; +} + +WorkSpace *BKE_workspace_active_delayed_get(const WorkSpaceHook *hook) +{ + return hook->new_workspace; +} +void BKE_workspace_active_delayed_set(WorkSpaceHook *hook, WorkSpace *workspace) +{ + hook->new_workspace = workspace; +} + +ListBase *BKE_workspace_hook_layouts_get(WorkSpaceHook *workspace_hook) +{ + return &workspace_hook->layouts; +} diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 57fd99e3b5..3f643ba98b 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2790,11 +2790,21 @@ static void direct_link_workspace(FileData *fd, WorkSpace *ws) WorkSpaceLayout *act_layout = BKE_workspace_active_layout_get(ws); link_list(fd, BKE_workspace_layouts_get(ws)); + link_list(fd, BKE_workspace_layout_types_get(ws)); act_layout = newdataadr(fd, act_layout); BKE_workspace_active_layout_set(ws, act_layout); } +static void direct_link_workspace_hook(FileData *fd, WorkSpaceHook *hook) +{ + hook = newdataadr(fd, hook); + if (hook) { + ListBase *layouts = BKE_workspace_hook_layouts_get(hook); + link_list(fd, layouts); + } +} + /* ************ READ MOTION PATHS *************** */ /* direct data for cache */ @@ -6368,9 +6378,10 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm) if (win->stereo3d_format) { win->stereo3d_format->display_mode = S3D_DISPLAY_ANAGLYPH; } - link_list(fd, &win->workspace_layouts); + win->workspace_hook = newdataadr(fd, win->workspace_hook); + direct_link_workspace_hook(fd, win->workspace_hook); } - + BLI_listbase_clear(&wm->timers); BLI_listbase_clear(&wm->operators); BLI_listbase_clear(&wm->paintcursors); @@ -6400,9 +6411,11 @@ static void lib_link_windowmanager(FileData *fd, Main *main) for (wm = main->wm.first; wm; wm = wm->id.next) { if (wm->id.tag & LIB_TAG_NEED_LINK) { for (win = wm->windows.first; win; win = win->next) { + WorkSpace *workspace_new = newlibadr(fd, wm->id.lib, BKE_workspace_active_get(win->workspace_hook)); + win->scene = newlibadr(fd, wm->id.lib, win->scene); - win->workspace = newlibadr(fd, wm->id.lib, win->workspace); - lib_link_workspace_layouts(fd, wm->id.lib, &win->workspace_layouts); + BKE_workspace_active_set(win->workspace_hook, workspace_new); + lib_link_workspace_layouts(fd, wm->id.lib, BKE_workspace_hook_layouts_get(win->workspace_hook)); /* deprecated, but needed for versioning (will be NULL'ed then) */ win->screen = newlibadr(fd, NULL, win->screen); } @@ -7048,9 +7061,11 @@ void blo_lib_link_restore(Main *newmain, wmWindowManager *curwm, Scene *curscene for (wmWindow *win = curwm->windows.first; win; win = win->next) { Scene *oldscene = win->scene; - WorkSpace *workspace = restore_pointer_by_name(id_map, (ID *)win->workspace, USER_REAL); + const ListBase *layouts = BKE_workspace_hook_layouts_get(win->workspace_hook); + WorkSpace *workspace_old = BKE_workspace_active_get(win->workspace_hook); + WorkSpace *workspace = restore_pointer_by_name(id_map, (ID *)workspace_old, USER_REAL); - BKE_workspace_layout_iter_begin(layout, win->workspace_layouts.first) + BKE_workspace_layout_iter_begin(layout, layouts->first) { lib_link_workspace_layout_restore(id_map, newmain, layout); } @@ -7060,7 +7075, @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs