summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authorfvogel <fvogelnew1@free.fr>2019-04-29 06:20:32 (GMT)
committerfvogel <fvogelnew1@free.fr>2019-04-29 06:20:32 (GMT)
commitb6346219dd3ff64b938c4eb3a8691d99688576d1 (patch)
treedd2c049415394657adeb4606fb2d95f132128870 /win
parent382629885640de3a90996d12cf33428a43e74412 (diff)
downloadtk-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.c76
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: