Browse Source

Fixed Bug 3215 - Win32: 'fullscreen' app doesn't always extend to top of screen

David Ludwig 9 years ago
parent
commit
854cf7ac40

+ 4 - 0
src/video/windows/SDL_windowsevents.c

@@ -419,11 +419,15 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
                 SDL_ToggleModState(KMOD_CAPS, (GetKeyState(VK_CAPITAL) & 0x0001) != 0);
                 SDL_ToggleModState(KMOD_NUM, (GetKeyState(VK_NUMLOCK) & 0x0001) != 0);
             } else {
+                data->in_window_deactivation = SDL_TRUE;
+
                 if (SDL_GetKeyboardFocus() == data->window) {
                     SDL_SetKeyboardFocus(NULL);
                 }
 
                 ClipCursor(NULL);
+
+                data->in_window_deactivation = SDL_FALSE;
             }
         }
         returnCode = 0;

+ 18 - 0
src/video/windows/SDL_windowswindow.c

@@ -559,7 +559,25 @@ WIN_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display,
         y = bounds.y;
         w = bounds.w;
         h = bounds.h;
+
+        /* Unset the maximized flag.  This fixes
+           https://bugzilla.libsdl.org/show_bug.cgi?id=3215
+        */
+        if (style & WS_MAXIMIZE) {
+            data->windowed_mode_was_maximized = SDL_TRUE;
+            style &= ~WS_MAXIMIZE;
+        }
     } else {
+        /* Restore window-maximization state, as applicable.
+           Special care is taken to *not* do this if and when we're
+           alt-tab'ing away (to some other window; as indicated by
+           in_window_deactivation), otherwise
+           https://bugzilla.libsdl.org/show_bug.cgi?id=3215 can reproduce!
+        */
+        if (data->windowed_mode_was_maximized && !data->in_window_deactivation) {
+            style |= WS_MAXIMIZE;
+            data->windowed_mode_was_maximized = SDL_FALSE;
+        }
         rect.left = 0;
         rect.top = 0;
         rect.right = window->windowed.w;

+ 2 - 0
src/video/windows/SDL_windowswindow.h

@@ -42,6 +42,8 @@ typedef struct
     SDL_bool in_border_change;
     SDL_bool in_title_click;
     SDL_bool focus_click_pending;
+    SDL_bool windowed_mode_was_maximized;
+    SDL_bool in_window_deactivation;
     struct SDL_VideoData *videodata;
 #if SDL_VIDEO_OPENGL_EGL  
     EGLSurface egl_surface;