[PATCH resend] comctl32: When adding a scrollbar to a listview, update the other one.

Nikolay Sivov bunglehead at gmail.com
Wed May 3 06:36:04 CDT 2017


On 03.05.2017 7:53, Alex Henrie wrote:
> Cc: Nikolay Sivov <nsivov at 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 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);
> +

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);
> -    }
>  }
>  
>  
> 




More information about the wine-devel mailing list