Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/screen')
-rw-r--r--source/blender/editors/screen/area.c26
-rw-r--r--source/blender/editors/screen/screen_edit.c41
-rw-r--r--source/blender/editors/screen/screen_ops.c47
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);