comctl32/tests: Added tests for listview right mouse click handling

Daniel Jelinski djelinski1 at gmail.com
Sat May 19 12:56:02 CDT 2012


-------------- next part --------------
From 66ddeb284a25b64cc49e31d4917893b1eaa4535c Mon Sep 17 00:00:00 2001
From: Daniel Jelinski <djelinski1 at gmail.com>
Date: Thu, 17 May 2012 22:53:55 +0200
Subject: comctl32/tests: Added tests for listview right mouse click handling

Current Wine implementation sends incorrect messages on right click. Added a test to reflect that.
---
 dlls/comctl32/tests/listview.c |  165 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index b96e85f..658c815 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -65,6 +65,8 @@ static BOOL g_disp_A_to_W;
 static NMLVDISPINFO g_editbox_disp_info;
 
 static HWND subclass_editbox(HWND hwndListview);
+/* value that NM_RCLICK should return */
+static int nm_rclick_result;
 
 static struct msg_sequence *sequences[NUM_MSG_SEQUENCES];
 
@@ -312,6 +314,62 @@ static const struct message listview_header_changed_seq[] = {
     { 0 }
 };
 
+static const struct message parent_rclick_seq[] = {
+    { WM_NOTIFY, sent|id, 0, 0, NM_RELEASEDCAPTURE },
+    { WM_NOTIFY, sent|id, 0, 0, LVN_ITEMCHANGING },
+    { WM_NOTIFY, sent|id, 0, 0, NM_RCLICK },
+    { WM_CONTEXTMENU, sent },
+    { 0 }
+};
+
+static const struct message parent_rclick_nomenu_seq[] = {
+    { WM_NOTIFY, sent|id, 0, 0, NM_RELEASEDCAPTURE },
+    { WM_NOTIFY, sent|id, 0, 0, LVN_ITEMCHANGING },
+    { WM_NOTIFY, sent|id, 0, 0, NM_RCLICK },
+    { 0 }
+};
+
+static const struct message listview_rclick_seq[] = {
+    { WM_RBUTTONDOWN, sent },
+    { WM_CAPTURECHANGED, sent|defwinproc },
+    { WM_CAPTURECHANGED, sent|defwinproc },
+    { WM_CONTEXTMENU, sent|defwinproc },
+    { 0 }
+};
+
+static const struct message listview_rclick_nomenu_seq[] = {
+    { WM_RBUTTONDOWN, sent },
+    { WM_CAPTURECHANGED, sent|defwinproc },
+    { WM_CAPTURECHANGED, sent|defwinproc },
+    { 0 }
+};
+
+static const struct message parent_rdrag_seq[] = {
+    { WM_NOTIFY, sent|id, 0, 0, NM_RELEASEDCAPTURE },
+    { WM_NOTIFY, sent|id, 0, 0, LVN_ITEMCHANGING },
+    { WM_NOTIFY, sent|id, 0, 0, LVN_ITEMCHANGING },
+    { WM_NOTIFY, sent|id, 0, 0, LVN_BEGINRDRAG },
+    { 0 }
+};
+
+static const struct message listview_rdrag_seq[] = {
+    { WM_RBUTTONDOWN, sent },
+    { WM_CAPTURECHANGED, sent|defwinproc },
+    { WM_CAPTURECHANGED, sent|defwinproc },
+    { 0 }
+};
+
+static const struct message parent_rdrop_seq[] = {
+    { WM_CONTEXTMENU, sent },
+    { 0 }
+};
+
+static const struct message listview_rdrop_seq[] = {
+    { WM_RBUTTONUP, sent },
+    { WM_CONTEXTMENU, sent|defwinproc },
+    { 0 }
+};
+
 static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
     static LONG defwndproc_counter = 0;
@@ -419,6 +477,8 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP
           case NM_HOVER:
               if (g_block_hover) return 1;
               break;
+	  case NM_RCLICK:
+	      return nm_rclick_result;
           }
           break;
       }
@@ -4875,6 +4935,110 @@ static void test_LVM_SETITEMTEXT(void)
     DestroyWindow(hwnd);
 }
 
+static void flush_message_queue(void)
+{
+    MSG msg;
+
+    while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+    {
+	TranslateMessage(&msg);
+	DispatchMessage(&msg);
+    }
+}
+
+static void test_mouse_rbutton(void)
+{
+    HWND hwnd;
+    INT r;
+    LVITEM item;
+    HIMAGELIST himl;
+    HBITMAP hbmp;
+    RECT r1;
+    POINT pt;
+    static CHAR hello[] = "hello";
+    INT cxDrag = GetSystemMetrics(SM_CXDRAG);
+    /* test report on Windows machine with cxDrag = 2 (NT4) indicates that 4 pixels are taken anyway.
+       On the other hand, description of SM_CXDRAG suggests that it should be used. */
+    cxDrag = cxDrag >= 4 ? cxDrag : 4;
+
+    himl = ImageList_Create(40, 40, 0, 4, 4);
+    ok(himl != NULL, "failed to create imagelist\n");
+
+    hbmp = CreateBitmap(40, 40, 1, 1, NULL);
+    ok(hbmp != NULL, "failed to create bitmap\n");
+
+    r = ImageList_Add(himl, hbmp, 0);
+    ok(r == 0, "should be zero\n");
+
+    hwnd = create_listview_control(0);
+    ok(hwnd != NULL, "failed to create listview window\n");
+    SetFocus(hwnd);
+
+    r = SendMessage(hwnd, LVM_SETIMAGELIST, 0, (LPARAM)himl);
+    ok(r == 0, "should return zero\n");
+
+    item.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_STATE;
+    item.iItem = 0;
+    item.iImage = 0;
+    item.iSubItem = 0;
+    item.state = LVIS_SELECTED|LVIS_FOCUSED;
+    item.pszText = hello;
+    r = SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM) &item);
+    ok(r == 0, "should not fail\n");
+
+    memset(&r1, 0, sizeof r1);
+    r1.left = LVIR_LABEL;
+    r = SendMessage(hwnd, LVM_GETITEMRECT, 0, (LPARAM) &r1);
+    expect(1, r);
+
+    flush_message_queue();
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+    /* WM_RBUTTONDOWN does not return until it gets another mouse event.
+    Make sure it gets one by posting WM_RBUTTONUP to message queue.
+    See comctl32/treeview.c TREEVIEW_TrackMouse for details */
+
+    /* this sequence should NOT send WM_CONTEXTMENU */
+    nm_rclick_result = 1;
+    PostMessageA(hwnd, WM_RBUTTONUP, 0, MAKELPARAM(r1.left, r1.top));
+    SendMessageA(hwnd, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(r1.left, r1.top));
+
+    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_rclick_nomenu_seq, "right click (parent, prevent WM_CONTEXTMENU)", TRUE);
+    ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_rclick_nomenu_seq, "right click (listview)", TRUE);
+
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+    /* this sequence should send WM_CONTEXTMENU */
+    nm_rclick_result = 0;
+    PostMessageA(hwnd, WM_RBUTTONUP, 0, MAKELPARAM(r1.left, r1.top));
+    SendMessageA(hwnd, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(r1.left, r1.top));
+
+    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_rclick_seq, "right click (parent, send WM_CONTEXTMENU)", TRUE);
+    ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_rclick_seq, "right click (listview)", TRUE);
+
+    /* now test dragging - rbuttondown, mousemove, rbuttonup */
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+    pt.x = r1.left;
+    pt.y = r1.top;
+    ClientToScreen(hwnd, &pt);
+    SetCursorPos(pt.x + cxDrag, pt.y);
+
+    PostMessageA(hwnd, WM_MOUSEMOVE, MK_RBUTTON, MAKELPARAM(r1.left + cxDrag, r1.top));
+    SendMessageA(hwnd, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(r1.left, r1.top));
+
+    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_rdrag_seq, "right drag (parent)", TRUE);
+    ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_rdrag_seq, "right drag (listview)", TRUE);
+
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+    SendMessageA(hwnd, WM_RBUTTONUP, 0, MAKELPARAM(r1.left + cxDrag, r1.top));
+
+    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_rdrop_seq, "right drop (parent)", TRUE);
+    ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_rdrop_seq, "right drop (listview)", FALSE);
+
+    DestroyWindow(hwnd);
+}
+
 START_TEST(listview)
 {
     HMODULE hComctl32;
@@ -4940,6 +5104,7 @@ START_TEST(listview)
     test_createdragimage();
     test_dispinfo();
     test_LVM_SETITEMTEXT();
+    test_mouse_rbutton();
 
     if (!load_v6_module(&ctx_cookie, &hCtx))
     {
-- 
1.7.5.4


More information about the wine-patches mailing list