[Bf-blender-cvs] [2cd9a0ce5c3] blender2.8: Hide top-bar in fullscreen

Julian Eisel noreply at git.blender.org
Tue Apr 24 20:17:38 CEST 2018


Commit: 2cd9a0ce5c3785be3734d97446ff8470b22d6da7
Author: Julian Eisel
Date:   Tue Apr 24 19:59:48 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB2cd9a0ce5c3785be3734d97446ff8470b22d6da7

Hide top-bar in fullscreen

Fullscreen as in the Alt+F10 fullscreen.

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

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/screen/area.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/makesdna/DNA_screen_types.h
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 0f4fb6b8cc3..6d9b4af7c01 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -133,13 +133,17 @@ int     ED_area_global_size_y(const ScrArea *area);
 bool    ED_area_is_global(const ScrArea *area);
 int     ED_region_global_size_y(void);
 
-/** Iterate over all areas visible in the screen (screen as in everything visible in the window, not just bScreen) */
+ScrArea *ED_screen_areas_iter_first(const struct wmWindow *win, const bScreen *screen);
+ScrArea *ED_screen_areas_iter_next(const bScreen *screen, const ScrArea *area);
+/**
+ * Iterate over all areas visible in the screen (screen as in everything
+ * visible in the window, not just bScreen).
+ * \note Skips global areas with flag GLOBAL_AREA_IS_HIDDEN.
+ */
 #define ED_screen_areas_iter(win, screen, area_name)                       \
-	for (ScrArea *area_name = (win)->global_areas.areabase.first ?         \
-	                                  (win)->global_areas.areabase.first : \
-	                                  screen->areabase.first;              \
+	for (ScrArea *area_name = ED_screen_areas_iter_first(win, screen);     \
 	     area_name != NULL;                                                \
-	     area_name = (area_name == (win)->global_areas.areabase.last) ? (screen)->areabase.first : area_name->next)
+	     area_name = ED_screen_areas_iter_next(screen, area_name))
 #define ED_screen_verts_iter(win, screen, vert_name)                       \
 	for (ScrVert *vert_name = (win)->global_areas.vertbase.first ?         \
 	                                  (win)->global_areas.vertbase.first : \
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 00b70dc9f66..678c3281335 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -710,7 +710,7 @@ static void fullscreen_azone_initialize(ScrArea *sa, ARegion *ar)
 {
 	AZone *az;
 
-	if (ar->regiontype != RGN_TYPE_WINDOW)
+	if (ED_area_is_global(sa) || (ar->regiontype != RGN_TYPE_WINDOW))
 		return;
 
 	az = (AZone *)MEM_callocN(sizeof(AZone), "fullscreen action zone");
@@ -1480,7 +1480,11 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
 	const int window_size_y = WM_window_pixels_y(win);
 	ARegion *ar;
 	rcti rect;
-	
+
+	if (ED_area_is_global(sa) && (sa->global->flag & GLOBAL_AREA_IS_HIDDEN)) {
+		return;
+	}
+
 	/* set typedefinitions */
 	sa->type = BKE_spacetype_from_id(sa->spacetype);
 	
@@ -2200,6 +2204,34 @@ bool ED_area_is_global(const ScrArea *area)
 	return area->global != NULL;
 }
 
+ScrArea *ED_screen_areas_iter_first(const wmWindow *win, const bScreen *screen)
+{
+	ScrArea *global_area = win->global_areas.areabase.first;
+
+	if (!global_area) {
+		return screen->areabase.first;
+	}
+	else if ((global_area->global->flag & GLOBAL_AREA_IS_HIDDEN) == 0) {
+		return global_area;
+	}
+	/* Find next visible area. */
+	return ED_screen_areas_iter_next(screen, global_area);
+}
+ScrArea *ED_screen_areas_iter_next(const bScreen *screen, const ScrArea *area)
+{
+	if (area->global) {
+		for (ScrArea *area_iter = area->next; area_iter; area_iter = area_iter->next) {
+			if ((area_iter->global->flag & GLOBAL_AREA_IS_HIDDEN) == 0) {
+				return area_iter;
+			}
+		}
+		/* No visible next global area found, start iterating over layout areas. */
+		return screen->areabase.first;
+	}
+
+	return area->next;
+}
+
 /**
  * For now we just assume all global areas are made up out of horizontal bars
  * with the same size. A fixed size could be stored in ARegion instead if needed.
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 8db92855de6..ab58d4c8ebf 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -721,6 +721,9 @@ static void screen_vertices_scale(
 	/* Global areas have a fixed size that only changes with the DPI. Here we ensure that exactly this size is set.
 	 * TODO Assumes global area to be top-aligned. Should be made more generic */
 	for (ScrArea *area = win->global_areas.areabase.first; area; area = area->next) {
+		if (area->global->flag & GLOBAL_AREA_IS_HIDDEN) {
+			continue;
+		}
 		/* width */
 		area->v1->vec.x = area->v2->vec.x = 0;
 		area->v3->vec.x = area->v4->vec.x = window_size_x - 1;
@@ -1464,6 +1467,10 @@ ScrArea *ED_screen_state_toggle(bContext *C, wmWindow *win, ScrArea *sa, const s
 		}
 
 		if (state == SCREENFULL) {
+			/* unhide global areas */
+			for (ScrArea *glob_area = win->global_areas.areabase.first; glob_area; glob_area = glob_area->next) {
+				glob_area->global->flag &= ~GLOBAL_AREA_IS_HIDDEN;
+			}
 			/* restore the old side panels/header visibility */
 			for (ar = sa->regionbase.first; ar; ar = ar->next) {
 				ar->flag = ar->flagfullscreen;
@@ -1523,6 +1530,10 @@ ScrArea *ED_screen_state_toggle(bContext *C, wmWindow *win, ScrArea *sa, const s
 		newa->flag = sa->flag; /* mostly for AREA_FLAG_WASFULLSCREEN */
 
 		if (state == SCREENFULL) {
+			/* temporarily hide global areas */
+			for (ScrArea *glob_area = win->global_areas.areabase.first; glob_area; glob_area = glob_area->next) {
+				glob_area->global->flag |= GLOBAL_AREA_IS_HIDDEN;
+			}
 			/* temporarily hide the side panels/header */
 			for (ar = newa->regionbase.first; ar; ar = ar->next) {
 				ar->flagfullscreen = ar->flag;
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 73a9beb7ab5..a127ad0e2ab 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -240,9 +240,14 @@ typedef struct ScrGlobalAreaData {
 	 * if they are 'collapsed' or not. Value is set on area creation and not
 	 * touched afterwards. */
 	short size_min, size_max;
-	short pad;
+
+	short flag; /* GlobalAreaFlag */
 } ScrGlobalAreaData;
 
+enum GlobalAreaFlag {
+	GLOBAL_AREA_IS_HIDDEN = (1 << 0),
+};
+
 typedef struct ScrArea {
 	struct ScrArea *next, *prev;
 	
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 62f377e5f2e..85c2b5cdf7b 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -2107,7 +2107,9 @@ int WM_window_screen_pixels_y(const wmWindow *win)
 	short screen_size_y = WM_window_pixels_y(win);
 
 	for (ScrArea *sa = win->global_areas.areabase.first; sa; sa = sa->next) {
-		screen_size_y -= ED_area_global_size_y(sa);
+		if ((sa->global->flag & GLOBAL_AREA_IS_HIDDEN) == 0) {
+			screen_size_y -= ED_area_global_size_y(sa);
+		}
 	}
 
 	return screen_size_y;



More information about the Bf-blender-cvs mailing list