Module: wine Branch: master Commit: 0e73e478ff3f8ee46fc18b1f1bf211b0dec80a2a URL: http://source.winehq.org/git/wine.git/?a=commit;h=0e73e478ff3f8ee46fc18b1f1b...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sun Feb 9 17:52:17 2014 +0400
comctl32/tab: Fix TCM_SETCURSEL on negative indices.
---
dlls/comctl32/tab.c | 27 +++++++++++++++++---------- dlls/comctl32/tests/tab.c | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 10 deletions(-)
diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c index 85467ba..a9c3b7b 100644 --- a/dlls/comctl32/tab.c +++ b/dlls/comctl32/tab.c @@ -252,22 +252,29 @@ static inline LRESULT TAB_SetCurSel (TAB_INFO *infoPtr, INT iItem)
TRACE("(%p %d)\n", infoPtr, iItem);
- if (iItem < 0) - infoPtr->iSelected = -1; - else if (iItem >= infoPtr->uNumItem) + if (iItem >= (INT)infoPtr->uNumItem) return -1; - else { - if (prevItem != iItem) { - if (prevItem != -1) - TAB_GetItem(infoPtr, prevItem)->dwState &= ~TCIS_BUTTONPRESSED; - TAB_GetItem(infoPtr, iItem)->dwState |= TCIS_BUTTONPRESSED;
+ if (prevItem != iItem) { + if (prevItem != -1) + TAB_GetItem(infoPtr, prevItem)->dwState &= ~TCIS_BUTTONPRESSED; + + if (iItem >= 0) + { + TAB_GetItem(infoPtr, iItem)->dwState |= TCIS_BUTTONPRESSED; infoPtr->iSelected = iItem; infoPtr->uFocus = iItem; - TAB_EnsureSelectionVisible(infoPtr); - TAB_InvalidateTabArea(infoPtr); } + else + { + infoPtr->iSelected = -1; + infoPtr->uFocus = -1; + } + + TAB_EnsureSelectionVisible(infoPtr); + TAB_InvalidateTabArea(infoPtr); } + return prevItem; }
diff --git a/dlls/comctl32/tests/tab.c b/dlls/comctl32/tests/tab.c index 9bfa386..7353ccd 100644 --- a/dlls/comctl32/tests/tab.c +++ b/dlls/comctl32/tests/tab.c @@ -746,6 +746,24 @@ static void test_cursel(void) ok (tcItem.dwState & TCIS_BUTTONPRESSED || broken(tcItem.dwState == 0), /* older comctl32 */ "Selected item should have TCIS_BUTTONPRESSED\n");
+ /* now deselect all and check previously selected item state */ + focusIndex = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(focusIndex == 1, "got %d\n", focusIndex); + + selectionIndex = SendMessageA(hTab, TCM_SETCURSEL, -1, 0); + ok(selectionIndex == 1, "got %d\n", selectionIndex); + + memset(&tcItem, 0, sizeof(TCITEMA)); + + /* focus is reset too */ + focusIndex = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(focusIndex == -1, "got %d\n", focusIndex); + + tcItem.mask = TCIF_STATE; + tcItem.dwStateMask = TCIS_BUTTONPRESSED; + SendMessageA(hTab, TCM_GETITEMA, selectionIndex, (LPARAM)&tcItem); + ok(tcItem.dwState == 0, "got state %d\n", tcItem.dwState); + DestroyWindow(hTab); }