From c5858c16a665b13a9798a80be9de698dbf52b109 Mon Sep 17 00:00:00 2001 From: Ken Thomases Date: Sun, 10 Feb 2013 19:09:08 -0600 Subject: [PATCH] comctl32: Improve mouse wheel scrolling in treeview control. Allow fractions of WHEEL_DELTA to scroll fractions of SPI_GETWHEELSCROLLLINES, although still only whole lines. Keep the remainder and apply it to next event if in same direction. --- dlls/comctl32/treeview.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c index b0cbc7a18db..46ef7512dc4 100644 --- a/dlls/comctl32/treeview.c +++ b/dlls/comctl32/treeview.c @@ -102,6 +102,7 @@ typedef struct tagTREEVIEW_INFO BOOL insertBeforeorAfter; /* flag used by TVM_SETINSERTMARK */ HIMAGELIST dragList; /* Bitmap of dragged item */ LONG scrollX; + INT wheelRemainder; COLORREF clrBk; COLORREF clrText; COLORREF clrLine; @@ -4925,7 +4926,7 @@ scroll: static LRESULT TREEVIEW_MouseWheel(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam) { - short gcWheelDelta; + short wheelDelta; UINT pulScrollLines = 3; if (wParam & (MK_SHIFT | MK_CONTROL)) @@ -4936,13 +4937,25 @@ TREEVIEW_MouseWheel(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam) SystemParametersInfoW(SPI_GETWHEELSCROLLLINES, 0, &pulScrollLines, 0); - gcWheelDelta = -(short)HIWORD(wParam); - pulScrollLines *= (gcWheelDelta / WHEEL_DELTA); + wheelDelta = GET_WHEEL_DELTA_WPARAM(wParam); + /* if scrolling changes direction, ignore left overs */ + if ((wheelDelta < 0 && infoPtr->wheelRemainder < 0) || + (wheelDelta > 0 && infoPtr->wheelRemainder > 0)) + infoPtr->wheelRemainder += wheelDelta; + else + infoPtr->wheelRemainder = wheelDelta; - if (abs(gcWheelDelta) >= WHEEL_DELTA && pulScrollLines) + if (infoPtr->wheelRemainder && pulScrollLines) { - int newDy = infoPtr->firstVisible->visibleOrder + pulScrollLines; - int maxDy = infoPtr->maxVisibleOrder; + int newDy; + int maxDy; + int lineScroll; + + lineScroll = pulScrollLines * (float)infoPtr->wheelRemainder / WHEEL_DELTA; + infoPtr->wheelRemainder -= WHEEL_DELTA * lineScroll / (int)pulScrollLines; + + newDy = infoPtr->firstVisible->visibleOrder - lineScroll; + maxDy = infoPtr->maxVisibleOrder; if (newDy > maxDy) newDy = maxDy; @@ -5047,6 +5060,7 @@ TREEVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs) /* dragList */ infoPtr->scrollX = 0; + infoPtr->wheelRemainder = 0; infoPtr->clrBk = CLR_NONE; /* use system color */ infoPtr->clrText = CLR_NONE; /* use system color */