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