https://git.reactos.org/?p=reactos.git;a=commitdiff;h=00f14ee1f22a1c285462459f859fa17c90ccc19f

commit 00f14ee1f22a1c285462459f859fa17c90ccc19f
Author:     Amine Khaldi <[email protected]>
AuthorDate: Sat Oct 26 22:51:10 2019 +0100
Commit:     Amine Khaldi <[email protected]>
CommitDate: Sat Oct 26 22:51:10 2019 +0100

    [COMCTL32] Sync listview.c and progress.c with Wine Staging 4.18. CORE-16441
---
 dll/win32/comctl32/listview.c | 154 ++++++++++++++++++++++++++----------------
 dll/win32/comctl32/progress.c |  31 +++++----
 2 files changed, 112 insertions(+), 73 deletions(-)

diff --git a/dll/win32/comctl32/listview.c b/dll/win32/comctl32/listview.c
index fb40d227df5..764a127f78b 100644
--- a/dll/win32/comctl32/listview.c
+++ b/dll/win32/comctl32/listview.c
@@ -124,9 +124,6 @@
  *   -- LVGroupComparE
  */
 
-#include "config.h"
-#include "wine/port.h"
-
 #include <assert.h>
 #include <ctype.h>
 #include <string.h>
@@ -145,7 +142,6 @@
 #include "uxtheme.h"
 
 #include "wine/debug.h"
-#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(listview);
 
@@ -211,6 +207,13 @@ typedef struct tagDELAYED_ITEM_EDIT
   INT iItem;
 } DELAYED_ITEM_EDIT;
 
+enum notification_mask
+{
+  NOTIFY_MASK_ITEM_CHANGE = 0x1,
+  NOTIFY_MASK_END_LABEL_EDIT = 0x2,
+  NOTIFY_MASK_UNMASK_ALL = 0xffffffff
+};
+
 typedef struct tagLISTVIEW_INFO
 {
   /* control window */
@@ -225,7 +228,7 @@ typedef struct tagLISTVIEW_INFO
   /* notification window */
   SHORT notifyFormat;
   HWND hwndNotify;
-  BOOL bDoChangeNotify;         /* send change notification messages? */
+  DWORD notify_mask;
   UINT uCallbackMask;
 
   /* tooltips */
@@ -993,7 +996,7 @@ static BOOL notify_dispinfoT(const LISTVIEW_INFO *infoPtr, 
UINT code, LPNMLVDISP
         }
         else if (return_unicode && (pdi->hdr.code == LVN_GETDISPINFOW))
         {
-            strcpyW(ret_text, pdi->item.pszText);
+            lstrcpyW(ret_text, pdi->item.pszText);
         }
         else if (return_ansi) /* note : pointer can be changed by app ! */
         {
@@ -1311,21 +1314,19 @@ static inline void iterator_destroy(const ITERATOR *i)
 /***
  * Create an empty iterator.
  */
-static inline BOOL iterator_empty(ITERATOR* i)
+static inline void iterator_empty(ITERATOR* i)
 {
     ZeroMemory(i, sizeof(*i));
     i->nItem = i->nSpecial = i->range.lower = i->range.upper = -1;
-    return TRUE;
 }
 
 /***
  * Create an iterator over a range.
  */
-static inline BOOL iterator_rangeitems(ITERATOR* i, RANGE range)
+static inline void iterator_rangeitems(ITERATOR* i, RANGE range)
 {
     iterator_empty(i);
     i->range = range;
-    return TRUE;
 }
 
 /***
@@ -1333,11 +1334,10 @@ static inline BOOL iterator_rangeitems(ITERATOR* i, 
RANGE range)
  * Please note that the iterator will take ownership of the ranges,
  * and will free them upon destruction.
  */
-static inline BOOL iterator_rangesitems(ITERATOR* i, RANGES ranges)
+static inline void iterator_rangesitems(ITERATOR* i, RANGES ranges)
 {
     iterator_empty(i);
     i->ranges = ranges;
-    return TRUE;
 }
 
 /***
@@ -1347,12 +1347,16 @@ static inline BOOL iterator_rangesitems(ITERATOR* i, 
RANGES ranges)
 static BOOL iterator_frameditems_absolute(ITERATOR* i, const LISTVIEW_INFO* 
infoPtr, const RECT *frame)
 {
     RECT rcItem, rcTemp;
-    
-    /* in case we fail, we want to return an empty iterator */
-    if (!iterator_empty(i)) return FALSE;
+    RANGES ranges;
 
     TRACE("(frame=%s)\n", wine_dbgstr_rect(frame));
 
+    /* in case we fail, we want to return an empty iterator */
+    iterator_empty(i);
+
+    if (infoPtr->nItemCount == 0)
+        return TRUE;
+
     if (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON)
     {
        INT nItem;
@@ -1363,7 +1367,8 @@ static BOOL iterator_frameditems_absolute(ITERATOR* i, 
const LISTVIEW_INFO* info
            if (IntersectRect(&rcTemp, &rcItem, frame))
                i->nSpecial = infoPtr->nFocusedItem;
        }
-       if (!(iterator_rangesitems(i, ranges_create(50)))) return FALSE;
+       if (!(ranges = ranges_create(50))) return FALSE;
+       iterator_rangesitems(i, ranges);
        /* to do better here, we need to have PosX, and PosY sorted */
        TRACE("building icon ranges:\n");
        for (nItem = 0; nItem < infoPtr->nItemCount; nItem++)
@@ -1387,7 +1392,7 @@ static BOOL iterator_frameditems_absolute(ITERATOR* i, 
const LISTVIEW_INFO* info
        range.lower = max(frame->top / infoPtr->nItemHeight, 0);
        range.upper = min((frame->bottom - 1) / infoPtr->nItemHeight, 
infoPtr->nItemCount - 1) + 1;
        if (range.upper <= range.lower) return TRUE;
-       if (!iterator_rangeitems(i, range)) return FALSE;
+       iterator_rangeitems(i, range);
        TRACE("    report=%s\n", debugrange(&i->range));
     }
     else
@@ -1419,7 +1424,8 @@ static BOOL iterator_frameditems_absolute(ITERATOR* i, 
const LISTVIEW_INFO* info
        
        if (nLastCol < nFirstCol || nLastRow < nFirstRow) return TRUE;
 
-       if (!(iterator_rangesitems(i, ranges_create(nLastCol - nFirstCol + 
1)))) return FALSE;
+       if (!(ranges = ranges_create(nLastCol - nFirstCol + 1))) return FALSE;
+       iterator_rangesitems(i, ranges);
        TRACE("building list ranges:\n");
        for (nCol = nFirstCol; nCol <= nLastCol; nCol++)
        {
@@ -1460,7 +1466,11 @@ static BOOL iterator_visibleitems(ITERATOR *i, const 
LISTVIEW_INFO *infoPtr, HDC
     INT rgntype;
     
     rgntype = GetClipBox(hdc, &rcClip);
-    if (rgntype == NULLREGION) return iterator_empty(i);
+    if (rgntype == NULLREGION)
+    {
+        iterator_empty(i);
+        return TRUE;
+    }
     if (!iterator_frameditems(i, infoPtr, &rcClip)) return FALSE;
     if (rgntype == SIMPLEREGION) return TRUE;
 
@@ -1746,7 +1756,9 @@ static inline void LISTVIEW_InvalidateItem(const 
LISTVIEW_INFO *infoPtr, INT nIt
 {
     RECT rcBox;
 
-    if(!is_redrawing(infoPtr)) return; 
+    if (!is_redrawing(infoPtr) || nItem < 0 || nItem >= infoPtr->nItemCount)
+        return;
+
     LISTVIEW_GetItemBox(infoPtr, nItem, &rcBox);
     LISTVIEW_InvalidateRect(infoPtr, &rcBox);
 }
@@ -1763,7 +1775,7 @@ static inline void LISTVIEW_InvalidateSubItem(const 
LISTVIEW_INFO *infoPtr, INT
     LISTVIEW_GetHeaderRect(infoPtr, nSubItem, &rcBox);
     rcBox.top = 0;
     rcBox.bottom = infoPtr->nItemHeight;
-    OffsetRect(&rcBox, Origin.x + Position.x, Origin.y + Position.y);
+    OffsetRect(&rcBox, Origin.x, Origin.y + Position.y);
     LISTVIEW_InvalidateRect(infoPtr, &rcBox);
 }
 
@@ -1815,7 +1827,7 @@ static inline INT LISTVIEW_GetCountPerColumn(const 
LISTVIEW_INFO *infoPtr)
 {
     INT nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
 
-    return max(nListHeight / infoPtr->nItemHeight, 1);
+    return infoPtr->nItemHeight ? max(nListHeight / infoPtr->nItemHeight, 1) : 
0;
 }
 
 
@@ -1873,7 +1885,7 @@ static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO 
*infoPtr, WPARAM charCode, L
     if (!charCode || !keyData || infoPtr->nItemCount == 0) return 0;
 
     /* only allow the valid WM_CHARs through */
-    if (!isalnumW(charCode) &&
+    if (!iswalnum(charCode) &&
         charCode != '.' && charCode != '`' && charCode != '!' &&
         charCode != '@' && charCode != '#' && charCode != '$' &&
         charCode != '%' && charCode != '^' && charCode != '&' &&
@@ -3524,13 +3536,13 @@ Parameters:
 */
 static void LISTVIEW_ShiftFocus(LISTVIEW_INFO *infoPtr, INT focus, INT item, 
INT direction)
 {
-    BOOL old_change = infoPtr->bDoChangeNotify;
+    DWORD old_mask = infoPtr->notify_mask & NOTIFY_MASK_ITEM_CHANGE;
 
-    infoPtr->bDoChangeNotify = FALSE;
+    infoPtr->notify_mask &= ~NOTIFY_MASK_ITEM_CHANGE;
     focus = shift_item(infoPtr, focus, item, direction);
     if (focus != infoPtr->nFocusedItem)
         LISTVIEW_SetItemFocus(infoPtr, focus);
-    infoPtr->bDoChangeNotify = old_change;
+    infoPtr->notify_mask |= old_mask;
 }
 
 /**
@@ -3573,8 +3585,8 @@ static BOOL LISTVIEW_AddGroupSelection(LISTVIEW_INFO 
*infoPtr, INT nItem)
     INT nLast = max(infoPtr->nSelectionMark, nItem);
     HWND hwndSelf = infoPtr->hwndSelf;
     NMLVODSTATECHANGE nmlv;
+    DWORD old_mask;
     LVITEMW item;
-    BOOL bOldChange;
     INT i;
 
     /* Temporarily disable change notification
@@ -3582,8 +3594,9 @@ static BOOL LISTVIEW_AddGroupSelection(LISTVIEW_INFO 
*infoPtr, INT nItem)
      * only one LVN_ODSTATECHANGED notification.
      * See MSDN documentation for LVN_ITEMCHANGED.
      */
-    bOldChange = infoPtr->bDoChangeNotify;
-    if (infoPtr->dwStyle & LVS_OWNERDATA) infoPtr->bDoChangeNotify = FALSE;
+    old_mask = infoPtr->notify_mask & NOTIFY_MASK_ITEM_CHANGE;
+    if (infoPtr->dwStyle & LVS_OWNERDATA)
+        infoPtr->notify_mask &= ~NOTIFY_MASK_ITEM_CHANGE;
 
     if (nFirst == -1) nFirst = nItem;
 
@@ -3602,7 +3615,7 @@ static BOOL LISTVIEW_AddGroupSelection(LISTVIEW_INFO 
*infoPtr, INT nItem)
     notify_hdr(infoPtr, LVN_ODSTATECHANGED, (LPNMHDR)&nmlv);
     if (!IsWindow(hwndSelf))
         return FALSE;
-    infoPtr->bDoChangeNotify = bOldChange;
+    infoPtr->notify_mask |= old_mask;
     return TRUE;
 }
 
@@ -3621,9 +3634,9 @@ static BOOL LISTVIEW_AddGroupSelection(LISTVIEW_INFO 
*infoPtr, INT nItem)
 static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
 {
     RANGES selection;
+    DWORD old_mask;
     LVITEMW item;
     ITERATOR i;
-    BOOL bOldChange;
 
     if (!(selection = ranges_create(100))) return;
 
@@ -3673,8 +3686,9 @@ static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO 
*infoPtr, INT nItem)
 
     /* disable per item notifications on LVS_OWNERDATA style
        FIXME: single LVN_ODSTATECHANGED should be used */
-    bOldChange = infoPtr->bDoChangeNotify;
-    if (infoPtr->dwStyle & LVS_OWNERDATA) infoPtr->bDoChangeNotify = FALSE;
+    old_mask = infoPtr->notify_mask & NOTIFY_MASK_ITEM_CHANGE;
+    if (infoPtr->dwStyle & LVS_OWNERDATA)
+        infoPtr->notify_mask &= ~NOTIFY_MASK_ITEM_CHANGE;
 
     LISTVIEW_DeselectAllSkipItems(infoPtr, selection);
 
@@ -3685,8 +3699,7 @@ static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO 
*infoPtr, INT nItem)
     /* this will also destroy the selection */
     iterator_destroy(&i);
 
-    infoPtr->bDoChangeNotify = bOldChange;
-    
+    infoPtr->notify_mask |= old_mask;
     LISTVIEW_SetItemFocus(infoPtr, nItem);
 }
 
@@ -4265,8 +4278,11 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const 
LVITEMW *lpLVItem, BOOL
     
     memset(&nmlv, 0, sizeof(NMLISTVIEW));
     nmlv.iItem = lpLVItem->iItem;
-    nmlv.uNewState = (item.state & ~stateMask) | (lpLVItem->state & stateMask);
-    nmlv.uOldState = item.state;
+    if (lpLVItem->mask & LVIF_STATE)
+    {
+        nmlv.uNewState = (item.state & ~stateMask) | (lpLVItem->state & 
stateMask);
+        nmlv.uOldState = item.state;
+    }
     nmlv.uChanged = uChanged ? uChanged : lpLVItem->mask;
     nmlv.lParam = item.lParam;
 
@@ -4274,7 +4290,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const 
LVITEMW *lpLVItem, BOOL
        and we are _NOT_ virtual (LVS_OWNERDATA), and change notifications
        are enabled. Even nothing really changed we still need to send this,
        in this case uChanged mask is just set to passed item mask. */
-    if(lpItem && !isNew && infoPtr->bDoChangeNotify)
+    if (lpItem && !isNew && (infoPtr->notify_mask & NOTIFY_MASK_ITEM_CHANGE))
     {
       HWND hwndSelf = infoPtr->hwndSelf;
 
@@ -4367,7 +4383,8 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const 
LVITEMW *lpLVItem, BOOL
 
     /* send LVN_ITEMCHANGED notification */
     if (lpLVItem->mask & LVIF_PARAM) nmlv.lParam = lpLVItem->lParam;
-    if (infoPtr->bDoChangeNotify) notify_listview(infoPtr, LVN_ITEMCHANGED, 
&nmlv);
+    if (infoPtr->notify_mask & NOTIFY_MASK_ITEM_CHANGE)
+        notify_listview(infoPtr, LVN_ITEMCHANGED, &nmlv);
 
     return TRUE;
 }
@@ -5265,11 +5282,15 @@ enddraw:
 
     /* Draw marquee rectangle if appropriate */
     if (infoPtr->bMarqueeSelect)
+#ifdef __REACTOS__
     {
         SetBkColor(hdc, RGB(255, 255, 255));
         SetTextColor(hdc, RGB(0, 0, 0));
         DrawFocusRect(hdc, &infoPtr->marqueeDrawRect);
     }
+#else
+        DrawFocusRect(hdc, &infoPtr->marqueeDrawRect);
+#endif
 
     if (cdmode & CDRF_NOTIFYPOSTPAINT)
        notify_postpaint(infoPtr, &nmlvcd);
@@ -5938,9 +5959,13 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO 
*infoPtr, BOOL storeText, BOOL
     dispInfo.item.pszText = same ? NULL : pszText;
     dispInfo.item.cchTextMax = textlenT(dispInfo.item.pszText, isW);
 
+    infoPtr->notify_mask &= ~NOTIFY_MASK_END_LABEL_EDIT;
+
     /* Do we need to update the Item Text */
     res = notify_dispinfoT(infoPtr, LVN_ENDLABELEDITW, &dispInfo, isW);
 
+    infoPtr->notify_mask |= NOTIFY_MASK_END_LABEL_EDIT;
+
     infoPtr->nEditLabelItem = -1;
     infoPtr->hwndEdit = 0;
 
@@ -6409,7 +6434,7 @@ again:
        {
             if (lpFindInfo->flags & (LVFI_PARTIAL | LVFI_SUBSTRING))
             {
-               WCHAR *p = strstrW(lvItem.pszText, lpFindInfo->psz);
+               WCHAR *p = wcsstr(lvItem.pszText, lpFindInfo->psz);
                if (!p || p != lvItem.pszText) continue;
             }
             else
@@ -9000,7 +9025,7 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, 
INT nItem, const LVITE
     if (nItem == -1)
     {
         UINT oldstate = 0;
-        BOOL notify;
+        DWORD old_mask;
 
         /* special case optimization for recurring attempt to deselect all */
         if (lvItem.state == 0 && lvItem.stateMask == LVIS_SELECTED && 
!LISTVIEW_GetSelectedCount(infoPtr))
@@ -9013,10 +9038,10 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO 
*infoPtr, INT nItem, const LVITE
        /* focus all isn't allowed */
        if (lvItem.state & lvItem.stateMask & LVIS_FOCUSED) return FALSE;
 
-        notify = infoPtr->bDoChangeNotify;
+        old_mask = infoPtr->notify_mask & NOTIFY_MASK_ITEM_CHANGE;
         if (infoPtr->dwStyle & LVS_OWNERDATA)
         {
-            infoPtr->bDoChangeNotify = FALSE;
+            infoPtr->notify_mask &= ~NOTIFY_MASK_ITEM_CHANGE;
             if (!(lvItem.state & LVIS_SELECTED) && 
LISTVIEW_GetSelectedCount(infoPtr))
                 oldstate |= LVIS_SELECTED;
             if (infoPtr->nFocusedItem != -1) oldstate |= LVIS_FOCUSED;
@@ -9030,7 +9055,7 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, 
INT nItem, const LVITE
         {
             NMLISTVIEW nmlv;
 
-            infoPtr->bDoChangeNotify = notify;
+            infoPtr->notify_mask |= old_mask;
 
             nmlv.iItem = -1;
             nmlv.iSubItem = 0;
@@ -9514,7 +9539,7 @@ static LRESULT LISTVIEW_NCCreate(HWND hwnd, WPARAM 
wParam, const CREATESTRUCTW *
   infoPtr->nHotItem = -1;
   infoPtr->redraw = TRUE;
   infoPtr->bNoItemMetrics = TRUE;
-  infoPtr->bDoChangeNotify = TRUE;
+  infoPtr->notify_mask = NOTIFY_MASK_UNMASK_ALL;
   infoPtr->autoSpacing = TRUE;
   infoPtr->iconSpacing.cx = GetSystemMetrics(SM_CXICONSPACING) - 
GetSystemMetrics(SM_CXICON);
   infoPtr->iconSpacing.cy = GetSystemMetrics(SM_CYICONSPACING) - 
GetSystemMetrics(SM_CYICON);
@@ -9909,7 +9934,7 @@ static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, 
INT nScrollCode,
     /* carry on only if it really changed */
     if (nNewScrollPos == nOldScrollPos) return 0;
 
-    if (infoPtr->hwndHeader) LISTVIEW_UpdateHeaderSize(infoPtr, nNewScrollPos);
+    LISTVIEW_UpdateHeaderSize(infoPtr, nNewScrollPos);
 
     /* now adjust to client coordinates */
     nScrollDiff = nOldScrollPos - nNewScrollPos;
@@ -9923,7 +9948,7 @@ static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, 
INT nScrollCode,
 
 static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
 {
-    UINT pulScrollLines = 3;
+    INT pulScrollLines = 3;
 
     TRACE("(wheelDelta=%d)\n", wheelDelta);
 
@@ -9952,8 +9977,8 @@ static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO 
*infoPtr, INT wheelDelta)
         {
             int cLineScroll;
             pulScrollLines = min((UINT)LISTVIEW_GetCountPerColumn(infoPtr), 
pulScrollLines);
-            cLineScroll = pulScrollLines * (float)infoPtr->cWheelRemainder / 
WHEEL_DELTA;
-            infoPtr->cWheelRemainder -= WHEEL_DELTA * cLineScroll / 
(int)pulScrollLines;
+            cLineScroll = pulScrollLines * infoPtr->cWheelRemainder / 
WHEEL_DELTA;
+            infoPtr->cWheelRemainder -= WHEEL_DELTA * cLineScroll / 
pulScrollLines;
             LISTVIEW_VScroll(infoPtr, SB_INTERNAL, -cLineScroll);
         }
         break;
@@ -10248,7 +10273,9 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO 
*infoPtr, WORD wKey, INT x, IN
   {
     if ((infoPtr->dwLvExStyle & LVS_EX_CHECKBOXES) && (lvHitTestInfo.flags & 
LVHT_ONITEMSTATEICON))
     {
+        notify_click(infoPtr, NM_CLICK, &lvHitTestInfo);
         toggle_checkbox_state(infoPtr, nItem);
+        infoPtr->bLButtonDown = FALSE;
         return 0;
     }
 
@@ -11099,13 +11126,21 @@ static void LISTVIEW_UpdateSize(LISTVIEW_INFO 
*infoPtr)
         infoPtr->rcList.bottom = max (infoPtr->rcList.bottom - 2, 0);
     }
 
-    /* if control created invisible header isn't created */
+    /* When ListView control is created invisible, header isn't created right 
away. */
     if (infoPtr->hwndHeader)
     {
-       HDLAYOUT hl;
-       WINDOWPOS wp;
+        POINT origin;
+        WINDOWPOS wp;
+        HDLAYOUT hl;
+        RECT rect;
+
+        LISTVIEW_GetOrigin(infoPtr, &origin);
 
-       hl.prc = &infoPtr->rcList;
+        rect = infoPtr->rcList;
+        rect.left += origin.x;
+        rect.top += origin.y;
+
+        hl.prc = &rect;
        hl.pwpos = &wp;
        SendMessageW( infoPtr->hwndHeader, HDM_LAYOUT, 0, (LPARAM)&hl );
        TRACE("  wp.flags=0x%08x, wp=%d,%d (%dx%d)\n", wp.flags, wp.x, wp.y, 
wp.cx, wp.cy);
@@ -11145,14 +11180,13 @@ static void LISTVIEW_UpdateSize(LISTVIEW_INFO 
*infoPtr)
 static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
                                  const STYLESTRUCT *lpss)
 {
-    UINT uNewView = lpss->styleNew & LVS_TYPEMASK;
-    UINT uOldView = lpss->styleOld & LVS_TYPEMASK;
+    UINT uNewView, uOldView;
     UINT style;
 
     TRACE("(styletype=%lx, styleOld=0x%08x, styleNew=0x%08x)\n",
           wStyleType, lpss->styleOld, lpss->styleNew);
 
-    if (wStyleType != GWL_STYLE) return 0;
+    if (wStyleType != GWL_STYLE || lpss->styleNew == infoPtr->dwStyle) return 
0;
 
     infoPtr->dwStyle = lpss->styleNew;
 
@@ -11164,6 +11198,9 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO 
*infoPtr, WPARAM wStyleType,
         ((lpss->styleNew & WS_VSCROLL) == 0))
        ShowScrollBar(infoPtr->hwndSelf, SB_VERT, FALSE);
 
+    uNewView = lpss->styleNew & LVS_TYPEMASK;
+    uOldView = lpss->styleOld & LVS_TYPEMASK;
+
     if (uNewView != uOldView)
     {
        HIMAGELIST himl;
@@ -11949,8 +11986,9 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, 
WPARAM wParam, LPARAM lP
        }
        case EN_KILLFOCUS:
        {
-           LISTVIEW_CancelEditLabel(infoPtr);
-           break;
+            if (infoPtr->notify_mask & NOTIFY_MASK_END_LABEL_EDIT)
+                LISTVIEW_CancelEditLabel(infoPtr);
+            break;
        }
 
        default:
diff --git a/dll/win32/comctl32/progress.c b/dll/win32/comctl32/progress.c
index 28d9fd2fd37..268bdac5da2 100644
--- a/dll/win32/comctl32/progress.c
+++ b/dll/win32/comctl32/progress.c
@@ -652,23 +652,24 @@ static LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT 
message,
 
     case PBM_STEPIT:
     {
-       INT oldVal;
-        oldVal = infoPtr->CurVal;
-        infoPtr->CurVal += infoPtr->Step;
-        if (infoPtr->CurVal > infoPtr->MaxVal)
-        {
-            infoPtr->CurVal = (infoPtr->CurVal - infoPtr->MinVal) % 
(infoPtr->MaxVal - infoPtr->MinVal) + infoPtr->MinVal;
-        }
-        if (infoPtr->CurVal < infoPtr->MinVal)
+        int oldVal = infoPtr->CurVal;
+
+        if (infoPtr->MinVal != infoPtr->MaxVal)
         {
-            infoPtr->CurVal = (infoPtr->CurVal - infoPtr->MinVal) % 
(infoPtr->MaxVal - infoPtr->MinVal) + infoPtr->MaxVal;
+            infoPtr->CurVal += infoPtr->Step;
+            if (infoPtr->CurVal > infoPtr->MaxVal)
+                infoPtr->CurVal = (infoPtr->CurVal - infoPtr->MinVal) % 
(infoPtr->MaxVal - infoPtr->MinVal) + infoPtr->MinVal;
+            if (infoPtr->CurVal < infoPtr->MinVal)
+                infoPtr->CurVal = (infoPtr->CurVal - infoPtr->MinVal) % 
(infoPtr->MaxVal - infoPtr->MinVal) + infoPtr->MaxVal;
+
+            if (oldVal != infoPtr->CurVal)
+            {
+                TRACE("PBM_STEPIT: current pos changed from %d to %d\n", 
oldVal, infoPtr->CurVal);
+                PROGRESS_Invalidate( infoPtr, oldVal, infoPtr->CurVal );
+                UpdateWindow( infoPtr->Self );
+            }
         }
-        if(oldVal != infoPtr->CurVal)
-       {
-           TRACE("PBM_STEPIT: current pos changed from %d to %d\n", oldVal, 
infoPtr->CurVal);
-            PROGRESS_Invalidate( infoPtr, oldVal, infoPtr->CurVal );
-            UpdateWindow( infoPtr->Self );
-       }
+
         return oldVal;
     }
 

Reply via email to