Nikolay Sivov : comctl32/listview: Fix hittesting for "small" positive Y coordinates.

Alexandre Julliard julliard at winehq.org
Tue Jul 7 08:08:18 CDT 2009


Module: wine
Branch: master
Commit: 86e4d1cdbe2bd0cff9474415caddb4b9491d0518
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=86e4d1cdbe2bd0cff9474415caddb4b9491d0518

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Tue Jul  7 03:28:53 2009 +0400

comctl32/listview: Fix hittesting for "small" positive Y coordinates.

---

 dlls/comctl32/listview.c       |   28 +++++++++++++++++++++-------
 dlls/comctl32/tests/listview.c |   18 +++++++++---------
 2 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 2a66152..24da77d 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -6814,6 +6814,16 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
         /* LVM_SUBITEMHITTEST checks left bound of possible client area */
         if (infoPtr->rcList.left > lpht->pt.x && Origin.x < lpht->pt.x)
 	    lpht->flags |= LVHT_TOLEFT;
+
+	if (lpht->pt.y < infoPtr->rcList.top && lpht->pt.y >= 0)
+	    opt.y = lpht->pt.y + infoPtr->rcList.top;
+	else
+	    opt.y = lpht->pt.y;
+
+	if (infoPtr->rcList.top > opt.y)
+	    lpht->flags |= LVHT_ABOVE;
+	else if (infoPtr->rcList.bottom < opt.y)
+	    lpht->flags |= LVHT_BELOW;
     }
     else
     {
@@ -6821,12 +6831,12 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
 	    lpht->flags |= LVHT_TOLEFT;
 	else if (infoPtr->rcList.right < lpht->pt.x)
 	    lpht->flags |= LVHT_TORIGHT;
+
+	if (infoPtr->rcList.top > lpht->pt.y)
+	    lpht->flags |= LVHT_ABOVE;
+	else if (infoPtr->rcList.bottom < lpht->pt.y)
+	    lpht->flags |= LVHT_BELOW;
     }
-    
-    if (infoPtr->rcList.top > lpht->pt.y)
-	lpht->flags |= LVHT_ABOVE;
-    else if (infoPtr->rcList.bottom < lpht->pt.y)
-	lpht->flags |= LVHT_BELOW;
 
     /* even if item is invalid try to find subitem */
     if (infoPtr->uView == LV_VIEW_DETAILS && subitem)
@@ -6883,8 +6893,12 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
     LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, NULL, &rcIcon, &rcState, &rcLabel);
     LISTVIEW_GetItemOrigin(infoPtr, iItem, &Position);
     opt.x = lpht->pt.x - Position.x - Origin.x;
-    opt.y = lpht->pt.y - Position.y - Origin.y;
-    
+
+    if (lpht->pt.y < infoPtr->rcList.top && lpht->pt.y >= 0)
+	opt.y = lpht->pt.y - Position.y - Origin.y + infoPtr->rcList.top;
+    else
+	opt.y = lpht->pt.y - Position.y - Origin.y;
+
     if (infoPtr->uView == LV_VIEW_DETAILS)
     {
 	rcBounds = rcBox;
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index 98c31c4..fd0e55c 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -2663,7 +2663,7 @@ static void test_hittest(void)
     test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
     y = (bounds.bottom - bounds.top) / 2;
     test_lvm_hittest(hwnd, x, y, -1, LVHT_TORIGHT, FALSE, TRUE, __LINE__);
-    test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE, __LINE__);
+    test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
     /* outside possible client rectangle (to right) */
     x = pos.x + 500;
     y = pos.y + (bounds.bottom - bounds.top) / 2;
@@ -2671,7 +2671,7 @@ static void test_hittest(void)
     test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE, __LINE__);
     y = (bounds.bottom - bounds.top) / 2;
     test_lvm_hittest(hwnd, x, y, -1, LVHT_TORIGHT, FALSE, TRUE, __LINE__);
-    test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, TRUE, __LINE__);
+    test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE, __LINE__);
     /* subitem returned with -1 item too */
     x = pos.x + 150;
     y = -10;
@@ -2684,7 +2684,7 @@ static void test_hittest(void)
     test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
     y = (bounds.bottom - bounds.top) / 2;
     test_lvm_hittest(hwnd, x, y, -1, LVHT_NOWHERE, FALSE, TRUE, __LINE__);
-    test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE, __LINE__);
+    test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
     /* the same with LVS_EX_FULLROWSELECT */
     SendMessage(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
     x = pos.x + 150; /* outside column */
@@ -2692,7 +2692,7 @@ static void test_hittest(void)
     test_lvm_hittest(hwnd, x, y, 0, LVHT_ONITEM, FALSE, FALSE, __LINE__);
     test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
     y = (bounds.bottom - bounds.top) / 2;
-    test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE, __LINE__);
+    test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
     MoveWindow(hwnd, 0, 0, 100, 100, FALSE);
     x = pos.x + 150; /* outside column */
     y = pos.y + (bounds.bottom - bounds.top) / 2;
@@ -2700,7 +2700,7 @@ static void test_hittest(void)
     test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
     y = (bounds.bottom - bounds.top) / 2;
     test_lvm_hittest(hwnd, x, y, -1, LVHT_TORIGHT, FALSE, TRUE, __LINE__);
-    test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE, __LINE__);
+    test_lvm_subitemhittest(hwnd, x, y, 0, 1, LVHT_ONITEMLABEL, FALSE, FALSE, FALSE, __LINE__);
     /* outside possible client rectangle (to right) */
     x = pos.x + 500;
     y = pos.y + (bounds.bottom - bounds.top) / 2;
@@ -2708,7 +2708,7 @@ static void test_hittest(void)
     test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE, __LINE__);
     y = (bounds.bottom - bounds.top) / 2;
     test_lvm_hittest(hwnd, x, y, -1, LVHT_TORIGHT, FALSE, TRUE, __LINE__);
-    test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, TRUE, __LINE__);
+    test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE, __LINE__);
     /* try with icons, state icons index is 1 based so at least 2 bitmaps needed */
     himl = ImageList_Create(16, 16, 0, 4, 4);
     ok(himl != NULL, "failed to create imagelist\n");
@@ -2736,7 +2736,7 @@ static void test_hittest(void)
     test_lvm_hittest(hwnd, x, y, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, __LINE__);
     test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, FALSE, __LINE__);
     y = (bounds.bottom - bounds.top) / 2;
-    test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, TRUE, FALSE, FALSE, __LINE__);
+    test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, FALSE, __LINE__);
 
     /* state icons indices are 1 based, check with valid index */
     item.mask = LVIF_STATE;
@@ -2752,7 +2752,7 @@ static void test_hittest(void)
     test_lvm_hittest(hwnd, x, y, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, __LINE__);
     test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, FALSE, __LINE__);
     y = (bounds.bottom - bounds.top) / 2;
-    test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, TRUE, FALSE, FALSE, __LINE__);
+    test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMSTATEICON, FALSE, FALSE, FALSE, __LINE__);
 
     himl2 = (HIMAGELIST)SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_STATE, (LPARAM)NULL);
     ok(himl2 == himl, "should return handle\n");
@@ -2765,7 +2765,7 @@ static void test_hittest(void)
     test_lvm_hittest(hwnd, x, y, 0, LVHT_ONITEMICON, FALSE, FALSE, __LINE__);
     test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMICON, FALSE, FALSE, FALSE, __LINE__);
     y = (bounds.bottom - bounds.top) / 2;
-    test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMICON, TRUE, FALSE, TRUE, __LINE__);
+    test_lvm_subitemhittest(hwnd, x, y, 0, 0, LVHT_ONITEMICON, FALSE, FALSE, FALSE, __LINE__);
 
     DestroyWindow(hwnd);
 }




More information about the wine-cvs mailing list