diff options
Diffstat (limited to 'source/blender/editors/screen')
-rw-r--r-- | source/blender/editors/screen/area.c | 26 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_edit.c | 41 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_ops.c | 47 |
3 files changed, 81 insertions, 33 deletions
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index ea56e9fd31b..d9d76e963a3 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -1089,30 +1089,11 @@ void ED_area_newspace(bContext *C, ScrArea *sa, int type) } } -void ED_area_prevspace(bContext *C) +void ED_area_prevspace(bContext *C, ScrArea *sa) { - SpaceLink *sl= CTX_wm_space_data(C); - ScrArea *sa= CTX_wm_area(C); - - /* cleanup */ -#if 0 // XXX needs to be space type specific - if(sfile->spacetype==SPACE_FILE) { - if(sfile->pupmenu) { - MEM_freeN(sfile->pupmenu); - sfile->pupmenu= NULL; - } - } -#endif + SpaceLink *sl = (sa) ? sa->spacedata.first : CTX_wm_space_data(C); if(sl->next) { - -#if 0 // XXX check whether this is still needed - if (sfile->spacetype == SPACE_SCRIPT) { - SpaceScript *sc = (SpaceScript *)sfile; - if (sc->script) sc->script->flags &=~SCRIPT_FILESEL; - } -#endif - /* workaround for case of double prevspace, render window with a file browser on top of it */ if(sl->next->spacetype == SPACE_FILE && sl->next->next) @@ -1193,7 +1174,8 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) ScrArea *sa= CTX_wm_area(C); int xco= 8; - xco= ED_area_header_switchbutton(C, block, yco); + if (!sa->full) + xco= ED_area_header_switchbutton(C, block, yco); uiBlockSetEmboss(block, UI_EMBOSSN); diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 1f6ce4fed73..6504ea4c2d5 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1312,7 +1312,13 @@ void ED_screen_delete(bContext *C, bScreen *sc) wmWindow *win= CTX_wm_window(C); bScreen *newsc; int delete= 1; - + + /* don't allow deleting temp fullscreens for now */ + if (sc->full == SCREENFULL) { + return; + } + + /* screen can only be in use by one window at a time, so as long as we are able to find a screen that is unused, we can safely assume ours is not in use anywhere an delete it */ @@ -1536,17 +1542,42 @@ int ED_screen_full_newspace(bContext *C, ScrArea *sa, int type) return 1; } -void ED_screen_full_prevspace(bContext *C) +void ED_screen_full_prevspace(bContext *C, ScrArea *sa) { wmWindow *win= CTX_wm_window(C); - ScrArea *sa= CTX_wm_area(C); - - ED_area_prevspace(C); + + ED_area_prevspace(C, sa); if(sa->full) ed_screen_fullarea(C, win, sa); } +/* restore a screen / area back to default operation, after temp fullscreen modes */ +void ED_screen_full_restore(bContext *C, ScrArea *sa) +{ + wmWindow *win= CTX_wm_window(C); + SpaceLink *sl = sa->spacedata.first; + + /* if fullscreen area has a secondary space (such as as file browser or fullscreen render + * overlaid on top of a existing setup) then return to the previous space */ + + if (sl->next) { + /* specific checks for space types */ + if (sl->spacetype == SPACE_IMAGE) { + SpaceImage *sima= sa->spacedata.first; + if (sima->flag & SI_PREVSPACE) + sima->flag &= ~SI_PREVSPACE; + if (sima->flag & SI_FULLWINDOW) + sima->flag &= ~SI_FULLWINDOW; + } + ED_screen_full_prevspace(C, sa); + } + /* otherwise just tile the area again */ + else { + ed_screen_fullarea(C, win, sa); + } +} + /* redraws: uses defines from stime->redraws * enable: 1 - forward on, -1 - backwards on, 0 - off */ diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 55e2ec6b540..b108e1bbd41 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -1544,10 +1544,10 @@ static int screen_set_exec(bContext *C, wmOperator *op) int tot= BLI_countlist(&CTX_data_main(C)->screen); int delta= RNA_int_get(op->ptr, "delta"); - /* this screen is 'fake', solve later XXX */ + /* return to previous state before switching screens */ if(sa && sa->full) - return OPERATOR_CANCELLED; - + ED_screen_full_restore(C, sa); + if(delta==1) { while(tot--) { screen= screen->id.next; @@ -3412,10 +3412,10 @@ static int render_view_cancel_exec(bContext *C, wmOperator *unused) if(sima->flag & SI_FULLWINDOW) { sima->flag &= ~SI_FULLWINDOW; - ED_screen_full_prevspace(C); + ED_screen_full_prevspace(C, sa); } else - ED_area_prevspace(C); + ED_area_prevspace(C, sa); return OPERATOR_FINISHED; } @@ -3459,7 +3459,7 @@ static int render_view_show_invoke(bContext *C, wmOperator *unused, wmEvent *eve if(sima->flag & SI_FULLWINDOW) { sima->flag &= ~SI_FULLWINDOW; - ED_screen_full_prevspace(C); + ED_screen_full_prevspace(C, sa); } else if(sima->next) { ED_area_newspace(C, sa, sima->next->spacetype); @@ -3486,6 +3486,40 @@ static void SCREEN_OT_render_view_show(struct wmOperatorType *ot) ot->poll= ED_operator_screenactive; } +/* *********************** generic fullscreen 'back' button *************** */ + + +static int fullscreen_back_exec(bContext *C, wmOperator *op) +{ + bScreen *screen = CTX_wm_screen(C); + ScrArea *sa=NULL; + + /* search current screen for 'fullscreen' areas */ + for (sa=screen->areabase.first; sa; sa=sa->next) { + if (sa->full) break; + } + if (!sa) { + BKE_report(op->reports, RPT_ERROR, "No fullscreen areas were found."); + return OPERATOR_CANCELLED; + } + + ED_screen_full_restore(C, sa); + + return OPERATOR_FINISHED; +} + +static void SCREEN_OT_back_to_previous(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Back to Previous Screen"; + ot->description= "Revert back to the original screen layout, before fullscreen area overlay."; + ot->idname= "SCREEN_OT_back_to_previous"; + + /* api callbacks */ + ot->exec= fullscreen_back_exec; + ot->poll= ED_operator_screenactive; +} + /* *********** show user pref window ****** */ static int userpref_show_invoke(bContext *C, wmOperator *unused, wmEvent *event) @@ -3672,6 +3706,7 @@ void ED_operatortypes_screen(void) WM_operatortype_append(SCREEN_OT_header_toolbox); WM_operatortype_append(SCREEN_OT_screen_set); WM_operatortype_append(SCREEN_OT_screen_full_area); + WM_operatortype_append(SCREEN_OT_back_to_previous); WM_operatortype_append(SCREEN_OT_screenshot); WM_operatortype_append(SCREEN_OT_screencast); WM_operatortype_append(SCREEN_OT_userpref_show); |