diff options
author | sefler <sefler@126.com> | 2022-09-12 08:32:15 +0300 |
---|---|---|
committer | sefler <sefler@126.com> | 2022-09-13 07:50:12 +0300 |
commit | b162a3723b1d20a92930a8b4986bbd563e36963a (patch) | |
tree | b2ff8502a094752ba38b0e0716526a8f26bc9b4d | |
parent | 6b56cbc1f01d17c4b61b106f92bcc2a7b62fae2f (diff) |
toucpad scrolling works now
-rw-r--r-- | xrdpmouse/rdpMouse.c | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/xrdpmouse/rdpMouse.c b/xrdpmouse/rdpMouse.c index 555e1e3..25541d2 100644 --- a/xrdpmouse/rdpMouse.c +++ b/xrdpmouse/rdpMouse.c @@ -50,6 +50,9 @@ xrdp mouse module #include "rdpInput.h" #include "rdpDraw.h" +#define NBUTTONS 9 +#define NAXES 4 + /******************************************************************************/ #define LOG_LEVEL 1 #define LLOGLN(_level, _args) \ @@ -128,7 +131,7 @@ PtrAddEvent(rdpPointer *pointer) pointer->old_cursor_y = pointer->cursor_y; } - for (i = 0; i < 9; i++) + for (i = 0; i < NBUTTONS; i++) { if ((pointer->button_mask ^ pointer->old_button_mask) & (1 << i)) { @@ -151,6 +154,31 @@ PtrAddEvent(rdpPointer *pointer) } /******************************************************************************/ +static void +PtrAddScrollEvent(rdpPointer *pointer, int vertical, int delta) +{ + ValuatorMask *scroll_events_mask; + int mask_pos; + int scaled_delta; + + LLOGLN(0, ("PtrAddScrollEvent: vertical %d y %d", vertical, delta)); + + scroll_events_mask = valuator_mask_new(NAXES); + mask_pos = vertical ? 2 : 3; + scaled_delta = delta / 10 == 0 ? delta > 0 ? 1 : -1 : delta / 10; + scaled_delta = -scaled_delta; + + valuator_mask_zero(scroll_events_mask); + valuator_mask_set_double(scroll_events_mask, mask_pos, scaled_delta); + + xf86PostMotionEventM(pointer->device, FALSE, scroll_events_mask); + + valuator_mask_free(&scroll_events_mask); + + pointer->old_button_mask = pointer->button_mask; +} + +/******************************************************************************/ static int rdpInputMouse(rdpPtr dev, int msg, long param1, long param2, @@ -242,6 +270,12 @@ rdpInputMouse(rdpPtr dev, int msg, pointer->button_mask = pointer->button_mask | 256; PtrAddEvent(pointer); break; + case WM_TOUCH_VSCROLL: + PtrAddScrollEvent(pointer, TRUE, param3); + break; + case WM_TOUCH_HSCROLL: + PtrAddScrollEvent(pointer, FALSE, param3); + break; } return 0; } @@ -250,11 +284,10 @@ rdpInputMouse(rdpPtr dev, int msg, static int rdpmouseControl(DeviceIntPtr device, int what) { -#define NBUTTONS 9 BYTE map[NBUTTONS + 1]; /* Indexed from 1 */ DevicePtr pDev; Atom btn_labels[NBUTTONS]; - Atom axes_labels[2]; + Atom axes_labels[NAXES]; rdpPtr dev; int i; @@ -282,11 +315,24 @@ rdpmouseControl(DeviceIntPtr device, int what) axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X); axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y); + axes_labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_VSCROLL); + axes_labels[3] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_HSCROLL); InitPointerDeviceStruct(pDev, map, NBUTTONS, btn_labels, rdpmouseCtrl, - GetMotionHistorySize(), 2, axes_labels); + GetMotionHistorySize(), NAXES, axes_labels); + dev = rdpGetDevFromScreen(NULL); dev->pointer.device = device; + + // Initialize scroll valuators + xf86InitValuatorAxisStruct(device, 2, axes_labels[2] + , 0, -1, 0, 0, 0, Relative); + xf86InitValuatorAxisStruct(device, 3, axes_labels[3] + , 0, -1, 0, 0, 0, Relative); + + SetScrollValuator(device, 2, SCROLL_TYPE_VERTICAL, 10, 0); + SetScrollValuator(device, 3, SCROLL_TYPE_HORIZONTAL, 10, 0); + rdpRegisterInputCallback(1, rdpInputMouse); break; case DEVICE_ON: |