[0.4.10][COMCTL32][WIN32SS] Fix multiple scrollbar redraw issues
authorJoachim Henze <Joachim.Henze@reactos.org>
Sun, 20 Dec 2020 05:41:12 +0000 (06:41 +0100)
committerJoachim Henze <Joachim.Henze@reactos.org>
Sun, 20 Dec 2020 05:41:12 +0000 (06:41 +0100)
This fixes:
- CORE-15911 "Scrollbars do not disappear when Maximizing and not needed"
- CORE-10617 "ListView corrupt scrollbar upon resizing the column-header"

and fixes regressions:
- CORE-15429 "Uninitialized scrollbars in 'My Computer' permanently drawn"
- CORE-16466 "Uninitialized scrollbars in 'My Computer' do still flash up for a fraction of a second before getting overpainted"
both unhidden by SVN r75735 == git 0.4.7-dev-168-g 6af37fd54e53658bb4d832d01e4ee2546af98835

by porting back the commits:
0.4.14-dev-312-g b931f643e35e6a23dbef99e785804039ea579b6a
0.4.13-dev-535-g 1158c241941a13d8374f3f1b3016c672c824e7f0

dll/win32/comctl32/listview.c
win32ss/user/ntuser/winpos.c

index fb40d22..dfcf444 100644 (file)
@@ -2076,6 +2076,9 @@ static INT LISTVIEW_UpdateHScroll(LISTVIEW_INFO *infoPtr)
 
     horzInfo.fMask = SIF_RANGE | SIF_PAGE;
     horzInfo.nMax = max(horzInfo.nMax - 1, 0);
+#ifdef __REACTOS__ /* CORE-16466 part 1 of 4 */
+    horzInfo.nMax = (horzInfo.nPage == 0 ? 0 : horzInfo.nMax);
+#endif
     dx = GetScrollPos(infoPtr->hwndSelf, SB_HORZ);
     dx -= SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo, TRUE);
     TRACE("horzInfo=%s\n", debugscrollinfo(&horzInfo));
@@ -2099,10 +2102,27 @@ static INT LISTVIEW_UpdateVScroll(LISTVIEW_INFO *infoPtr)
 
     ZeroMemory(&vertInfo, sizeof(SCROLLINFO));
     vertInfo.cbSize = sizeof(SCROLLINFO);
+#ifdef __REACTOS__ /* CORE-16466 part 2 of 4 */
+    vertInfo.nPage = max((infoPtr->rcList.bottom - infoPtr->rcList.top), 0);
+#else
     vertInfo.nPage = infoPtr->rcList.bottom - infoPtr->rcList.top;
+#endif
 
     if (infoPtr->uView == LV_VIEW_DETAILS)
     {
+#ifdef __REACTOS__ /* CORE-16466 part 3 of 4 */
+        if (vertInfo.nPage != 0)
+        {
+            vertInfo.nMax = infoPtr->nItemCount;
+
+           /* scroll by at least one page */
+           if (vertInfo.nPage < infoPtr->nItemHeight)
+               vertInfo.nPage = infoPtr->nItemHeight;
+
+          if (infoPtr->nItemHeight > 0)
+              vertInfo.nPage /= infoPtr->nItemHeight;
+        }
+#else
        vertInfo.nMax = infoPtr->nItemCount;
        
        /* scroll by at least one page */
@@ -2111,6 +2131,7 @@ static INT LISTVIEW_UpdateVScroll(LISTVIEW_INFO *infoPtr)
 
         if (infoPtr->nItemHeight > 0)
             vertInfo.nPage /= infoPtr->nItemHeight;
+#endif
     }
     else if (infoPtr->uView != LV_VIEW_LIST) /* LV_VIEW_ICON, or LV_VIEW_SMALLICON */
     {
@@ -2121,6 +2142,9 @@ static INT LISTVIEW_UpdateVScroll(LISTVIEW_INFO *infoPtr)
 
     vertInfo.fMask = SIF_RANGE | SIF_PAGE;
     vertInfo.nMax = max(vertInfo.nMax - 1, 0);
+#ifdef __REACTOS__ /* CORE-16466 part 4 of 4 */
+    vertInfo.nMax = (vertInfo.nPage == 0 ? 0 : vertInfo.nMax);
+#endif
     dy = GetScrollPos(infoPtr->hwndSelf, SB_VERT);
     dy -= SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &vertInfo, TRUE);
     TRACE("vertInfo=%s\n", debugscrollinfo(&vertInfo));
index 20194cd..d9d5c86 100644 (file)
@@ -1778,7 +1778,7 @@ co_WinPosSetWindowPos(
          }
 
          /* Calculate the non client area for resizes, as this is used in the copy region */
-         if (!(WinPos.flags & SWP_NOSIZE))
+         if ((WinPos.flags & (SWP_NOSIZE | SWP_FRAMECHANGED)) != SWP_NOSIZE)
          {
              VisBeforeJustClient = VIS_ComputeVisibleRegion(Window, TRUE, FALSE,
                  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
@@ -1916,12 +1916,16 @@ co_WinPosSetWindowPos(
           */
 
          CopyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
-         if (WinPos.flags & SWP_NOSIZE)
+         if ((WinPos.flags & SWP_NOSIZE) && (WinPos.flags & SWP_NOCLIENTSIZE))
             RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBefore, RGN_AND);
          else if (VisBeforeJustClient != NULL)
          {
             RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBeforeJustClient, RGN_AND);
-            REGION_Delete(VisBeforeJustClient);
+         }
+
+         if (VisBeforeJustClient != NULL)
+         {
+             REGION_Delete(VisBeforeJustClient);
          }
 
          /* Now use in copying bits which are in the update region. */