#7: Add new tests for various window creation/positioning behaviours
Dmitry Timoshkov
dmitry at baikal.ru
Thu Apr 1 08:42:19 CST 2004
Hello,
here are new tests on which all previous patches are based.
Please apply after #6.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Add new tests for various window creation/positioning behaviours.
--- cvs/hq/wine/dlls/user/tests/msg.c 2004-03-30 16:49:48.000000000 +0900
+++ wine/dlls/user/tests/msg.c 2004-04-01 22:24:23.000000000 +0900
@@ -88,7 +88,6 @@ static const struct message WmShowOverla
{ WM_MOVE, sent },
{ 0 }
};
-
/* DestroyWindow (for overlapped window) (32) */
static const struct message WmDestroyOverlappedSeq[] = {
{ HCBT_DESTROYWND, hook },
@@ -103,6 +102,55 @@ static const struct message WmDestroyOve
{ WM_NCDESTROY, sent },
{ 0 }
};
+/* CreateWindow (for a child popup window, not initially visible) */
+static const struct message WmCreateChildPopupSeq[] = {
+ { HCBT_CREATEWND, hook },
+ { WM_NCCREATE, sent },
+ { WM_NCCALCSIZE, sent|wparam, 0 },
+ { WM_CREATE, sent },
+ { WM_SIZE, sent },
+ { WM_MOVE, sent },
+ { 0 }
+};
+/* CreateWindow (for a popup window, not initially visible,
+ * which sets WS_VISIBLE in WM_CREATE handler)
+ */
+static const struct message WmCreateInvisiblePopupSeq[] = {
+ { HCBT_CREATEWND, hook },
+ { WM_NCCREATE, sent },
+ { WM_NCCALCSIZE, sent|wparam, 0 },
+ { WM_CREATE, sent },
+ { WM_STYLECHANGING, sent },
+ { WM_STYLECHANGED, sent },
+ { WM_SIZE, sent },
+ { WM_MOVE, sent },
+ { 0 }
+};
+/* ShowWindow (for a popup window with WS_VISIBLE style set) */
+static const struct message WmShowVisiblePopupSeq[] = {
+ { 0 }
+};
+/* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER)
+ * for a popup window with WS_VISIBLE style set
+ */
+static const struct message WmShowVisiblePopupSeq_2[] = {
+ { WM_WINDOWPOSCHANGING, sent|wparam, 0 },
+ { 0 }
+};
+/* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE)
+ * for a popup window with WS_VISIBLE style set
+ */
+static const struct message WmShowVisiblePopupSeq_3[] = {
+ { WM_WINDOWPOSCHANGING, sent|wparam, 0 },
+ { HCBT_ACTIVATE, hook },
+ { WM_WINDOWPOSCHANGING, sent|wparam, 0 },
+ { WM_NCACTIVATE, sent|wparam, 1 },
+ { WM_ACTIVATE, sent|wparam, 1 },
+ { HCBT_SETFOCUS, hook },
+ { WM_IME_SETCONTEXT, sent|optional },
+ { WM_SETFOCUS, sent|defwinproc },
+ { 0 }
+};
/* CreateWindow (for child window, not initially visible) */
static const struct message WmCreateChildSeq[] = {
{ HCBT_CREATEWND, hook },
@@ -454,7 +502,7 @@ static void test_messages(void)
ok (hwnd != 0, "Failed to create overlapped window\n");
ok_sequence(WmCreateOverlappedSeq, "CreateWindow:overlapped");
- ShowWindow(hwnd, TRUE);
+ ShowWindow(hwnd, SW_SHOW);
ok_sequence(WmShowOverlappedSeq, "ShowWindow:overlapped");
DestroyWindow(hwnd);
@@ -480,7 +528,7 @@ static void test_messages(void)
ok (hbutton != 0, "Failed to create button window\n");
flush_sequence();
- ShowWindow(hchild, TRUE);
+ ShowWindow(hchild, SW_SHOW);
ok_sequence(WmShowChildSeq, "ShowWindow:child");
SetFocus(hchild);
@@ -493,6 +541,51 @@ static void test_messages(void)
ok_sequence(WmDestroyChildSeq, "DestroyWindow:child");
DestroyWindow(hchild2);
DestroyWindow(hbutton);
+
+ flush_sequence();
+ hchild = CreateWindowExA(0, "TestWindowClass", "Test Child Popup", WS_CHILD | WS_POPUP,
+ 0, 0, 100, 100, hparent, 0, 0, NULL);
+ ok (hchild != 0, "Failed to create child popup window\n");
+ ok_sequence(WmCreateChildPopupSeq, "CreateWindow:child_popup");
+ DestroyWindow(hchild);
+
+ /* test what happens to a window which sets WS_VISIBLE in WM_CREATE */
+ flush_sequence();
+ hchild = CreateWindowExA(0, "TestPopupClass", "Test Popup", WS_POPUP,
+ 0, 0, 100, 100, hparent, 0, 0, NULL);
+ ok (hchild != 0, "Failed to create popup window\n");
+ ok_sequence(WmCreateInvisiblePopupSeq, "CreateWindow:invisible_popup");
+ ok(GetWindowLongA(hchild, GWL_STYLE) & WS_VISIBLE, "WS_VISIBLE should be set\n");
+ ok(IsWindowVisible(hchild), "IsWindowVisible() should return TRUE\n");
+ flush_sequence();
+ ShowWindow(hchild, SW_SHOW);
+ ok_sequence(WmShowVisiblePopupSeq, "CreateWindow:show_visible_popup");
+ flush_sequence();
+ SetWindowPos(hchild, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
+ ok_sequence(WmShowVisiblePopupSeq_2, "CreateWindow:show_visible_popup_2");
+ flush_sequence();
+ SetWindowPos(hchild, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);
+ ok_sequence(WmShowVisiblePopupSeq_3, "CreateWindow:show_visible_popup_3");
+ DestroyWindow(hchild);
+
+ /* this time add WS_VISIBLE for CreateWindowEx, but this fact actually
+ * changes nothing in message sequences.
+ */
+ flush_sequence();
+ hchild = CreateWindowExA(0, "TestPopupClass", "Test Popup", WS_POPUP | WS_VISIBLE,
+ 0, 0, 100, 100, hparent, 0, 0, NULL);
+ ok (hchild != 0, "Failed to create popup window\n");
+ ok_sequence(WmCreateInvisiblePopupSeq, "CreateWindow:invisible_popup");
+ ok(GetWindowLongA(hchild, GWL_STYLE) & WS_VISIBLE, "WS_VISIBLE should be set\n");
+ ok(IsWindowVisible(hchild), "IsWindowVisible() should return TRUE\n");
+ flush_sequence();
+ ShowWindow(hchild, SW_SHOW);
+ ok_sequence(WmShowVisiblePopupSeq, "CreateWindow:show_visible_popup");
+ flush_sequence();
+ SetWindowPos(hchild, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
+ ok_sequence(WmShowVisiblePopupSeq_2, "CreateWindow:show_visible_popup_2");
+ DestroyWindow(hchild);
+
DestroyWindow(hparent);
flush_sequence();
@@ -507,7 +600,7 @@ static void test_messages(void)
ok_sequence(WmSetMenuNonVisibleSizeChangeSeq, "SetMenu:NonVisibleSizeChange");
ok (SetMenu(hwnd, 0), "SetMenu");
ok_sequence(WmSetMenuNonVisibleNoSizeChangeSeq, "SetMenu:NonVisibleNoSizeChange");
- ShowWindow(hwnd, TRUE);
+ ShowWindow(hwnd, SW_SHOW);
flush_sequence();
ok (SetMenu(hwnd, 0), "SetMenu");
ok_sequence(WmSetMenuVisibleNoSizeChangeSeq, "SetMenu:VisibleNoSizeChange");
@@ -532,11 +625,32 @@ static LRESULT WINAPI MsgCheckProcA(HWND
return DefWindowProcA(hwnd, message, wParam, lParam);
}
+static LRESULT WINAPI PopupMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ struct message msg;
+
+ trace("popup: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam);
+
+ msg.message = message;
+ msg.flags = sent|wparam|lparam;
+ msg.wParam = wParam;
+ msg.lParam = lParam;
+ add_message(&msg);
+
+ if (message == WM_CREATE)
+ {
+ DWORD style = GetWindowLongA(hwnd, GWL_STYLE) | WS_VISIBLE;
+ SetWindowLongA(hwnd, GWL_STYLE, style);
+ }
+
+ return DefWindowProcA(hwnd, message, wParam, lParam);
+}
+
static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
struct message msg;
- trace("%p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam);
+ trace("parent: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam);
if (message == WM_PARENTNOTIFY)
{
@@ -564,33 +678,18 @@ static BOOL RegisterWindowClasses(void)
cls.hbrBackground = GetStockObject(WHITE_BRUSH);
cls.lpszMenuName = NULL;
cls.lpszClassName = "TestWindowClass";
+ if(!RegisterClassA(&cls)) return FALSE;
+ cls.lpfnWndProc = PopupMsgCheckProcA;
+ cls.lpszClassName = "TestPopupClass";
if(!RegisterClassA(&cls)) return FALSE;
- cls.style = 0;
cls.lpfnWndProc = ParentMsgCheckProcA;
- cls.cbClsExtra = 0;
- cls.cbWndExtra = 0;
- cls.hInstance = GetModuleHandleA(0);
- cls.hIcon = 0;
- cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);
- cls.hbrBackground = GetStockObject(WHITE_BRUSH);
- cls.lpszMenuName = NULL;
cls.lpszClassName = "TestParentClass";
-
if(!RegisterClassA(&cls)) return FALSE;
- cls.style = 0;
cls.lpfnWndProc = DefWindowProcA;
- cls.cbClsExtra = 0;
- cls.cbWndExtra = 0;
- cls.hInstance = GetModuleHandleA(0);
- cls.hIcon = 0;
- cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);
- cls.hbrBackground = GetStockObject(WHITE_BRUSH);
- cls.lpszMenuName = NULL;
cls.lpszClassName = "SimpleWindowClass";
-
if(!RegisterClassA(&cls)) return FALSE;
return TRUE;
@@ -608,6 +707,7 @@ static LRESULT CALLBACK cbt_hook_proc(in
{
if (!strcmp(buf, "TestWindowClass") ||
!strcmp(buf, "TestParentClass") ||
+ !strcmp(buf, "TestPopupClass") ||
!strcmp(buf, "SimpleWindowClass"))
{
struct message msg;
More information about the wine-patches
mailing list