[PATCH] comctl32: When adding a scrollbar to a listview, update the other one.
Alex Henrie
alexhenrie24 at gmail.com
Sun Mar 5 23:23:18 CST 2017
Fixes https://bugs.winehq.org/show_bug.cgi?id=35529
Adding a vertical scrollbar can necessitate adding a horizontal
scrollbar just as easily as adding a horizontal scrollbar can
necessitate adding a vertical scrollbar. (And in the same way, removing
either of the scrollbars can necessitate removing the other scrollbar.)
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
dlls/comctl32/listview.c | 78 +++++++++++++++++++++++++++++++-----------------
1 file changed, 50 insertions(+), 28 deletions(-)
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index c01d816c46..c3c89d08dc 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -2016,23 +2016,10 @@ static void LISTVIEW_UpdateHeaderSize(const LISTVIEW_INFO *infoPtr, INT nNewScro
SWP_NOZORDER | SWP_NOACTIVATE);
}
-/***
- * DESCRIPTION:
- * Update the scrollbars. This functions should be called whenever
- * the content, size or view changes.
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- *
- * RETURN:
- * None
- */
-static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
+static INT LISTVIEW_UpdateHScroll(LISTVIEW_INFO *infoPtr)
{
- SCROLLINFO horzInfo, vertInfo;
- INT dx, dy;
-
- if ((infoPtr->dwStyle & LVS_NOSCROLL) || !is_redrawing(infoPtr)) return;
+ SCROLLINFO horzInfo;
+ INT dx;
ZeroMemory(&horzInfo, sizeof(SCROLLINFO));
horzInfo.cbSize = sizeof(SCROLLINFO);
@@ -2084,10 +2071,22 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
dx -= SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo, TRUE);
TRACE("horzInfo=%s\n", debugscrollinfo(&horzInfo));
- /* Setting the horizontal scroll can change the listview size
- * (and potentially everything else) so we need to recompute
- * everything again for the vertical scroll
- */
+ /* Update the Header Control */
+ if (infoPtr->hwndHeader)
+ {
+ horzInfo.fMask = SIF_POS;
+ GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo);
+ LISTVIEW_UpdateHeaderSize(infoPtr, horzInfo.nPos);
+ }
+
+ LISTVIEW_UpdateSize(infoPtr);
+ return dx;
+}
+
+static INT LISTVIEW_UpdateVScroll(LISTVIEW_INFO *infoPtr)
+{
+ SCROLLINFO vertInfo;
+ INT dy;
ZeroMemory(&vertInfo, sizeof(SCROLLINFO));
vertInfo.cbSize = sizeof(SCROLLINFO);
@@ -2117,6 +2116,37 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
dy -= SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &vertInfo, TRUE);
TRACE("vertInfo=%s\n", debugscrollinfo(&vertInfo));
+ LISTVIEW_UpdateSize(infoPtr);
+ return dy;
+}
+
+/***
+ * DESCRIPTION:
+ * Update the scrollbars. This function should be called whenever
+ * the content, size or view changes.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ *
+ * RETURN:
+ * None
+ */
+static void LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr)
+{
+ INT dx, dy;
+
+ if ((infoPtr->dwStyle & LVS_NOSCROLL) || !is_redrawing(infoPtr)) return;
+
+ /* Setting the horizontal scroll can change the listview size
+ * (and potentially everything else) so we need to recompute
+ * everything again for the vertical scroll and vice-versa
+ */
+
+ dx = LISTVIEW_UpdateHScroll(infoPtr);
+ dy = LISTVIEW_UpdateVScroll(infoPtr);
+ dx += LISTVIEW_UpdateHScroll(infoPtr);
+ dy += LISTVIEW_UpdateVScroll(infoPtr);
+
/* Change of the range may have changed the scroll pos. If so move the content */
if (dx != 0 || dy != 0)
{
@@ -2125,14 +2155,6 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
ScrollWindowEx(infoPtr->hwndSelf, dx, dy, &listRect, &listRect, 0, 0,
SW_ERASE | SW_INVALIDATE);
}
-
- /* Update the Header Control */
- if (infoPtr->hwndHeader)
- {
- horzInfo.fMask = SIF_POS;
- GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo);
- LISTVIEW_UpdateHeaderSize(infoPtr, horzInfo.nPos);
- }
}
--
2.12.0
More information about the wine-patches
mailing list