Module: wine Branch: master Commit: febdb101e6baca0bc6110c40963056563febf6f1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=febdb101e6baca0bc6110c4096...
Author: Hugh McMaster hugh.mcmaster@outlook.com Date: Thu May 18 03:02:10 2017 +0000
comctl32/tests: Add tests for mouse right-click in a treeview control.
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/comctl32/tests/treeview.c | 79 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+)
diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c index 43de61c..e7ce92c 100644 --- a/dlls/comctl32/tests/treeview.c +++ b/dlls/comctl32/tests/treeview.c @@ -54,6 +54,21 @@ static BOOL g_v6; static struct msg_sequence *sequences[NUM_MSG_SEQUENCES]; static struct msg_sequence *item_sequence[1];
+static void flush_events(void) +{ + MSG msg; + int diff = 200; + int min_timeout = 100; + DWORD time = GetTickCount() + diff; + + while (diff > 0) + { + if (MsgWaitForMultipleObjects(0, NULL, FALSE, min_timeout, QS_ALLINPUT) == WAIT_TIMEOUT) break; + while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); + diff = time - GetTickCount(); + } +} + static const struct message FillRootSeq[] = { { TVM_INSERTITEMA, sent }, { TVM_INSERTITEMA, sent }, @@ -201,6 +216,13 @@ static const struct message test_get_set_unicodeformat_seq[] = { { 0 } };
+static const struct message test_right_click_seq[] = { + { WM_RBUTTONDOWN, sent|wparam, MK_RBUTTON }, + { WM_CAPTURECHANGED, sent|defwinproc }, + { TVM_GETNEXTITEM, sent|wparam|lparam|defwinproc, TVGN_CARET, 0 }, + { 0 } +}; + static const struct message parent_expand_seq[] = { { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA }, { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA }, @@ -342,6 +364,12 @@ static const struct message parent_vk_return_seq[] = { { 0 } };
+static const struct message parent_right_click_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, NM_RCLICK }, + { WM_CONTEXTMENU, sent }, + { 0 } +}; + static HWND hMainWnd;
static HTREEITEM hRoot, hChild; @@ -1296,6 +1324,13 @@ static LRESULT CALLBACK parent_wnd_proc(HWND hWnd, UINT message, WPARAM wParam, } break; } + case NM_RCLICK: + { + HTREEITEM selected = (HTREEITEM)SendMessageA(((NMHDR *)lParam)->hwndFrom, + TVM_GETNEXTITEM, TVGN_CARET, 0); + ok(selected == hChild, "child item should still be selected\n"); + break; + } } } break; @@ -2583,6 +2618,49 @@ todo_wine DestroyWindow(hwnd); }
+static void test_right_click(void) +{ + HWND hTree; + HTREEITEM selected; + RECT rc; + LRESULT result; + POINT pt; + + hTree = create_treeview_control(0); + fill_tree(hTree); + + SendMessageA(hTree, TVM_ENSUREVISIBLE, 0, (LPARAM)hChild); + SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hChild); + selected = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_CARET, 0); + ok(selected == hChild, "child item not selected\n"); + + *(HTREEITEM *)&rc = hRoot; + result = SendMessageA(hTree, TVM_GETITEMRECT, TRUE, (LPARAM)&rc); + ok(result, "TVM_GETITEMRECT failed\n"); + + flush_events(); + + pt.x = (rc.left + rc.right) / 2; + pt.y = (rc.top + rc.bottom) / 2; + ClientToScreen(hMainWnd, &pt); + + flush_events(); + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + PostMessageA(hTree, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(pt.x, pt.y)); + PostMessageA(hTree, WM_RBUTTONUP, 0, MAKELPARAM(pt.x, pt.y)); + + flush_events(); + + ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_right_click_seq, "right click sequence", FALSE); + ok_sequence(sequences, PARENT_SEQ_INDEX, parent_right_click_seq, "parent right click sequence", FALSE); + + selected = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_CARET, 0); + ok(selected == hChild, "child item should still be selected\n"); + + DestroyWindow(hTree); +} + START_TEST(treeview) { HMODULE hComctl32; @@ -2660,6 +2738,7 @@ START_TEST(treeview) test_WM_KEYDOWN(); test_TVS_FULLROWSELECT(); test_TVM_SORTCHILDREN(); + test_right_click();
if (!load_v6_module(&ctx_cookie, &hCtx)) {