Commit 707fd9f071672b9ca86cda57917f5c0cacf258a9

Sam Lantinga 2014-06-04T10:56:30

Fixed bug where changing the window border would change the window size on Windows.

diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c
index 2aa1814..e08d029 100644
--- a/src/video/windows/SDL_windowsevents.c
+++ b/src/video/windows/SDL_windowsevents.c
@@ -665,7 +665,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
             style = GetWindowLong(hwnd, GWL_STYLE);
             /* DJM - according to the docs for GetMenu(), the
                return value is undefined if hwnd is a child window.
-               Aparently it's too difficult for MS to check
+               Apparently it's too difficult for MS to check
                inside their function, so I have to do it here.
              */
             menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL);
@@ -702,6 +702,10 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
             RECT rect;
             int x, y;
             int w, h;
+            
+            if (data->in_border_change) {
+                break;
+            }
 
             if (!GetClientRect(hwnd, &rect) || IsRectEmpty(&rect)) {
                 break;
diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c
index 38e97a7..8ff85a3 100644
--- a/src/video/windows/SDL_windowswindow.c
+++ b/src/video/windows/SDL_windowswindow.c
@@ -108,9 +108,9 @@ WIN_SetWindowPositionInternal(_THIS, SDL_Window * window, UINT flags)
     x = window->x + rect.left;
     y = window->y + rect.top;
 
-    data->expected_resize = TRUE;
-    SetWindowPos(hwnd, top, x, y, w, h, flags);
-    data->expected_resize = FALSE;
+    data->expected_resize = SDL_TRUE;
+    SetWindowPos( hwnd, top, x, y, w, h, flags );
+    data->expected_resize = SDL_FALSE;
 }
 
 static int
@@ -470,9 +470,9 @@ WIN_MaximizeWindow(_THIS, SDL_Window * window)
 {
     SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
     HWND hwnd = data->hwnd;
-    data->expected_resize = TRUE;
+    data->expected_resize = SDL_TRUE;
     ShowWindow(hwnd, SW_MAXIMIZE);
-    data->expected_resize = FALSE;
+    data->expected_resize = SDL_FALSE;
 }
 
 void
@@ -485,7 +485,8 @@ WIN_MinimizeWindow(_THIS, SDL_Window * window)
 void
 WIN_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered)
 {
-    HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
+    SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
+    HWND hwnd = data->hwnd;
     DWORD style = GetWindowLong(hwnd, GWL_STYLE);
 
     if (bordered) {
@@ -496,8 +497,10 @@ WIN_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered)
         style |= STYLE_BORDERLESS;
     }
 
-    SetWindowLong(hwnd, GWL_STYLE, style);
-    WIN_SetWindowPositionInternal(_this, window, SWP_NOCOPYBITS | SWP_FRAMECHANGED | SWP_NOREPOSITION | SWP_NOZORDER |SWP_NOACTIVATE | SWP_NOSENDCHANGING);
+    data->in_border_change = SDL_TRUE;
+    SetWindowLong( hwnd, GWL_STYLE, style );
+    WIN_SetWindowPositionInternal(_this, window, SWP_NOCOPYBITS | SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOACTIVATE);
+    data->in_border_change = SDL_FALSE;
 }
 
 void
@@ -505,9 +508,9 @@ WIN_RestoreWindow(_THIS, SDL_Window * window)
 {
     SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
     HWND hwnd = data->hwnd;
-    data->expected_resize = TRUE;
+    data->expected_resize = SDL_TRUE;
     ShowWindow(hwnd, SW_RESTORE);
-    data->expected_resize = FALSE;
+    data->expected_resize = SDL_FALSE;
 }
 
 void
@@ -553,9 +556,9 @@ WIN_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, 
         y = window->windowed.y + rect.top;
     }
     SetWindowLong(hwnd, GWL_STYLE, style);
-    data->expected_resize = TRUE;
+    data->expected_resize = SDL_TRUE;
     SetWindowPos(hwnd, top, x, y, w, h, SWP_NOCOPYBITS | SWP_NOACTIVATE);
-    data->expected_resize = FALSE;
+    data->expected_resize = SDL_FALSE;
 }
 
 int
diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h
index c428887..0da8682 100644
--- a/src/video/windows/SDL_windowswindow.h
+++ b/src/video/windows/SDL_windowswindow.h
@@ -37,7 +37,8 @@ typedef struct
     WNDPROC wndproc;
     SDL_bool created;
     WPARAM mouse_button_flags;
-    BOOL expected_resize;
+    SDL_bool expected_resize;
+    SDL_bool in_border_change;
     SDL_bool in_title_click;
     SDL_bool in_modal_loop;
     struct SDL_VideoData *videodata;