From: Daniel Jelinski Subject: comctl32/listview: fix mouse message sequences Message-Id: Date: Sat, 23 Feb 2013 22:33:07 +0100 From c58f4db0d3459e885e1c2f97643bc90edf694318 Mon Sep 17 00:00:00 2001 From: Daniel Jelinski Date: Thu, 27 Sep 2012 21:04:46 +0200 Subject: [PATCH 2/2] comctl32/listview: fix mouse message sequences fixes bug 23774 and part of bug 9932 - allows selecting items in delphi listviews with DragMode = dmAutomatic. Fixes two message sequences - when clicking on an item and when clicking between items. Still left to fix: marquee selection should also be done in LButtonDown. Not sure if any apps depend on this though. --- dlls/comctl32/listview.c | 76 +++++++++++++++++++++------------------------- 1 files changed, 35 insertions(+), 41 deletions(-) diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index a22b2da..9014640 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -463,6 +463,7 @@ static HIMAGELIST LISTVIEW_SetImageList(LISTVIEW_INFO *, INT, HIMAGELIST); static INT LISTVIEW_HitTest(const LISTVIEW_INFO *, LPLVHITTESTINFO, BOOL, BOOL); static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *, BOOL, BOOL); static BOOL LISTVIEW_Scroll(LISTVIEW_INFO *, INT, INT); +static LRESULT LISTVIEW_LButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT y); /******** Text handling functions *************************************/ @@ -4081,46 +4082,6 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN infoPtr->nLButtonDownItem = -1; } - if (!infoPtr->bDragging) - { - ht.pt = infoPtr->ptClickPos; - LISTVIEW_HitTest(infoPtr, &ht, TRUE, TRUE); - - /* If the click is outside the range of an item, begin a - highlight. If not, begin an item drag. */ - if (ht.iItem == -1) - { - NMHDR hdr; - - /* If we're allowing multiple selections, send notification. - If return value is non-zero, cancel. */ - if (!(infoPtr->dwStyle & LVS_SINGLESEL) && (notify_hdr(infoPtr, LVN_MARQUEEBEGIN, &hdr) == 0)) - { - /* Store the absolute coordinates of the click */ - POINT offset; - LISTVIEW_GetOrigin(infoPtr, &offset); - - infoPtr->marqueeOrigin.x = infoPtr->ptClickPos.x - offset.x; - infoPtr->marqueeOrigin.y = infoPtr->ptClickPos.y - offset.y; - - /* Begin selection and capture mouse */ - infoPtr->bMarqueeSelect = TRUE; - SetCapture(infoPtr->hwndSelf); - } - } - else - { - NMLISTVIEW nmlv; - - ZeroMemory(&nmlv, sizeof(nmlv)); - nmlv.iItem = ht.iItem; - nmlv.ptAction = infoPtr->ptClickPos; - - notify_listview(infoPtr, LVN_BEGINDRAG, &nmlv); - infoPtr->bDragging = TRUE; - } - } - return 0; } } @@ -10178,6 +10139,19 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, IN if (infoPtr->dwLvExStyle & LVS_EX_ONECLICKACTIVATE) if(lvHitTestInfo.iItem != -1) notify_itemactivate(infoPtr,&lvHitTestInfo); + if (LISTVIEW_TrackMouse(infoPtr, pt)) + { + NMLISTVIEW nmlv; + + ZeroMemory(&nmlv, sizeof(nmlv)); + nmlv.iItem = lvHitTestInfo.iItem; + nmlv.ptAction = infoPtr->ptClickPos; + + notify_listview(infoPtr, LVN_BEGINDRAG, &nmlv); + infoPtr->bDragging = TRUE; + } + else + LISTVIEW_LButtonUp(infoPtr,0,x,y); } else { @@ -10187,7 +10161,27 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, IN /* remove all selections */ if (!(wKey & MK_CONTROL) && !(wKey & MK_SHIFT)) LISTVIEW_DeselectAll(infoPtr); - ReleaseCapture(); + if (!(infoPtr->dwStyle & LVS_SINGLESEL) && LISTVIEW_TrackMouse(infoPtr, pt)) + { + NMHDR hdr; + /* If we're allowing multiple selections, send notification. + If return value is non-zero, cancel. */ + if (notify_hdr(infoPtr, LVN_MARQUEEBEGIN, &hdr) == 0) + { + /* Store the absolute coordinates of the click */ + POINT offset; + LISTVIEW_GetOrigin(infoPtr, &offset); + + infoPtr->marqueeOrigin.x = infoPtr->ptClickPos.x - offset.x; + infoPtr->marqueeOrigin.y = infoPtr->ptClickPos.y - offset.y; + + /* Begin selection and capture mouse */ + infoPtr->bMarqueeSelect = TRUE; + SetCapture(infoPtr->hwndSelf); + } + } + else + LISTVIEW_LButtonUp(infoPtr,0,x,y); } return 0; -- 1.7.5.4