Navigation Menu

Skip to content

Commit

Permalink
Fixed bug where changing the window border would change the window si…
Browse files Browse the repository at this point in the history
…ze on Windows.
  • Loading branch information
slouken committed Jun 4, 2014
1 parent 1e00c03 commit 707fd9f
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 14 deletions.
6 changes: 5 additions & 1 deletion src/video/windows/SDL_windowsevents.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
27 changes: 15 additions & 12 deletions src/video/windows/SDL_windowswindow.c
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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) {
Expand All @@ -496,18 +497,20 @@ 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
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
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion src/video/windows/SDL_windowswindow.h
Expand Up @@ -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;
Expand Down

0 comments on commit 707fd9f

Please sign in to comment.