diff options
Diffstat (limited to 'source/blender/editors/screen/screen_ops.c')
-rw-r--r-- | source/blender/editors/screen/screen_ops.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 55e2ec6b540..87716190994 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; @@ -2418,7 +2418,7 @@ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event) ED_screen_animation_timer(C, stime->redraws, sync, mode); /* update region if TIME_REGION was set, to leftmost 3d window */ - ED_screen_animation_timer_update(C, stime->redraws); + ED_screen_animation_timer_update(screen, stime->redraws); } else { int redraws = TIME_REGION|TIME_ALL_3D_WIN; @@ -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); |