Commit 56852a5e authored by Dmitry Timoshkov's avatar Dmitry Timoshkov Committed by Alexandre Julliard

user32: Windows uses ptMaxTrackSize to set an initial window size not ptMaxSize.

parent aef2edb0
...@@ -3718,8 +3718,36 @@ static void test_IsWindowUnicode(void) ...@@ -3718,8 +3718,36 @@ static void test_IsWindowUnicode(void)
DestroyWindow(hwnd); DestroyWindow(hwnd);
} }
static LRESULT CALLBACK minmax_wnd_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
MINMAXINFO *minmax;
if (msg != WM_GETMINMAXINFO)
return DefWindowProc(hwnd, msg, wp, lp);
minmax = (MINMAXINFO *)lp;
if ((GetWindowLong(hwnd, GWL_STYLE) & WS_CHILD))
{
minmax->ptReserved.x = 0;
minmax->ptReserved.y = 0;
minmax->ptMaxSize.x = 400;
minmax->ptMaxSize.y = 400;
minmax->ptMaxPosition.x = 300;
minmax->ptMaxPosition.y = 300;
minmax->ptMaxTrackSize.x = 200;
minmax->ptMaxTrackSize.y = 200;
minmax->ptMinTrackSize.x = 100;
minmax->ptMinTrackSize.y = 100;
}
else
DefWindowProc(hwnd, msg, wp, lp);
return 1;
}
static void test_CreateWindow(void) static void test_CreateWindow(void)
{ {
WNDCLASS cls;
HWND hwnd, parent; HWND hwnd, parent;
HMENU hmenu; HMENU hmenu;
RECT rc, rc_minmax; RECT rc, rc_minmax;
...@@ -3917,8 +3945,20 @@ static void test_CreateWindow(void) ...@@ -3917,8 +3945,20 @@ static void test_CreateWindow(void)
ok(GetLastError() == ERROR_INVALID_MENU_HANDLE, "IsMenu set error %d\n", GetLastError()); ok(GetLastError() == ERROR_INVALID_MENU_HANDLE, "IsMenu set error %d\n", GetLastError());
/* test child window sizing */ /* test child window sizing */
cls.style = 0;
cls.lpfnWndProc = minmax_wnd_proc;
cls.cbClsExtra = 0;
cls.cbWndExtra = 0;
cls.hInstance = GetModuleHandle(0);
cls.hIcon = 0;
cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);
cls.hbrBackground = GetStockObject(WHITE_BRUSH);
cls.lpszMenuName = NULL;
cls.lpszClassName = "MinMax_WndClass";
RegisterClass(&cls);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
parent = CreateWindowEx(0, "static", NULL, WS_CAPTION | WS_SYSMENU | WS_THICKFRAME, parent = CreateWindowEx(0, "MinMax_WndClass", NULL, WS_CAPTION | WS_SYSMENU | WS_THICKFRAME,
0, 0, 100, 100, 0, 0, 0, NULL); 0, 0, 100, 100, 0, 0, 0, NULL);
ok(parent != 0, "CreateWindowEx error %d\n", GetLastError()); ok(parent != 0, "CreateWindowEx error %d\n", GetLastError());
expect_menu(parent, 0); expect_menu(parent, 0);
...@@ -3928,19 +3968,20 @@ static void test_CreateWindow(void) ...@@ -3928,19 +3968,20 @@ static void test_CreateWindow(void)
memset(&minmax, 0, sizeof(minmax)); memset(&minmax, 0, sizeof(minmax));
SendMessage(parent, WM_GETMINMAXINFO, 0, (LPARAM)&minmax); SendMessage(parent, WM_GETMINMAXINFO, 0, (LPARAM)&minmax);
SetRect(&rc_minmax, 0, 0, minmax.ptMaxSize.x, minmax.ptMaxSize.y); SetRect(&rc_minmax, 0, 0, minmax.ptMaxSize.x, minmax.ptMaxSize.y);
ok(IsRectEmpty(&rc_minmax), "rc_minmax is not empty\n"); ok(IsRectEmpty(&rc_minmax), "ptMaxSize is not empty\n");
SetRect(&rc_minmax, 0, 0, minmax.ptMaxTrackSize.x, minmax.ptMaxTrackSize.y);
ok(IsRectEmpty(&rc_minmax), "ptMaxTrackSize is not empty\n");
GetWindowRect(parent, &rc);
ok(!IsRectEmpty(&rc), "parent window rect is empty\n");
GetClientRect(parent, &rc); GetClientRect(parent, &rc);
ok(rc_minmax.left >= rc.left && rc_minmax.top >= rc.top && ok(!IsRectEmpty(&rc), "parent client rect is empty\n");
rc_minmax.right <= rc.right && rc_minmax.bottom <= rc.bottom,
"rc_minmax (%d,%d-%d,%d) is not within of parent client rect (%d,%d-%d,%d)\n",
rc_minmax.left, rc_minmax.top, rc_minmax.right, rc_minmax.bottom,
rc.left, rc.top, rc.right, rc.bottom);
InflateRect(&rc, 200, 200); InflateRect(&rc, 200, 200);
trace("creating child with rect (%d,%d-%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); trace("creating child with rect (%d,%d-%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom);
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
hwnd = CreateWindowEx(0, "static", NULL, WS_CHILD | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME, hwnd = CreateWindowEx(0, "MinMax_WndClass", NULL, WS_CHILD | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME,
rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
parent, (HMENU)1, 0, NULL); parent, (HMENU)1, 0, NULL);
ok(hwnd != 0, "CreateWindowEx error %d\n", GetLastError()); ok(hwnd != 0, "CreateWindowEx error %d\n", GetLastError());
...@@ -3948,10 +3989,12 @@ static void test_CreateWindow(void) ...@@ -3948,10 +3989,12 @@ static void test_CreateWindow(void)
expect_style(hwnd, WS_CHILD | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME); expect_style(hwnd, WS_CHILD | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME);
expect_ex_style(hwnd, WS_EX_WINDOWEDGE); expect_ex_style(hwnd, WS_EX_WINDOWEDGE);
OffsetRect(&rc, -rc.left, -rc.top); memset(&minmax, 0, sizeof(minmax));
SendMessage(hwnd, WM_GETMINMAXINFO, 0, (LPARAM)&minmax);
SetRect(&rc_minmax, 0, 0, minmax.ptMaxTrackSize.x, minmax.ptMaxTrackSize.y);
GetWindowRect(hwnd, &rc_minmax); GetWindowRect(hwnd, &rc);
OffsetRect(&rc_minmax, -rc_minmax.left, -rc_minmax.top); OffsetRect(&rc, -rc.left, -rc.top);
ok(EqualRect(&rc, &rc_minmax), "rects don't match: (%d,%d-%d,%d) and (%d,%d-%d,%d)\n", ok(EqualRect(&rc, &rc_minmax), "rects don't match: (%d,%d-%d,%d) and (%d,%d-%d,%d)\n",
rc.left, rc.top, rc.right, rc.bottom, rc.left, rc.top, rc.right, rc.bottom,
rc_minmax.left, rc_minmax.top, rc_minmax.right, rc_minmax.bottom); rc_minmax.left, rc_minmax.top, rc_minmax.right, rc_minmax.bottom);
...@@ -3959,6 +4002,8 @@ static void test_CreateWindow(void) ...@@ -3959,6 +4002,8 @@ static void test_CreateWindow(void)
DestroyWindow(hwnd); DestroyWindow(hwnd);
DestroyWindow(parent); DestroyWindow(parent);
UnregisterClass("MinMax_WndClass", GetModuleHandle(0));
#undef expect_menu #undef expect_menu
#undef expect_style #undef expect_style
#undef expect_ex_style #undef expect_ex_style
......
...@@ -1078,10 +1078,15 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode ) ...@@ -1078,10 +1078,15 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
if ((cs->style & WS_THICKFRAME) || !(cs->style & (WS_POPUP | WS_CHILD))) if ((cs->style & WS_THICKFRAME) || !(cs->style & (WS_POPUP | WS_CHILD)))
{ {
POINT maxSize, maxPos, minTrack, maxTrack; POINT maxSize, maxPos, minTrack, maxTrack;
/* Although Windows sends WM_GETMINMAXINFO at the window creation time,
* it doesn't use returned values to set window size.
*/
WINPOS_GetMinMaxInfo( hwnd, &maxSize, &maxPos, &minTrack, &maxTrack); WINPOS_GetMinMaxInfo( hwnd, &maxSize, &maxPos, &minTrack, &maxTrack);
if (maxTrack.x < cs->cx) cs->cx = maxTrack.x;
if (maxTrack.y < cs->cy) cs->cy = maxTrack.y;
if (cs->cx < 0) cs->cx = 0;
if (cs->cy < 0) cs->cy = 0;
SetRect( &rect, cs->x, cs->y, cs->x + cs->cx, cs->y + cs->cy );
if (!X11DRV_SetWindowPos( hwnd, 0, &rect, &rect, SWP_NOZORDER, NULL )) return FALSE;
} }
/* send WM_NCCREATE */ /* send WM_NCCREATE */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment