Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/neutrinolabs/xrdp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatt335672 <30179339+matt335672@users.noreply.github.com>2022-09-16 12:22:16 +0300
committerGitHub <noreply@github.com>2022-09-16 12:22:16 +0300
commite1697879ecf14f083515b2b6f96974ebac5d5ec9 (patch)
tree7487d7d17f92f0582ca02f0a29606a00df55970b
parentd80d096e321985f1f334badcd29be399e01eb59e (diff)
parentcb2b32e6c5b13d4da1047363815ab7a36d31702c (diff)
Merge pull request #2364 from seflerZ/touchpad
Enable touchpad inertial scrolling
-rw-r--r--.gitignore1
-rw-r--r--common/xrdp_constants.h10
-rw-r--r--xrdp/xrdp.h2
-rw-r--r--xrdp/xrdp_wm.c87
4 files changed, 96 insertions, 4 deletions
diff --git a/.gitignore b/.gitignore
index c76e1401..8710e975 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,3 +55,4 @@ xrdp/xrdp
xrdp/xrdp.ini
xrdp_configure_options.h
xrdpapi/xrdp-xrdpapi-simple
+.vscode/* \ No newline at end of file
diff --git a/common/xrdp_constants.h b/common/xrdp_constants.h
index 1e844697..ee504cbc 100644
--- a/common/xrdp_constants.h
+++ b/common/xrdp_constants.h
@@ -247,6 +247,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
@@ -270,6 +276,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
diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h
index ae4bf062..19281fd9 100644
--- a/xrdp/xrdp.h
+++ b/xrdp/xrdp.h
@@ -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);
diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c
index 61261a97..af118356 100644
--- a/xrdp/xrdp_wm.c
+++ b/xrdp/xrdp_wm.c
@@ -1232,6 +1232,29 @@ xrdp_wm_clear_popup(struct xrdp_wm *self)
/*****************************************************************************/
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)
{
struct xrdp_bitmap *control;
@@ -1775,13 +1798,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);
+ }
}
}
@@ -1793,13 +1844,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);
+ }
}
}