diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2018-04-24 20:59:48 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2018-04-24 21:16:44 +0300 |
commit | 2cd9a0ce5c3785be3734d97446ff8470b22d6da7 (patch) | |
tree | 24339a18224f636c14ba4ba6bb8ae0aa7e913758 | |
parent | 34d6b48c47aae25e26e7864ff66314b37669ebcc (diff) |
Hide top-bar in fullscreen
Fullscreen as in the Alt+F10 fullscreen.
-rw-r--r-- | source/blender/editors/include/ED_screen.h | 14 | ||||
-rw-r--r-- | source/blender/editors/screen/area.c | 36 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_edit.c | 11 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_screen_types.h | 7 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 4 |
5 files changed, 63 insertions, 9 deletions
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; |