On 03.05.2017 7:53, Alex Henrie wrote:
Cc: Nikolay Sivov nsivov@codeweavers.com
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.)
This patch was previously assigned to Nikolay, but I never received any feedback about it.
Sorry about that.
Signed-off-by: Alex Henrie alexhenrie24@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);
This certainly doesn't look pretty, but I see what you mean. I'll take a look, thanks for reminding me.
/* 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);
- }
}