[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