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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-blender-cvs
