[Bf-blender-cvs] [476aeb6] workspaces: Manage screen creation within workspace-layout editor API
Julian Eisel
noreply at git.blender.org
Tue Dec 6 23:16:42 CET 2016
Commit: 476aeb68f67819200ff43587646e0518b465b406
Author: Julian Eisel
Date: Tue Dec 6 23:14:50 2016 +0100
Branches: workspaces
https://developer.blender.org/rB476aeb68f67819200ff43587646e0518b465b406
Manage screen creation within workspace-layout editor API
===================================================================
M source/blender/blenkernel/BKE_workspace.h
M source/blender/blenkernel/intern/workspace.c
M source/blender/editors/include/ED_screen.h
M source/blender/editors/screen/screen_edit.c
M source/blender/editors/screen/screen_intern.h
M source/blender/editors/screen/screen_ops.c
M source/blender/editors/screen/workspace_edit.c
M source/blender/editors/screen/workspace_layout_edit.c
M source/blender/windowmanager/intern/wm_files.c
M source/blender/windowmanager/intern/wm_stereo.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 5be2399..6659ac5 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -35,7 +35,6 @@ struct WorkSpace;
/* Create, delete, init */
struct WorkSpace *BKE_workspace_add(Main *bmain, const char *name);
-struct WorkSpace *BKE_workspace_duplicate(Main *bmain, const struct WorkSpace *from, struct bScreen *act_screen);
void BKE_workspace_free(struct WorkSpace *ws);
struct WorkSpaceLayout *BKE_workspace_layout_add(struct WorkSpace *workspace, struct bScreen *screen) ATTR_NONNULL();
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 1ea24f3..44fb1d7 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -48,20 +48,6 @@ WorkSpace *BKE_workspace_add(Main *bmain, const char *name)
return new_ws;
}
-/**
- * \param act_screen: Screen that will be assigned to the active layout. Note that it shouldn't be used by
- * any other workspace and that the caller is responsible for actually setting it up.
- */
-WorkSpace *BKE_workspace_duplicate(Main *bmain, const WorkSpace *from, bScreen *act_screen)
-{
- WorkSpace *new_ws = BKE_libblock_alloc(bmain, ID_WS, from->id.name + 2);
- WorkSpaceLayout *new_layout = BKE_workspace_layout_add(new_ws, act_screen);
-
- new_ws->act_layout = new_layout;
-
- return new_ws;
-}
-
void BKE_workspace_free(WorkSpace *ws)
{
BLI_freelistN(&ws->layouts);
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 55799c5..2094f0d 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -104,8 +104,6 @@ void ED_screens_initialize(struct wmWindowManager *wm);
void ED_screen_draw(struct wmWindow *win);
void ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
void ED_screen_do_listen(struct bContext *C, struct wmNotifier *note);
-bScreen *ED_screen_duplicate(struct wmWindow *win, struct bScreen *sc, WorkSpaceLayout **r_layout);
-bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, const char *name, WorkSpaceLayout **r_layout);
bool ED_screen_set(struct bContext *C, struct bScreen *sc);
void ED_screen_set_scene(struct bContext *C, struct bScreen *screen, struct Scene *scene);
bool ED_screen_delete_scene(struct bContext *C, struct Scene *scene);
@@ -124,7 +122,9 @@ void ED_screen_preview_render(const struct bScreen *screen, int size_x, int s
/* workspaces */
bool ED_workspace_change(struct bContext *C, struct wmWindow *win, WorkSpace *ws_new) ATTR_NONNULL();
-WorkSpace *ED_workspace_duplicate(struct Main *bmain, struct wmWindow *win);
+WorkSpace *ED_workspace_duplicate(WorkSpace *workspace_old, struct Main *bmain, struct wmWindow *win);
+WorkSpaceLayout *ED_workspace_layout_add(WorkSpace *workspace, struct wmWindow *win, Scene *scene, const char *name) ATTR_NONNULL();
+WorkSpaceLayout *ED_workspace_layout_duplicate(WorkSpace *workspace, const WorkSpaceLayout *layout_old, struct wmWindow *win) ATTR_NONNULL();
bool ED_workspace_delete(struct Main *bmain, struct bContext *C, struct wmWindow *win, WorkSpace *ws);
bool ED_workspace_layout_delete(struct bContext *C, WorkSpace *workspace, WorkSpaceLayout *layout_old) ATTR_NONNULL();
bool ED_workspace_layout_cycle(struct bContext *C, WorkSpace *workspace, const short direction) ATTR_NONNULL();
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 35b9854..cbd8714 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -461,16 +461,12 @@ ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge)
/**
* Empty screen, with 1 dummy area without spacedata. Uses window size.
- * \param r_layout: The layout wrapper created for \a sc. Can be NULL to skip layout creation.
*/
-bScreen *ED_screen_add(wmWindow *win, Scene *scene, const char *name, WorkSpaceLayout **r_layout)
+bScreen *screen_add(wmWindow *win, Scene *scene, const char *name, const int winsize_x, const int winsize_y)
{
- const int winsize_x = WM_window_pixels_x(win);
- const int winsize_y = WM_window_pixels_y(win);
-
bScreen *sc;
ScrVert *sv1, *sv2, *sv3, *sv4;
-
+
sc = BKE_libblock_alloc(G.main, ID_SCR, name);
sc->scene = scene;
sc->do_refresh = true;
@@ -481,23 +477,19 @@ bScreen *ED_screen_add(wmWindow *win, Scene *scene, const char *name, WorkSpaceL
sv2 = screen_addvert(sc, 0, winsize_y - 1);
sv3 = screen_addvert(sc, winsize_x - 1, winsize_y - 1);
sv4 = screen_addvert(sc, winsize_x - 1, 0);
-
+
screen_addedge(sc, sv1, sv2);
screen_addedge(sc, sv2, sv3);
screen_addedge(sc, sv3, sv4);
screen_addedge(sc, sv4, sv1);
-
+
/* dummy type, no spacedata */
screen_addarea(sc, sv1, sv2, sv3, sv4, HEADERDOWN, SPACE_EMPTY);
- if (r_layout) {
- *r_layout = BKE_workspace_layout_add(win->workspace, sc);
- }
-
return sc;
}
-static void screen_copy(bScreen *to, bScreen *from)
+void screen_data_copy(bScreen *to, bScreen *from)
{
ScrVert *s1, *s2;
ScrEdge *se;
@@ -540,7 +532,16 @@ static void screen_copy(bScreen *to, bScreen *from)
/* put at zero (needed?) */
for (s1 = from->vertbase.first; s1; s1 = s1->next)
s1->newv = NULL;
+}
+/**
+ * Prepare a newly created screen for initializing it as active screen.
+ */
+void screen_new_activate_refresh(const wmWindow *win, bScreen *screen_new)
+{
+ screen_new->winid = win->winid;
+ screen_new->do_refresh = true;
+ screen_new->do_draw = true;
}
@@ -1058,23 +1059,6 @@ static void drawscredge_area(ScrArea *sa, int sizex, int sizey)
/* ****************** EXPORTED API TO OTHER MODULES *************************** */
-/**
- * \param r_layout: The layout wrapper created for \a sc. Can be NULL to skip layout creation.
- */
-bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc, WorkSpaceLayout **r_layout)
-{
- bScreen *newsc;
-
- if (sc->state != SCREENNORMAL) return NULL; /* XXX handle this case! */
-
- /* make new empty screen: */
- newsc = ED_screen_add(win, sc->scene, sc->id.name + 2, r_layout);
- /* copy all data */
- screen_copy(newsc, sc);
-
- return newsc;
-}
-
/* screen sets cursor based on swinid */
static void region_cursor_set(wmWindow *win, int swinid, int swin_changed)
{
@@ -1959,6 +1943,7 @@ ScrArea *ED_screen_state_toggle(bContext *C, wmWindow *win, ScrArea *sa, const s
}
else {
/* change from SCREENNORMAL to new state */
+ WorkSpace *workspace = win->workspace;
WorkSpaceLayout *layout_new;
ScrArea *newa;
char newname[MAX_ID_NAME - 2];
@@ -1967,7 +1952,10 @@ ScrArea *ED_screen_state_toggle(bContext *C, wmWindow *win, ScrArea *sa, const s
oldscreen->state = state;
BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name + 2, "nonnormal");
- sc = ED_screen_add(win, oldscreen->scene, newname, &layout_new);
+
+ layout_new = ED_workspace_layout_add(workspace, win, oldscreen->scene, newname);
+
+ sc = BKE_workspace_layout_screen_get(layout_new);
sc->state = state;
sc->redraws_flag = oldscreen->redraws_flag;
sc->temp = oldscreen->temp;
diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h
index d4481bd..0809f35 100644
--- a/source/blender/editors/screen/screen_intern.h
+++ b/source/blender/editors/screen/screen_intern.h
@@ -45,6 +45,9 @@ void ED_area_data_swap(ScrArea *sa1, ScrArea *sa2);
void region_toggle_hidden(bContext *C, ARegion *ar, const bool do_fade);
/* screen_edit.c */
+bScreen *screen_add(wmWindow *win, Scene *scene, const char *name, const int winsize_x, const int winsize_y);
+void screen_data_copy(bScreen *to, bScreen *from);
+void screen_new_activate_refresh(const wmWindow *win, bScreen *screen_new);
bScreen *screen_set_find_associated_fullscreen(const struct Main *bmain, bScreen *screen);
void screen_set_refresh(struct Main *bmain, bContext *C, wmWindow *win, bool scene_changed);
bScreen *screen_set_ensure_valid(const struct Main *bmain, const wmWindow *win, bScreen *screen_new);
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 660c39f..f9c7db6 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -980,7 +980,7 @@ static void SCREEN_OT_area_swap(wmOperatorType *ot)
static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
wmWindow *newwin, *win;
- WorkSpaceLayout *layout;
+ WorkSpaceLayout *layout_new;
bScreen *newsc, *sc;
ScrArea *sa;
rcti rect;
@@ -1015,8 +1015,9 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
newwin->workspace = win->workspace;
/* allocs new screen and adds to newly created window, using window size */
- newsc = ED_screen_add(newwin, CTX_data_scene(C), sc->id.name + 2, &layout);
- WM_window_set_active_layout(newwin, layout);
+ layout_new = ED_workspace_layout_add(newwin->workspace, newwin, CTX_data_scene(C), sc->id.name + 2);
+ newsc = BKE_workspace_layout_screen_get(layout_new);
+ WM_window_set_active_layout(newwin, layout_new);
/* copy area to new screen */
ED_area_data_copy((ScrArea *)newsc->areabase.first, sa, true);
@@ -3877,11 +3878,12 @@ static void SCREEN_OT_userpref_show(struct wmOperatorType *ot)
static int screen_new_exec(bContext *C, wmOperator *UNUSED(op))
{
wmWindow *win = CTX_wm_window(C);
- WorkSpaceLayout *layout;
- bScreen *sc = CTX_wm_screen(C);
+ WorkSpace *workspace = CTX_wm_workspace(C);
+ WorkSpaceLayout *layout_old = BKE_workspace_active_layout_get(workspace);
+ WorkSpaceLayout *layout_new;
- sc = ED_screen_duplicate(win, sc, &layout);
- WM_event_add_notifier(C, NC_SCREEN | ND_SCREENBROWSE, layout);
+ layout_new = ED_workspace_layout_duplicate(workspace, layout_old, win);
+ WM_event_add_notifier(C, NC_SCREEN | ND_SCREENBROWSE, layout_new);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list