Module: wine Branch: master Commit: 9f23c3f9d5cba98117dadca03cb68145a01539f8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9f23c3f9d5cba98117dadca03c...
Author: Dmitry Timoshkov dmitry@codeweavers.com Date: Tue Feb 19 20:17:13 2008 +0800
user32: Add a z-order test for owned popup windows.
---
dlls/user32/tests/win.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 130 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 4be1d87..fefa2b2 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -54,6 +54,7 @@ static HHOOK hhook;
static const char* szAWRClass = "Winsize"; static HMENU hmenu; +static DWORD our_pid;
#define COUNTOF(arr) (sizeof(arr)/sizeof(arr[0]))
@@ -1724,6 +1725,7 @@ static void test_mdi(void) DispatchMessage(&msg); } */ + DestroyWindow(mdi_hwndMain); }
static void test_icons(void) @@ -1789,6 +1791,8 @@ static void test_icons(void) /* make sure the big icon hasn't changed */ res = (HICON)SendMessageA( hwnd, WM_GETICON, ICON_BIG, 0 ); ok( res == icon2, "wrong big icon after set %p/%p\n", res, icon2 ); + + DestroyWindow( hwnd ); }
static LRESULT WINAPI nccalcsize_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) @@ -2037,6 +2041,127 @@ static void test_children_zorder(HWND parent) test_window_tree(parent, complex_style_6, complex_order_6, 3); }
+#define check_z_order(hwnd, next, prev, owner, topmost) \ + check_z_order_debug((hwnd), (next), (prev), (owner), (topmost), \ + __FILE__, __LINE__) + +static void check_z_order_debug(HWND hwnd, HWND next, HWND prev, HWND owner, + BOOL topmost, const char *file, int line) +{ + HWND test; + DWORD ex_style; + + test = GetWindow(hwnd, GW_HWNDNEXT); + /* skip foreign windows */ + while (test && (GetWindowThreadProcessId(test, NULL) != our_pid || + UlongToHandle(GetWindowLongPtr(test, GWLP_HINSTANCE)) != GetModuleHandle(0))) + { + /*trace("skipping next %p (%p)\n", test, UlongToHandle(GetWindowLongPtr(test, GWLP_HINSTANCE)));*/ + test = GetWindow(test, GW_HWNDNEXT); + } + ok_(file, line)(next == test, "expected next %p, got %p\n", next, test); + + test = GetWindow(hwnd, GW_HWNDPREV); + /* skip foreign windows */ + while (test && (GetWindowThreadProcessId(test, NULL) != our_pid || + UlongToHandle(GetWindowLongPtr(test, GWLP_HINSTANCE)) != GetModuleHandle(0))) + { + /*trace("skipping prev %p (%p)\n", test, UlongToHandle(GetWindowLongPtr(test, GWLP_HINSTANCE)));*/ + test = GetWindow(test, GW_HWNDPREV); + } + ok_(file, line)(prev == test, "expected prev %p, got %p\n", prev, test); + + test = GetWindow(hwnd, GW_OWNER); + ok_(file, line)(owner == test, "expected owner %p, got %p\n", owner, test); + + ex_style = GetWindowLong(hwnd, GWL_EXSTYLE); + ok_(file, line)(!(ex_style & WS_EX_TOPMOST) == !topmost, "expected %stopmost\n", topmost ? "" : "NOT "); +} + +static void test_popup_zorder(HWND hwnd_D, HWND hwnd_E) +{ + HWND hwnd_A, hwnd_B, hwnd_C, hwnd_F; + + trace("hwnd_D %p, hwnd_E %p\n", hwnd_D, hwnd_E); + + SetWindowPos(hwnd_E, hwnd_D, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE); + + check_z_order(hwnd_D, hwnd_E, 0, 0, FALSE); + check_z_order(hwnd_E, 0, hwnd_D, 0, FALSE); + + hwnd_F = CreateWindowEx(0, "MainWindowClass", "Owner window", + WS_OVERLAPPED | WS_CAPTION, + 100, 100, 100, 100, + 0, 0, GetModuleHandle(0), NULL); + trace("hwnd_F %p\n", hwnd_F); + check_z_order(hwnd_F, hwnd_D, 0, 0, FALSE); + + SetWindowPos(hwnd_F, hwnd_E, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE); + check_z_order(hwnd_F, 0, hwnd_E, 0, FALSE); + check_z_order(hwnd_E, hwnd_F, hwnd_D, 0, FALSE); + check_z_order(hwnd_D, hwnd_E, 0, 0, FALSE); + + hwnd_C = CreateWindowEx(0, "MainWindowClass", NULL, + WS_POPUP, + 100, 100, 100, 100, + hwnd_F, 0, GetModuleHandle(0), NULL); + trace("hwnd_C %p\n", hwnd_C); + check_z_order(hwnd_F, 0, hwnd_E, 0, FALSE); + check_z_order(hwnd_E, hwnd_F, hwnd_D, 0, FALSE); + check_z_order(hwnd_D, hwnd_E, hwnd_C, 0, FALSE); + check_z_order(hwnd_C, hwnd_D, 0, hwnd_F, FALSE); + + hwnd_B = CreateWindowEx(WS_EX_TOPMOST, "MainWindowClass", NULL, + WS_POPUP, + 100, 100, 100, 100, + hwnd_F, 0, GetModuleHandle(0), NULL); + trace("hwnd_B %p\n", hwnd_B); + check_z_order(hwnd_F, 0, hwnd_E, 0, FALSE); + check_z_order(hwnd_E, hwnd_F, hwnd_D, 0, FALSE); + check_z_order(hwnd_D, hwnd_E, hwnd_C, 0, FALSE); + check_z_order(hwnd_C, hwnd_D, hwnd_B, hwnd_F, FALSE); + check_z_order(hwnd_B, hwnd_C, 0, hwnd_F, TRUE); + + hwnd_A = CreateWindowEx(WS_EX_TOPMOST, "MainWindowClass", NULL, + WS_POPUP, + 100, 100, 100, 100, + 0, 0, GetModuleHandle(0), NULL); + trace("hwnd_A %p\n", hwnd_A); + check_z_order(hwnd_F, 0, hwnd_E, 0, FALSE); + check_z_order(hwnd_E, hwnd_F, hwnd_D, 0, FALSE); + check_z_order(hwnd_D, hwnd_E, hwnd_C, 0, FALSE); + check_z_order(hwnd_C, hwnd_D, hwnd_B, hwnd_F, FALSE); + check_z_order(hwnd_B, hwnd_C, hwnd_A, hwnd_F, TRUE); + check_z_order(hwnd_A, hwnd_B, 0, 0, TRUE); + + trace("A %p B %p C %p D %p E %p F %p\n", hwnd_A, hwnd_B, hwnd_C, hwnd_D, hwnd_E, hwnd_F); + + /* move hwnd_F and its popups up */ + SetWindowPos(hwnd_F, HWND_TOP, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE); + check_z_order(hwnd_E, 0, hwnd_D, 0, FALSE); + check_z_order(hwnd_D, hwnd_E, hwnd_F, 0, FALSE); + check_z_order(hwnd_F, hwnd_D, hwnd_C, 0, FALSE); + check_z_order(hwnd_C, hwnd_F, hwnd_B, hwnd_F, FALSE); + check_z_order(hwnd_B, hwnd_C, hwnd_A, hwnd_F, TRUE); + check_z_order(hwnd_A, hwnd_B, 0, 0, TRUE); + + /* move hwnd_F and its popups down */ +#if 0 /* enable once Wine is fixed to pass this test */ + SetWindowPos(hwnd_F, HWND_BOTTOM, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE); + check_z_order(hwnd_F, 0, hwnd_C, 0, FALSE); + check_z_order(hwnd_C, hwnd_F, hwnd_B, hwnd_F, FALSE); + check_z_order(hwnd_B, hwnd_C, hwnd_E, hwnd_F, FALSE); + check_z_order(hwnd_E, hwnd_B, hwnd_D, 0, FALSE); + check_z_order(hwnd_D, hwnd_E, hwnd_A, 0, FALSE); + check_z_order(hwnd_A, hwnd_D, 0, 0, TRUE); +#endif + + DestroyWindow(hwnd_A); + DestroyWindow(hwnd_B); + DestroyWindow(hwnd_C); + DestroyWindow(hwnd_F); +} + static void test_vis_rgn( HWND hwnd ) { RECT win_rect, rgn_rect; @@ -4450,17 +4575,19 @@ START_TEST(win) WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP, 100, 100, 200, 200, - 0, 0, 0, NULL); + 0, 0, GetModuleHandle(0), NULL); test_nonclient_area(hwndMain);
hwndMain2 = CreateWindowExA(/*WS_EX_TOOLWINDOW*/ 0, "MainWindowClass", "Main window 2", WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP, 100, 100, 200, 200, - 0, 0, 0, NULL); + 0, 0, GetModuleHandle(0), NULL); assert( hwndMain ); assert( hwndMain2 );
+ our_pid = GetWindowThreadProcessId(hwndMain, NULL); + /* Add the tests below this line */ test_params();
@@ -4482,6 +4609,7 @@ START_TEST(win) test_SetForegroundWindow(hwndMain);
test_children_zorder(hwndMain); + test_popup_zorder(hwndMain2, hwndMain); test_keyboard_input(hwndMain); test_mouse_input(hwndMain); test_validatergn(hwndMain);