Module: wine Branch: master Commit: 86e4d1cdbe2bd0cff9474415caddb4b9491d0518 URL: http://source.winehq.org/git/wine.git/?a=commit;h=86e4d1cdbe2bd0cff9474415ca...
Author: Nikolay Sivov bunglehead@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); }