Fixed bug where changing the window border would change the window size on Windows.
parent
1e00c03f14
commit
707fd9f071
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue