diff options
author | fvogel <fvogelnew1@free.fr> | 2019-04-29 06:20:32 (GMT) |
---|---|---|
committer | fvogel <fvogelnew1@free.fr> | 2019-04-29 06:20:32 (GMT) |
commit | b6346219dd3ff64b938c4eb3a8691d99688576d1 (patch) | |
tree | dd2c049415394657adeb4606fb2d95f132128870 /win | |
parent | 382629885640de3a90996d12cf33428a43e74412 (diff) | |
download | tk-b6346219dd3ff64b938c4eb3a8691d99688576d1.zip tk-b6346219dd3ff64b938c4eb3a8691d99688576d1.tar.gz tk-b6346219dd3ff64b938c4eb3a8691d99688576d1.tar.bz2 |
Fix [eb29967e88]: Add horizontal scrolling support for Windows. Patch from Christopher Chavez.
Diffstat (limited to 'win')
-rw-r--r-- | win/tkWinX.c | 76 |
1 files changed, 63 insertions, 13 deletions
diff --git a/win/tkWinX.c b/win/tkWinX.c index 3737345..75064b5 100644 --- a/win/tkWinX.c +++ b/win/tkWinX.c @@ -36,6 +36,15 @@ #include <zmouse.h> /* + * WM_MOUSEHWHEEL is normally defined by Winuser.h for Vista/2008 or later, + * but is also usable on 2000/XP if IntelliPoint drivers are installed. + */ + +#ifndef WM_MOUSEHWHEEL +#define WM_MOUSEHWHEEL 0x020E +#endif + +/* * imm.h is needed by HandleIMEComposition */ @@ -82,8 +91,10 @@ typedef struct ThreadSpecificData { * screen. */ int updatingClipboard; /* If 1, we are updating the clipboard. */ int surrogateBuffer; /* Buffer for first of surrogate pair. */ - DWORD wheelTickPrev; /* For high resolution wheels. */ - short wheelAcc; /* For high resolution wheels. */ + DWORD vWheelTickPrev; /* For high resolution wheels (vertical). */ + DWORD hWheelTickPrev; /* For high resolution wheels (horizontal). */ + short vWheelAcc; /* For high resolution wheels (vertical). */ + short hWheelAcc; /* For high resolution wheels (horizontal). */ } ThreadSpecificData; static Tcl_ThreadDataKey dataKey; @@ -555,6 +566,7 @@ TkpOpenDisplay( Display *display; ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); + DWORD initialWheelTick; if (tsdPtr->winDisplay != NULL) { if (!strcmp(tsdPtr->winDisplay->display->display_name, display_name)) { @@ -610,8 +622,11 @@ TkpOpenDisplay( ZeroMemory(tsdPtr->winDisplay, sizeof(TkDisplay)); tsdPtr->winDisplay->display = display; tsdPtr->updatingClipboard = FALSE; - tsdPtr->wheelTickPrev = GetTickCount(); - tsdPtr->wheelAcc = 0; + initialWheelTick = GetTickCount(); + tsdPtr->vWheelTickPrev = initialWheelTick; + tsdPtr->hWheelTickPrev = initialWheelTick; + tsdPtr->vWheelAcc = 0; + tsdPtr->hWheelAcc = 0; /* * Key map info must be available immediately, because of "send event". @@ -942,6 +957,7 @@ Tk_TranslateWinEvent( case WM_SYSKEYUP: case WM_KEYUP: case WM_MOUSEWHEEL: + case WM_MOUSEHWHEEL: GenerateXEvent(hwnd, message, wParam, lParam); return 1; case WM_MENUCHAR: @@ -986,7 +1002,7 @@ GenerateXEvent( ThreadSpecificData *tsdPtr = (ThreadSpecificData *) Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); - if (message == WM_MOUSEWHEEL) { + if ((message == WM_MOUSEWHEEL) || (message == WM_MOUSEHWHEEL)) { union {LPARAM lParam; POINTS point;} root; POINT pos; root.lParam = lParam; @@ -1101,6 +1117,7 @@ GenerateXEvent( break; case WM_MOUSEWHEEL: + case WM_MOUSEHWHEEL: case WM_CHAR: case WM_UNICHAR: case WM_SYSKEYDOWN: @@ -1142,18 +1159,50 @@ GenerateXEvent( switch (message) { case WM_MOUSEWHEEL: { /* - * Support for high resolution wheels. + * Support for high resolution wheels (vertical). + */ + + DWORD wheelTick = GetTickCount(); + + if (wheelTick - tsdPtr->vWheelTickPrev < 1500) { + tsdPtr->vWheelAcc += (short) HIWORD(wParam); + } else { + tsdPtr->vWheelAcc = (short) HIWORD(wParam); + } + tsdPtr->vWheelTickPrev = wheelTick; + if (abs(tsdPtr->vWheelAcc) < WHEEL_DELTA) { + return; + } + + /* + * We have invented a new X event type to handle this event. It + * still uses the KeyPress struct. However, the keycode field has + * been overloaded to hold the zDelta of the wheel. Set nbytes to + * 0 to prevent conversion of the keycode to a keysym in + * TkpGetString. [Bug 1118340]. + */ + + event.type = MouseWheelEvent; + event.xany.send_event = -1; + event.xkey.nbytes = 0; + event.xkey.keycode = tsdPtr->vWheelAcc / WHEEL_DELTA * WHEEL_DELTA; + tsdPtr->vWheelAcc = tsdPtr->vWheelAcc % WHEEL_DELTA; + break; + } + case WM_MOUSEHWHEEL: { + /* + * Support for high resolution wheels (horizontal). */ DWORD wheelTick = GetTickCount(); - if (wheelTick - tsdPtr->wheelTickPrev < 1500) { - tsdPtr->wheelAcc += (short) HIWORD(wParam); + if (wheelTick - tsdPtr->hWheelTickPrev < 1500) { + tsdPtr->hWheelAcc -= (short) HIWORD(wParam); } else { - tsdPtr->wheelAcc = (short) HIWORD(wParam); + tsdPtr->hWheelAcc = -((short) HIWORD(wParam)); } - tsdPtr->wheelTickPrev = wheelTick; - if (abs(tsdPtr->wheelAcc) < WHEEL_DELTA) { + tsdPtr->hWheelTickPrev = wheelTick; + if (abs(tsdPtr->hWheelAcc) < WHEEL_DELTA) { return; } @@ -1168,8 +1217,9 @@ GenerateXEvent( event.type = MouseWheelEvent; event.xany.send_event = -1; event.xkey.nbytes = 0; - event.xkey.keycode = tsdPtr->wheelAcc / WHEEL_DELTA * WHEEL_DELTA; - tsdPtr->wheelAcc = tsdPtr->wheelAcc % WHEEL_DELTA; + event.xkey.state |= ShiftMask; + event.xkey.keycode = tsdPtr->hWheelAcc / WHEEL_DELTA * WHEEL_DELTA; + tsdPtr->hWheelAcc = tsdPtr->hWheelAcc % WHEEL_DELTA; break; } case WM_SYSKEYDOWN: |