Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[v0.9] Backport touchpad intertial scrolling #2948

Merged
merged 1 commit into from
Feb 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,4 @@ xrdp/xrdp
xrdp/xrdp.ini
xrdp_configure_options.h
xrdpapi/xrdp-xrdpapi-simple
.vscode/*
10 changes: 10 additions & 0 deletions common/xrdp_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,12 @@
#define BUTTON_STATE_UP 0
#define BUTTON_STATE_DOWN 1

/* touch gestures */
#define TOUCH_TWO_FINGERS_DOWN 0
#define TOUCH_TWO_FINGERS_UP 1
#define TOUCH_TWO_FINGERS_LEFT 2
#define TOUCH_TWO_FINGERS_RIGHT 3

/* messages */
#define WM_PAINT 3
#define WM_KEYDOWN 15
Expand All @@ -255,6 +261,10 @@
#define WM_BUTTON8DOWN 116
#define WM_BUTTON9UP 117
#define WM_BUTTON9DOWN 118

#define WM_TOUCH_VSCROLL 140
#define WM_TOUCH_HSCROLL 141

#define WM_INVALIDATE 200

#define CB_ITEMCHANGE 300
Expand Down
2 changes: 2 additions & 0 deletions xrdp/xrdp.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ xrdp_wm_get_vis_region(struct xrdp_wm *self, struct xrdp_bitmap *bitmap,
int
xrdp_wm_mouse_move(struct xrdp_wm *self, int x, int y);
int
xrdp_wm_mouse_touch(struct xrdp_wm *self, int gesture, int param);
int
xrdp_wm_mouse_click(struct xrdp_wm *self, int x, int y, int but, int down);
int
xrdp_wm_key(struct xrdp_wm *self, int device_flags, int scan_code);
Expand Down
87 changes: 83 additions & 4 deletions xrdp/xrdp_wm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1224,6 +1224,29 @@ xrdp_wm_clear_popup(struct xrdp_wm *self)
return 0;
}

/*****************************************************************************/
int
xrdp_wm_mouse_touch(struct xrdp_wm *self, int gesture, int param)
{
LOG(LOG_LEVEL_DEBUG, "mouse touch event gesture %d param %d", gesture, param);

switch (gesture)
{
case TOUCH_TWO_FINGERS_UP:
case TOUCH_TWO_FINGERS_DOWN:
self->mm->mod->mod_event(self->mm->mod, WM_TOUCH_VSCROLL,
self->mouse_x, self->mouse_y, param, 0);
break;
case TOUCH_TWO_FINGERS_RIGHT:
case TOUCH_TWO_FINGERS_LEFT:
self->mm->mod->mod_event(self->mm->mod, WM_TOUCH_HSCROLL,
self->mouse_x, self->mouse_y, param, 0);
break;
}

return 0;
}

/*****************************************************************************/
int
xrdp_wm_mouse_click(struct xrdp_wm *self, int x, int y, int but, int down)
Expand Down Expand Up @@ -1769,13 +1792,41 @@ xrdp_wm_process_input_mouse(struct xrdp_wm *self, int device_flags,
/* vertical mouse wheel */
if (device_flags & PTRFLAGS_WHEEL)
{
int delta = 0;
if (device_flags & PTRFLAGS_WHEEL_NEGATIVE)
{
xrdp_wm_mouse_click(self, 0, 0, 5, 0);
/**
* [MS-RDPBCGR] 2.2.8.1.1.3.1.1.3 Mouse Event (TS_POINTER_EVENT)
* In negative scrolling, rotation distance is negative and the delta
* is represented by the lowest byte.
* Examples:
* device_flags = 0x020a, positive vertical scrolling, distance 10
* device_flags = 0x03f6, negative vertical scrolling, distance -10
*
* The negative number is represented by complement.
*/
delta = (device_flags & WheelRotationMask) | ~WheelRotationMask;
if (delta != 0)
{
// Use nature scrolling, up direction is negative.
xrdp_wm_mouse_touch(self, TOUCH_TWO_FINGERS_UP, delta);
}
else
{
xrdp_wm_mouse_click(self, 0, 0, 5, 0);
}
}
else
{
xrdp_wm_mouse_click(self, 0, 0, 4, 0);
delta = device_flags & WheelRotationMask;
if (delta != 0)
{
xrdp_wm_mouse_touch(self, TOUCH_TWO_FINGERS_DOWN, delta);
}
else
{
xrdp_wm_mouse_click(self, 0, 0, 4, 0);
}
}
}

Expand All @@ -1787,13 +1838,41 @@ xrdp_wm_process_input_mouse(struct xrdp_wm *self, int device_flags,
*/
if (device_flags & PTRFLAGS_HWHEEL)
{
int delta = 0;
if (device_flags & PTRFLAGS_WHEEL_NEGATIVE)
{
xrdp_wm_mouse_click(self, 0, 0, 6, 0);
/**
* [MS-RDPBCGR] 2.2.8.1.1.3.1.1.3 Mouse Event (TS_POINTER_EVENT)
* In negative scrolling, rotation distance is negative and the delta
* is represented by the lowest byte.
* Examples:
* device_flags = 0x040a, positive horizontal scrolling, distance 10
* device_flags = 0x05f6, negative horizontal scrolling, distance -10
*
* The negative number is represented by complement.
*/
delta = (device_flags & WheelRotationMask) | ~WheelRotationMask;
if (delta != 0)
{
// Use nature scrolling, right direction is negative.
xrdp_wm_mouse_touch(self, TOUCH_TWO_FINGERS_RIGHT, delta);
}
else
{
xrdp_wm_mouse_click(self, 0, 0, 6, 0);
}
}
else
{
xrdp_wm_mouse_click(self, 0, 0, 7, 0);
delta = device_flags & WheelRotationMask;
if (delta != 0)
{
xrdp_wm_mouse_touch(self, TOUCH_TWO_FINGERS_LEFT, delta);
}
else
{
xrdp_wm_mouse_click(self, 0, 0, 7, 0);
}
}
}

Expand Down
Loading