Nikolay Sivov : comctl32/tab: Fix TCM_SETCURSEL on negative indices.
Alexandre Julliard
julliard at winehq.org
Mon Feb 10 13:06:55 CST 2014
Module: wine
Branch: master
Commit: 0e73e478ff3f8ee46fc18b1f1bf211b0dec80a2a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0e73e478ff3f8ee46fc18b1f1bf211b0dec80a2a
Author: Nikolay Sivov <nsivov at 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);
}
More information about the wine-cvs
mailing list