[2/2] comctl32: Fix message sequence when right-clicking a treeview (resend)

Daniel Jelinski djelinski1 at gmail.com
Sat May 19 12:46:34 CDT 2012


-------------- next part --------------
From eafa830ef871e5ca3150769a27eb3f366445dbc3 Mon Sep 17 00:00:00 2001
From: Daniel Jelinski <djelinski1 at gmail.com>
Date: Thu, 19 Apr 2012 22:02:25 +0200
Subject: comctl32: Fix message sequence when right-clicking a treeview

The message sequence obtained from testing native comctl32 was:
- first send NM_RCLICK
- then only if NM_RCLICK returned 0, send WM_CONTEXTMENU to parent
- send the above messages also when clicked below the last item
This fixes the issue described in bug 19222.
---
 dlls/comctl32/tests/treeview.c |    8 ++++----
 dlls/comctl32/treeview.c       |   36 ++++++++++--------------------------
 2 files changed, 14 insertions(+), 30 deletions(-)

diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c
index 4c0785f..113b9f5 100644
--- a/dlls/comctl32/tests/treeview.c
+++ b/dlls/comctl32/tests/treeview.c
@@ -1924,8 +1924,8 @@ static void test_mouse_rbutton(void)
     /* this sequence should NOT send WM_CONTEXTMENU */
     SendMessageA(hTree, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(1, 1));
 
-    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_rclick_nomenu_seq, "right click (parent, prevent WM_CONTEXTMENU)", TRUE);
-    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, tree_rclick_seq, "right click (tree)", TRUE);
+    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_rclick_nomenu_seq, "right click (parent, prevent WM_CONTEXTMENU)", FALSE);
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, tree_rclick_seq, "right click (tree)", FALSE);
 
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
@@ -1934,8 +1934,8 @@ static void test_mouse_rbutton(void)
     /* this sequence should send WM_CONTEXTMENU */
     SendMessageA(hTree, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(1, 1));
 
-    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_rclick_seq, "right click (parent, send WM_CONTEXTMENU)", TRUE);
-    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, tree_rclick_seq, "right click (tree)", TRUE);
+    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_rclick_seq, "right click (parent, send WM_CONTEXTMENU)", FALSE);
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, tree_rclick_seq, "right click (tree)", FALSE);
 
     /* apparently Windows determines whether item was dragged by looking at current cursor position,
     not the one reported by WM_MOUSEMOVE.*/
diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index 3f4fdc6..3c6f797 100644
--- a/dlls/comctl32/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -209,7 +209,6 @@ static VOID TREEVIEW_Invalidate(const TREEVIEW_INFO *, const TREEVIEW_ITEM *);
 static LRESULT TREEVIEW_DoSelectItem(TREEVIEW_INFO *, INT, HTREEITEM, INT);
 static VOID TREEVIEW_SetFirstVisible(TREEVIEW_INFO *, TREEVIEW_ITEM *, BOOL);
 static LRESULT TREEVIEW_EnsureVisible(TREEVIEW_INFO *, HTREEITEM, BOOL);
-static LRESULT TREEVIEW_RButtonUp(const TREEVIEW_INFO *, const POINT *);
 static LRESULT TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel);
 static VOID TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr);
 static LRESULT TREEVIEW_HScroll(TREEVIEW_INFO *, WPARAM);
@@ -4034,8 +4033,6 @@ TREEVIEW_TrackMouse(const TREEVIEW_INFO *infoPtr, POINT pt)
 	    else if (msg.message >= WM_LBUTTONDOWN &&
 		     msg.message <= WM_RBUTTONDBLCLK)
 	    {
-		if (msg.message == WM_RBUTTONUP)
-		    TREEVIEW_RButtonUp(infoPtr, &pt);
 		break;
 	    }
 
@@ -4250,31 +4247,18 @@ TREEVIEW_RButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam)
     }
     else
     {
-	SetFocus(infoPtr->hwnd);
-	TREEVIEW_SendSimpleNotify(infoPtr, NM_RCLICK);
-    }
-
-    return 0;
-}
-
-static LRESULT
-TREEVIEW_RButtonUp(const TREEVIEW_INFO *infoPtr, const POINT *pPt)
-{
-    TVHITTESTINFO ht;
-
-    ht.pt = *pPt;
-
-    TREEVIEW_HitTest(infoPtr, &ht);
-
-    if (ht.hItem)
-    {
-        /* Change to screen coordinate for WM_CONTEXTMENU */
-        ClientToScreen(infoPtr->hwnd, &ht.pt);
+        SetFocus(infoPtr->hwnd);
+        if (!TREEVIEW_SendSimpleNotify(infoPtr, NM_RCLICK))
+        {
+            /* Change to screen coordinate for WM_CONTEXTMENU */
+            ClientToScreen(infoPtr->hwnd, &ht.pt);
 
-        /* Send a WM_CONTEXTMENU message in response to the RBUTTONUP */
-        SendMessageW(infoPtr->hwnd, WM_CONTEXTMENU,
-            (WPARAM)infoPtr->hwnd, MAKELPARAM(ht.pt.x, ht.pt.y));
+            /* Send a WM_CONTEXTMENU message in response to the RBUTTONUP */
+            SendMessageW(infoPtr->hwndNotify, WM_CONTEXTMENU,
+                (WPARAM)infoPtr->hwnd, MAKELPARAM(ht.pt.x, ht.pt.y));
+        }
     }
+
     return 0;
 }
 
-- 
1.7.5.4


More information about the wine-patches mailing list