[Bf-blender-cvs] [046b158] testbuild: Fullscreen Editor (new fullscreen mode for clean UI)

Dalai Felinto noreply at git.blender.org
Fri Nov 14 04:28:06 CET 2014


Commit: 046b1584c4f01e3e7b7838daaf9ba93d3bdf6762
Author: Dalai Felinto
Date:   Thu Jul 31 12:14:46 2014 -0300
Branches: testbuild
https://developer.blender.org/rB046b1584c4f01e3e7b7838daaf9ba93d3bdf6762

Fullscreen Editor (new fullscreen mode for clean UI)

Organize Maximize/Fullscreen mess and add a new fullscreen mode with no UI

* Maximize Editor: (old Ctrl+Up)
* Full Screen Window: (old Alt + F11)
* Full Screen Editor: new operator (Alt + F10)

It should fullscreen the window and make it clean (no UI, no buttons).
After exiting it, it should return to the previous window state
(windowed/fullscreen).

This was originally intended for the multiview branch, but this
functionality also benefits non-stereo workflows, thus it can be
reviewed and committed independently.

Development notes:
* This includes cleanups in the code to sanitize the naming of
  fullscreen/maximize across the window/editor code.

Differential Revision: https://developer.blender.org/ - D678
(I hope testbuild doesn't close my differential)

===================================================================

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/render/render_view.c
M	source/blender/editors/screen/area.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/editors/screen/screen_ops.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/makesdna/DNA_windowmanager_types.h
M	source/blender/makesrna/intern/rna_screen.c
M	source/blender/windowmanager/intern/wm_init_exit.c
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/intern/wm_window.c
M	source/blender/windowmanager/wm_window.h

===================================================================

diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index d31be3e..ed24656 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -110,7 +110,7 @@ void    ED_screen_animation_timer_update(struct bScreen *screen, int redraws, in
 ScrArea *ED_screen_full_newspace(struct bContext *C, ScrArea *sa, int type);
 void    ED_screen_full_prevspace(struct bContext *C, ScrArea *sa);
 void    ED_screen_full_restore(struct bContext *C, ScrArea *sa);
-struct ScrArea *ED_screen_full_toggle(struct bContext *C, struct wmWindow *win, struct ScrArea *sa);
+struct ScrArea *ED_screen_state_toggle(struct bContext *C, struct wmWindow *win, struct ScrArea *sa, const short state);
 void    ED_screens_header_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg);
 
 /* anim */
diff --git a/source/blender/editors/render/render_view.c b/source/blender/editors/render/render_view.c
index 0beb573..ab28f5f 100644
--- a/source/blender/editors/render/render_view.c
+++ b/source/blender/editors/render/render_view.c
@@ -252,7 +252,7 @@ static int render_view_cancel_exec(bContext *C, wmOperator *UNUSED(op))
 	}
 	else if (sima->flag & SI_FULLWINDOW) {
 		sima->flag &= ~SI_FULLWINDOW;
-		ED_screen_full_toggle(C, win, sa);
+		ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED);
 		return OPERATOR_FINISHED;
 	}
 
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 11e7174..863464f 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -571,7 +571,7 @@ static void area_azone_initialize(wmWindow *win, bScreen *screen, ScrArea *sa)
 	/* reinitalize entirely, regions add azones too */
 	BLI_freelistN(&sa->actionzones);
 
-	if (screen->full != SCREENNORMAL) {
+	if (screen->state != SCREENNORMAL) {
 		return;
 	}
 
@@ -1168,7 +1168,8 @@ static void region_rect_recursive(wmWindow *win, ScrArea *sa, ARegion *ar, rcti
 		 * must be minimum '4' */
 	}
 	else {
-		region_azone_add(sa, ar, alignment);
+		if (ELEM(win->screen->state, SCREENNORMAL, SCREENMAXIMIZED))
+			region_azone_add(sa, ar, alignment);
 	}
 
 	region_rect_recursive(win, sa, ar->next, remainder, quad);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 5beab9f..3591548 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1058,7 +1058,7 @@ bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc)
 {
 	bScreen *newsc;
 	
-	if (sc->full != SCREENNORMAL) return NULL;  /* XXX handle this case! */
+	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);
@@ -1485,7 +1485,7 @@ void ED_screen_set(bContext *C, bScreen *sc)
 		return;
 	
 
-	if (sc->full) {             /* find associated full */
+	if (sc->state == SCREENFULLSCREEN) {             /* find associated full */
 		bScreen *sc1;
 		for (sc1 = bmain->screen.first; sc1; sc1 = sc1->id.next) {
 			ScrArea *sa = sc1->areabase.first;
@@ -1586,7 +1586,7 @@ void ED_screen_delete(bContext *C, bScreen *sc)
 	int delete = 1;
 	
 	/* don't allow deleting temp fullscreens for now */
-	if (sc->full == SCREENFULL) {
+	if (ELEM(sc->state, SCREENMAXIMIZED, SCREENFULLSCREEN)) {
 		return;
 	}
 	
@@ -1730,11 +1730,11 @@ ScrArea *ED_screen_full_newspace(bContext *C, ScrArea *sa, int type)
 	ScrArea *newsa = NULL;
 
 	if (!sa || sa->full == NULL) {
-		newsa = ED_screen_full_toggle(C, win, sa);
+		newsa = ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED);
 	}
 	
 	if (!newsa) {
-		if (sa->full) {
+		if (sa->full && screen->state == SCREENMAXIMIZED) {
 			/* if this has been called from the temporary info header generated in
 			 * temp fullscreen layouts, find the correct fullscreen area to change
 			 * to create a new space inside */
@@ -1760,7 +1760,7 @@ void ED_screen_full_prevspace(bContext *C, ScrArea *sa)
 	ED_area_prevspace(C, sa);
 	
 	if (sa->full)
-		ED_screen_full_toggle(C, win, sa);
+		ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED);
 }
 
 /* restore a screen / area back to default operation, after temp fullscreen modes */
@@ -1785,23 +1785,23 @@ void ED_screen_full_restore(bContext *C, ScrArea *sa)
 				ED_screen_full_prevspace(C, sa);
 			}
 			else
-				ED_screen_full_toggle(C, win, sa);
+				ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED);
 		}
 		else if (sl->spacetype == SPACE_FILE) {
 			ED_screen_full_prevspace(C, sa);
 		}
 		else {
-			ED_screen_full_toggle(C, win, sa);
+			ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED);
 		}
 	}
 	/* otherwise just tile the area again */
 	else {
-		ED_screen_full_toggle(C, win, sa);
+		ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED);
 	}
 }
 
-/* this function toggles: if area is full then the parent will be restored */
-ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
+/* this function toggles: if area is maximized/full then the parent will be restored */
+ScrArea *ED_screen_state_toggle(bContext *C, wmWindow *win, ScrArea *sa, const short state)
 {
 	bScreen *sc, *oldscreen;
 	ARegion *ar;
@@ -1812,23 +1812,20 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
 		 * are no longer in the same screen */
 		for (ar = sa->regionbase.first; ar; ar = ar->next)
 			uiFreeBlocks(C, &ar->uiblocks);
-		
+
 		/* prevent hanging header prints */
 		ED_area_headerprint(sa, NULL);
 	}
 
 	if (sa && sa->full) {
+		/* restoring back to SCREENNORMAL */
 		ScrArea *old;
-		/*short fulltype;*/ /*UNUSED*/
 
 		sc = sa->full;       /* the old screen to restore */
 		oldscreen = win->screen; /* the one disappearing */
 
-		/*fulltype = sc->full;*/
-		sc->full = 0;
+		sc->state = SCREENNORMAL;
 
-		/* removed: SCREENAUTOPLAY exception here */
-	
 		/* find old area */
 		for (old = sc->areabase.first; old; old = old->next)
 			if (old->full) break;
@@ -1838,6 +1835,12 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
 			return NULL;
 		}
 
+		if (state == SCREENFULLSCREEN) {
+			/* restore the old side panels/header visibility */
+			for (ar = sa->regionbase.first; ar; ar = ar->next)
+				ar->flag = ar->flagfullscreen;
+		}
+
 		ED_area_data_swap(old, sa);
 		if (sa->flag & AREA_TEMP_INFO) sa->flag &= ~AREA_TEMP_INFO;
 		old->full = NULL;
@@ -1853,44 +1856,66 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
 
 	}
 	else {
+		/* change from SCREENNORMAL to new state */
 		ScrArea *newa;
 		char newname[MAX_ID_NAME - 2];
 
 		oldscreen = win->screen;
 
-		/* nothing wrong with having only 1 area, as far as I can see...
-		 * is there only 1 area? */
-#if 0
-		if (oldscreen->areabase.first == oldscreen->areabase.last)
-			return NULL;
-#endif
-
-		oldscreen->full = SCREENFULL;
-		BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name + 2, "full");
+		oldscreen->state = state;
+		BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name + 2, "nonnormal");
 		sc = ED_screen_add(win, oldscreen->scene, newname);
-		sc->full = SCREENFULL; // XXX
+		sc->state = state;
 
 		/* timer */
 		sc->animtimer = oldscreen->animtimer;
 		oldscreen->animtimer = NULL;
 
-		/* returns the top small area */
-		newa = area_split(sc, (ScrArea *)sc->areabase.first, 'h', 0.99f, 1);
-		ED_area_newspace(C, newa, SPACE_INFO);
-
 		/* use random area when we have no active one, e.g. when the
 		 * mouse is outside of the window and we open a file browser */
 		if (!sa)
 			sa = oldscreen->areabase.first;
 
-		/* copy area */
-		newa = newa->prev;
-		ED_area_data_swap(newa, sa);
-		sa->flag |= AREA_TEMP_INFO;
+		if (state == SCREENMAXIMIZED) {
+			/* returns the top small area */
+			newa = area_split(sc, (ScrArea *)sc->areabase.first, 'h', 0.99f, 1);
+			ED_area_newspace(C, newa, SPACE_INFO);
 
-		sa->full = oldscreen;
-		newa->full = oldscreen;
-		newa->next->full = oldscreen; // XXX
+			/* copy area */
+			newa = newa->prev;
+			ED_area_data_swap(newa, sa);
+			sa->flag |= AREA_TEMP_INFO;
+
+			sa->full = oldscreen;
+			newa->full = oldscreen;
+			newa->next->full = oldscreen; // XXX
+		}
+		else if (state == SCREENFULLSCREEN){
+			newa = (ScrArea *)sc->areabase.first;
+
+			/* copy area */
+			ED_area_data_swap(newa, sa);
+			newa->flag = sa->flag; /* mostly for AREA_FLAG_WASFULLSCREEN */
+
+			/* temporarily hide the side panels/header */
+			for (ar = newa->regionbase.first; ar; ar = ar->next) {
+				ar->flagfullscreen = ar->flag;
+
+				if (ELEM(ar->regiontype,
+						  RGN_TYPE_UI,
+						  RGN_TYPE_PREVIEW,
+						  RGN_TYPE_HEADER,
+						  RGN_TYPE_TOOLS)) {
+					ar->flag |= RGN_FLAG_HIDDEN;
+				}
+			}
+
+			sa->full = oldscreen;
+			newa->full = oldscreen;
+		}
+		else {
+			BLI_assert(false);
+		}
 
 		ED_screen_set(C, sc);
 	}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 7c7574b..cb689c0 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -129,7 +129,7 @@ static int screen_active_editable(bContext *C)
 {
 	if (ED_operator_screenactive(C)) {
 		/* no full window splitting allowed */
-		if (CTX_wm_screen(C)->full != SCREENNORMAL)
+		if (CTX_wm_screen(C)->state != SCREENNORMAL)
 			return 0;
 		return 1;
 	}
@@ -1462,7 +1462,7 @@ static int area_split_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 	int dir;
 	
 	/* no full window splitting allowed */
-	if (sc->full != SCREENNORMAL)
+	if (sc->state != SCREENNORMAL)
 		return OPERATOR_CANCELLED;
 	
 	if (event->type == EVT_ACTIONZONE_AREA) {
@@ -2232,7 +2232,7 @@ static void SCREEN_OT_marker_jump(wmOperatorType *ot)
 static bool screen_set_is_ok(bScreen *screen, bScreen *screen_prev)
 {
 	return ((screen->winid == 0)    &&
-	        (screen->full == 0)     &&
+	        (screen->state == SCREENNORMAL)     &&
 	        (screen != screen_prev) &&
 	        (screen->id.name[2] != '.' || !(U.uiflag & USER_HIDE_DOT)));
 }
@@ -2303,10 +2303,13 @@ static void SCREEN_OT_screen_set(wmOperatorType *ot)
 
 
 /* function to be called outside UI context, or for r

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list