Ken Thomases : comctl32: Improve mouse wheel scrolling in treeview control.
Alexandre Julliard
julliard at winehq.org
Mon Feb 11 13:06:31 CST 2013
Module: wine
Branch: master
Commit: c5858c16a665b13a9798a80be9de698dbf52b109
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5858c16a665b13a9798a80be9de698dbf52b109
Author: Ken Thomases <ken at codeweavers.com>
Date: Sun Feb 10 19:09:08 2013 -0600
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 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index b0cbc7a..46ef751 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 */
More information about the wine-cvs
mailing list