Commit: c6d28a94bee211c1d1ce41f364f5c026c4d759f0
Author: Campbell Barton
Date:   Tue Jan 13 01:40:14 2015 +1100
Branches: master
https://developer.blender.org/rBc6d28a94bee211c1d1ce41f364f5c026c4d759f0

Fix T42754: File-Selector lost on fullscreen exit

There  was a hard-coded check to exit the fileselector when restoring a view.

Now, when space types differ, flag areas as temporary and switch back to the 
previous type only in this case.
This means you can select a file while having a file-selector space type open, 
and not loose it every time.

===================================================================

M       source/blender/editors/include/ED_screen.h
M       source/blender/editors/screen/screen_edit.c
M       source/blender/makesdna/DNA_screen_types.h
M       source/blender/windowmanager/intern/wm_event_system.c

===================================================================

diff --git a/source/blender/editors/include/ED_screen.h 
b/source/blender/editors/include/ED_screen.h
index ed24656..b790c65 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -107,6 +107,7 @@ void    ED_screen_set_subwinactive(struct bContext *C, 
struct wmEvent *event);
 void    ED_screen_exit(struct bContext *C, struct wmWindow *window, struct 
bScreen *screen);
 void    ED_screen_animation_timer(struct bContext *C, int redraws, int 
refresh, int sync, int enable);
 void    ED_screen_animation_timer_update(struct bScreen *screen, int redraws, 
int refresh);
+void    ED_screen_retore_temp_type(struct bContext *C, ScrArea *sa, bool 
is_screen_change);
 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);
diff --git a/source/blender/editors/screen/screen_edit.c 
b/source/blender/editors/screen/screen_edit.c
index c179cfc..3f81408 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1748,6 +1748,13 @@ ScrArea *ED_screen_full_newspace(bContext *C, ScrArea 
*sa, int type)
                }
        }
        
+       if (sa && (sa->spacetype != type)) {
+               newsa->flag |= AREA_FLAG_TEMP_TYPE;
+       }
+       else {
+               newsa->flag &= ~AREA_FLAG_TEMP_TYPE;
+       }
+
        ED_area_newspace(C, newsa, type);
        
        return newsa;
@@ -1763,6 +1770,21 @@ void ED_screen_full_prevspace(bContext *C, ScrArea *sa)
                ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED);
 }
 
+void ED_screen_retore_temp_type(bContext *C, ScrArea *sa, bool 
is_screen_change)
+{
+       /* incase nether functions below run */
+       ED_area_tag_redraw(sa);
+
+       if (sa->flag & AREA_FLAG_TEMP_TYPE) {
+               ED_area_prevspace(C, sa);
+               sa->flag &= ~AREA_FLAG_TEMP_TYPE;
+       }
+
+       if (is_screen_change && sa->full) {
+               ED_screen_state_toggle(C, CTX_wm_window(C), sa, 
SCREENMAXIMIZED);
+       }
+}
+
 /* restore a screen / area back to default operation, after temp fullscreen 
modes */
 void ED_screen_full_restore(bContext *C, ScrArea *sa)
 {
@@ -1789,12 +1811,14 @@ void ED_screen_full_restore(bContext *C, ScrArea *sa)
                        else
                                ED_screen_state_toggle(C, win, sa, state);
                }
-               else if (sl->spacetype == SPACE_FILE) {
+               else if (sa->flag & AREA_FLAG_TEMP_TYPE) {
                        ED_screen_full_prevspace(C, sa);
                }
                else {
                        ED_screen_state_toggle(C, win, sa, state);
                }
+
+               sa->flag &= ~AREA_FLAG_TEMP_TYPE;
        }
        /* otherwise just tile the area again */
        else {
diff --git a/source/blender/makesdna/DNA_screen_types.h 
b/source/blender/makesdna/DNA_screen_types.h
index 47a08c6..941a7d0 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -272,12 +272,16 @@ typedef struct ARegion {
 // #define WIN_EQUAL           3  // UNUSED
 
 /* area->flag */
-#define HEADER_NO_PULLDOWN      (1 << 0)
-#define AREA_FLAG_DRAWJOINTO    (1 << 1)
-#define AREA_FLAG_DRAWJOINFROM  (1 << 2)
-#define AREA_TEMP_INFO          (1 << 3)
-#define AREA_FLAG_DRAWSPLIT_H   (1 << 4)
-#define AREA_FLAG_DRAWSPLIT_V   (1 << 5)
+enum {
+       HEADER_NO_PULLDOWN      = (1 << 0),
+       AREA_FLAG_DRAWJOINTO    = (1 << 1),
+       AREA_FLAG_DRAWJOINFROM  = (1 << 2),
+       AREA_TEMP_INFO          = (1 << 3),
+       AREA_FLAG_DRAWSPLIT_H   = (1 << 4),
+       AREA_FLAG_DRAWSPLIT_V   = (1 << 5),
+       /* used to check if we should switch back to prevspace (of a different 
type) */
+       AREA_FLAG_TEMP_TYPE         = (1 << 6),
+};
 
 #define EDGEWIDTH      1
 #define AREAGRID       4
diff --git a/source/blender/windowmanager/intern/wm_event_system.c 
b/source/blender/windowmanager/intern/wm_event_system.c
index e7b3de7..1fc1348 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1707,16 +1707,12 @@ static int wm_handler_fileselect_do(bContext *C, 
ListBase *handlers, wmEventHand
 
                        /* remlink now, for load file case before removing*/
                        BLI_remlink(handlers, handler);
-                               
+
                        if (val != EVT_FILESELECT_EXTERNAL_CANCEL) {
-                               if (screen != handler->filescreen) {
-                                       ED_screen_full_prevspace(C, 
CTX_wm_area(C));
-                               }
-                               else {
-                                       ED_area_prevspace(C, CTX_wm_area(C));
-                               }
+                               ScrArea *sa = CTX_wm_area(C);
+                               ED_screen_retore_temp_type(C, sa, screen != 
handler->filescreen);
                        }
-                               
+
                        wm_handler_op_context(C, handler);
 
                        /* needed for UI_popup_menu_reports */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to