Skip to content

Commit a56f088

Browse files
authored
Merge pull request #2948 from metalefty/v0.9-inertial-scrolling
[v0.9] Backport touchpad intertial scrolling
2 parents 4114133 + 34819ac commit a56f088

File tree

4 files changed

+96
-4
lines changed

4 files changed

+96
-4
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@ xrdp/xrdp
5353
xrdp/xrdp.ini
5454
xrdp_configure_options.h
5555
xrdpapi/xrdp-xrdpapi-simple
56+
.vscode/*

common/xrdp_constants.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,12 @@
232232
#define BUTTON_STATE_UP 0
233233
#define BUTTON_STATE_DOWN 1
234234

235+
/* touch gestures */
236+
#define TOUCH_TWO_FINGERS_DOWN 0
237+
#define TOUCH_TWO_FINGERS_UP 1
238+
#define TOUCH_TWO_FINGERS_LEFT 2
239+
#define TOUCH_TWO_FINGERS_RIGHT 3
240+
235241
/* messages */
236242
#define WM_PAINT 3
237243
#define WM_KEYDOWN 15
@@ -255,6 +261,10 @@
255261
#define WM_BUTTON8DOWN 116
256262
#define WM_BUTTON9UP 117
257263
#define WM_BUTTON9DOWN 118
264+
265+
#define WM_TOUCH_VSCROLL 140
266+
#define WM_TOUCH_HSCROLL 141
267+
258268
#define WM_INVALIDATE 200
259269

260270
#define CB_ITEMCHANGE 300

xrdp/xrdp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ xrdp_wm_get_vis_region(struct xrdp_wm *self, struct xrdp_bitmap *bitmap,
119119
int
120120
xrdp_wm_mouse_move(struct xrdp_wm *self, int x, int y);
121121
int
122+
xrdp_wm_mouse_touch(struct xrdp_wm *self, int gesture, int param);
123+
int
122124
xrdp_wm_mouse_click(struct xrdp_wm *self, int x, int y, int but, int down);
123125
int
124126
xrdp_wm_key(struct xrdp_wm *self, int device_flags, int scan_code);

xrdp/xrdp_wm.c

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,6 +1224,29 @@ xrdp_wm_clear_popup(struct xrdp_wm *self)
12241224
return 0;
12251225
}
12261226

1227+
/*****************************************************************************/
1228+
int
1229+
xrdp_wm_mouse_touch(struct xrdp_wm *self, int gesture, int param)
1230+
{
1231+
LOG(LOG_LEVEL_DEBUG, "mouse touch event gesture %d param %d", gesture, param);
1232+
1233+
switch (gesture)
1234+
{
1235+
case TOUCH_TWO_FINGERS_UP:
1236+
case TOUCH_TWO_FINGERS_DOWN:
1237+
self->mm->mod->mod_event(self->mm->mod, WM_TOUCH_VSCROLL,
1238+
self->mouse_x, self->mouse_y, param, 0);
1239+
break;
1240+
case TOUCH_TWO_FINGERS_RIGHT:
1241+
case TOUCH_TWO_FINGERS_LEFT:
1242+
self->mm->mod->mod_event(self->mm->mod, WM_TOUCH_HSCROLL,
1243+
self->mouse_x, self->mouse_y, param, 0);
1244+
break;
1245+
}
1246+
1247+
return 0;
1248+
}
1249+
12271250
/*****************************************************************************/
12281251
int
12291252
xrdp_wm_mouse_click(struct xrdp_wm *self, int x, int y, int but, int down)
@@ -1769,13 +1792,41 @@ xrdp_wm_process_input_mouse(struct xrdp_wm *self, int device_flags,
17691792
/* vertical mouse wheel */
17701793
if (device_flags & PTRFLAGS_WHEEL)
17711794
{
1795+
int delta = 0;
17721796
if (device_flags & PTRFLAGS_WHEEL_NEGATIVE)
17731797
{
1774-
xrdp_wm_mouse_click(self, 0, 0, 5, 0);
1798+
/**
1799+
* [MS-RDPBCGR] 2.2.8.1.1.3.1.1.3 Mouse Event (TS_POINTER_EVENT)
1800+
* In negative scrolling, rotation distance is negative and the delta
1801+
* is represented by the lowest byte.
1802+
* Examples:
1803+
* device_flags = 0x020a, positive vertical scrolling, distance 10
1804+
* device_flags = 0x03f6, negative vertical scrolling, distance -10
1805+
*
1806+
* The negative number is represented by complement.
1807+
*/
1808+
delta = (device_flags & WheelRotationMask) | ~WheelRotationMask;
1809+
if (delta != 0)
1810+
{
1811+
// Use nature scrolling, up direction is negative.
1812+
xrdp_wm_mouse_touch(self, TOUCH_TWO_FINGERS_UP, delta);
1813+
}
1814+
else
1815+
{
1816+
xrdp_wm_mouse_click(self, 0, 0, 5, 0);
1817+
}
17751818
}
17761819
else
17771820
{
1778-
xrdp_wm_mouse_click(self, 0, 0, 4, 0);
1821+
delta = device_flags & WheelRotationMask;
1822+
if (delta != 0)
1823+
{
1824+
xrdp_wm_mouse_touch(self, TOUCH_TWO_FINGERS_DOWN, delta);
1825+
}
1826+
else
1827+
{
1828+
xrdp_wm_mouse_click(self, 0, 0, 4, 0);
1829+
}
17791830
}
17801831
}
17811832

@@ -1787,13 +1838,41 @@ xrdp_wm_process_input_mouse(struct xrdp_wm *self, int device_flags,
17871838
*/
17881839
if (device_flags & PTRFLAGS_HWHEEL)
17891840
{
1841+
int delta = 0;
17901842
if (device_flags & PTRFLAGS_WHEEL_NEGATIVE)
17911843
{
1792-
xrdp_wm_mouse_click(self, 0, 0, 6, 0);
1844+
/**
1845+
* [MS-RDPBCGR] 2.2.8.1.1.3.1.1.3 Mouse Event (TS_POINTER_EVENT)
1846+
* In negative scrolling, rotation distance is negative and the delta
1847+
* is represented by the lowest byte.
1848+
* Examples:
1849+
* device_flags = 0x040a, positive horizontal scrolling, distance 10
1850+
* device_flags = 0x05f6, negative horizontal scrolling, distance -10
1851+
*
1852+
* The negative number is represented by complement.
1853+
*/
1854+
delta = (device_flags & WheelRotationMask) | ~WheelRotationMask;
1855+
if (delta != 0)
1856+
{
1857+
// Use nature scrolling, right direction is negative.
1858+
xrdp_wm_mouse_touch(self, TOUCH_TWO_FINGERS_RIGHT, delta);
1859+
}
1860+
else
1861+
{
1862+
xrdp_wm_mouse_click(self, 0, 0, 6, 0);
1863+
}
17931864
}
17941865
else
17951866
{
1796-
xrdp_wm_mouse_click(self, 0, 0, 7, 0);
1867+
delta = device_flags & WheelRotationMask;
1868+
if (delta != 0)
1869+
{
1870+
xrdp_wm_mouse_touch(self, TOUCH_TWO_FINGERS_LEFT, delta);
1871+
}
1872+
else
1873+
{
1874+
xrdp_wm_mouse_click(self, 0, 0, 7, 0);
1875+
}
17971876
}
17981877
}
17991878

0 commit comments

Comments
 (0)