From: Alex Henrie Subject: [PATCH] comctl32: When adding a scrollbar to a listview, update the other one. Message-Id: <20170306052319.18793-1-alexhenrie24@gmail.com> Date: Sun, 5 Mar 2017 22:23:18 -0700 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 --- 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