Module: wine Branch: master Commit: 56852a5eac44213258f46dc4f4fe4e38d58a560c URL: http://source.winehq.org/git/wine.git/?a=commit;h=56852a5eac44213258f46dc4f4...
Author: Dmitry Timoshkov dmitry@codeweavers.com Date: Sun Apr 8 19:28:05 2007 +0900
user32: Windows uses ptMaxTrackSize to set an initial window size not ptMaxSize.
---
dlls/user32/tests/win.c | 67 +++++++++++++++++++++++++++++++++++++------- dlls/winex11.drv/window.c | 11 +++++-- 2 files changed, 64 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 5502bf9..632fcc1 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -3718,8 +3718,36 @@ static void test_IsWindowUnicode(void) 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) { + WNDCLASS cls; HWND hwnd, parent; HMENU hmenu; RECT rc, rc_minmax; @@ -3917,8 +3945,20 @@ static void test_CreateWindow(void) ok(GetLastError() == ERROR_INVALID_MENU_HANDLE, "IsMenu set error %d\n", GetLastError());
/* 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); - 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); ok(parent != 0, "CreateWindowEx error %d\n", GetLastError()); expect_menu(parent, 0); @@ -3928,19 +3968,20 @@ static void test_CreateWindow(void) memset(&minmax, 0, sizeof(minmax)); SendMessage(parent, WM_GETMINMAXINFO, 0, (LPARAM)&minmax); 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); - ok(rc_minmax.left >= rc.left && rc_minmax.top >= rc.top && - 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); + ok(!IsRectEmpty(&rc), "parent client rect is empty\n"); + InflateRect(&rc, 200, 200); trace("creating child with rect (%d,%d-%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom);
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, parent, (HMENU)1, 0, NULL); ok(hwnd != 0, "CreateWindowEx error %d\n", GetLastError()); @@ -3948,10 +3989,12 @@ static void test_CreateWindow(void) expect_style(hwnd, WS_CHILD | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME); 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); - OffsetRect(&rc_minmax, -rc_minmax.left, -rc_minmax.top); + GetWindowRect(hwnd, &rc); + 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", rc.left, rc.top, rc.right, rc.bottom, rc_minmax.left, rc_minmax.top, rc_minmax.right, rc_minmax.bottom); @@ -3959,6 +4002,8 @@ static void test_CreateWindow(void) DestroyWindow(hwnd); DestroyWindow(parent);
+ UnregisterClass("MinMax_WndClass", GetModuleHandle(0)); + #undef expect_menu #undef expect_style #undef expect_ex_style diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index a31227f..a74c095 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1078,10 +1078,15 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode ) if ((cs->style & WS_THICKFRAME) || !(cs->style & (WS_POPUP | WS_CHILD))) { 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); + 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 */