|
|
314a7ca |
From 317ce1201a2ec848f9066294ea544b756f735385 Mon Sep 17 00:00:00 2001
|
|
|
314a7ca |
From: Peter Hutterer <peter.hutterer@who-t.net>
|
|
|
314a7ca |
Date: Tue, 7 Feb 2017 12:23:46 +1000
|
|
|
314a7ca |
Subject: [PATCH xserver 06/12] xwayland: handle button events after motion
|
|
|
314a7ca |
events
|
|
|
314a7ca |
|
|
|
314a7ca |
Make sure the button events are sent after the motion events into the new
|
|
|
314a7ca |
position.
|
|
|
314a7ca |
|
|
|
314a7ca |
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
|
|
314a7ca |
Acked-by: Ping Cheng <ping.cheng@wacom.com>
|
|
|
314a7ca |
(cherry picked from commit 773b04748d0c839bc8b12e33f74bb8d11c447f5b)
|
|
|
314a7ca |
---
|
|
|
314a7ca |
hw/xwayland/xwayland-input.c | 44 +++++++++++++++++++++++++++++++++++++-------
|
|
|
314a7ca |
hw/xwayland/xwayland.h | 3 +++
|
|
|
314a7ca |
2 files changed, 40 insertions(+), 7 deletions(-)
|
|
|
314a7ca |
|
|
|
314a7ca |
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
|
|
|
314a7ca |
index 142862f7e..50da10839 100644
|
|
|
314a7ca |
--- a/hw/xwayland/xwayland-input.c
|
|
|
314a7ca |
+++ b/hw/xwayland/xwayland-input.c
|
|
|
314a7ca |
@@ -34,6 +34,7 @@
|
|
|
314a7ca |
#include <inpututils.h>
|
|
|
314a7ca |
#include <mipointer.h>
|
|
|
314a7ca |
#include <mipointrst.h>
|
|
|
314a7ca |
+#include <misc.h>
|
|
|
314a7ca |
#include "tablet-unstable-v2-client-protocol.h"
|
|
|
314a7ca |
|
|
|
314a7ca |
/* Copied from mipointer.c */
|
|
|
314a7ca |
@@ -1543,8 +1544,8 @@ tablet_tool_button_state(void *data, struct zwp_tablet_tool_v2 *tool,
|
|
|
314a7ca |
{
|
|
|
314a7ca |
struct xwl_tablet_tool *xwl_tablet_tool = data;
|
|
|
314a7ca |
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
|
|
|
314a7ca |
+ uint32_t *mask = &xwl_tablet_tool->buttons_now;
|
|
|
314a7ca |
int xbtn = 0;
|
|
|
314a7ca |
- ValuatorMask mask;
|
|
|
314a7ca |
|
|
|
314a7ca |
/* BTN_0 .. BTN_9 */
|
|
|
314a7ca |
if (button >= 0x100 && button <= 0x109) {
|
|
|
314a7ca |
@@ -1592,11 +1593,14 @@ tablet_tool_button_state(void *data, struct zwp_tablet_tool_v2 *tool,
|
|
|
314a7ca |
return;
|
|
|
314a7ca |
}
|
|
|
314a7ca |
|
|
|
314a7ca |
- xwl_seat->xwl_screen->serial = serial;
|
|
|
314a7ca |
+ BUG_RETURN(xbtn >= 8 * sizeof(*mask));
|
|
|
314a7ca |
|
|
|
314a7ca |
- valuator_mask_zero(&mask);
|
|
|
314a7ca |
- QueuePointerEvents(xwl_tablet_tool->xdevice,
|
|
|
314a7ca |
- state ? ButtonPress : ButtonRelease, xbtn, 0, &mask);
|
|
|
314a7ca |
+ if (state)
|
|
|
314a7ca |
+ SetBit(mask, xbtn);
|
|
|
314a7ca |
+ else
|
|
|
314a7ca |
+ ClearBit(mask, xbtn);
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xwl_seat->xwl_screen->serial = serial;
|
|
|
314a7ca |
}
|
|
|
314a7ca |
|
|
|
314a7ca |
static void
|
|
|
314a7ca |
@@ -1604,6 +1608,8 @@ tablet_tool_frame(void *data, struct zwp_tablet_tool_v2 *tool, uint32_t time)
|
|
|
314a7ca |
{
|
|
|
314a7ca |
struct xwl_tablet_tool *xwl_tablet_tool = data;
|
|
|
314a7ca |
ValuatorMask mask;
|
|
|
314a7ca |
+ uint32_t released, pressed, diff;
|
|
|
314a7ca |
+ int button;
|
|
|
314a7ca |
|
|
|
314a7ca |
valuator_mask_zero(&mask);
|
|
|
314a7ca |
valuator_mask_set(&mask, 0, xwl_tablet_tool->x);
|
|
|
314a7ca |
@@ -1613,10 +1619,34 @@ tablet_tool_frame(void *data, struct zwp_tablet_tool_v2 *tool, uint32_t time)
|
|
|
314a7ca |
valuator_mask_set(&mask, 4, xwl_tablet_tool->tilt_y);
|
|
|
314a7ca |
valuator_mask_set(&mask, 5, xwl_tablet_tool->rotation + xwl_tablet_tool->slider);
|
|
|
314a7ca |
|
|
|
314a7ca |
- /* FIXME: Store button mask in xwl_tablet_tool and send events *HERE* if
|
|
|
314a7ca |
- changed */
|
|
|
314a7ca |
QueuePointerEvents(xwl_tablet_tool->xdevice, MotionNotify, 0,
|
|
|
314a7ca |
POINTER_ABSOLUTE | POINTER_SCREEN, &mask);
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ valuator_mask_zero(&mask);
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ diff = xwl_tablet_tool->buttons_prev ^ xwl_tablet_tool->buttons_now;
|
|
|
314a7ca |
+ released = diff & ~xwl_tablet_tool->buttons_now;
|
|
|
314a7ca |
+ pressed = diff & xwl_tablet_tool->buttons_now;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ button = 1;
|
|
|
314a7ca |
+ while (released) {
|
|
|
314a7ca |
+ if (released & 0x1)
|
|
|
314a7ca |
+ QueuePointerEvents(xwl_tablet_tool->xdevice,
|
|
|
314a7ca |
+ ButtonRelease, button, 0, &mask);
|
|
|
314a7ca |
+ button++;
|
|
|
314a7ca |
+ released >>= 1;
|
|
|
314a7ca |
+ }
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ button = 1;
|
|
|
314a7ca |
+ while (pressed) {
|
|
|
314a7ca |
+ if (pressed & 0x1)
|
|
|
314a7ca |
+ QueuePointerEvents(xwl_tablet_tool->xdevice,
|
|
|
314a7ca |
+ ButtonPress, button, 0, &mask);
|
|
|
314a7ca |
+ button++;
|
|
|
314a7ca |
+ pressed >>= 1;
|
|
|
314a7ca |
+ }
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xwl_tablet_tool->buttons_prev = xwl_tablet_tool->buttons_now;
|
|
|
314a7ca |
}
|
|
|
314a7ca |
|
|
|
314a7ca |
static const struct zwp_tablet_tool_v2_listener tablet_tool_listener = {
|
|
|
314a7ca |
diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
|
|
|
314a7ca |
index fb9ac4804..bb119dad7 100644
|
|
|
314a7ca |
--- a/hw/xwayland/xwayland.h
|
|
|
314a7ca |
+++ b/hw/xwayland/xwayland.h
|
|
|
314a7ca |
@@ -202,6 +202,9 @@ struct xwl_tablet_tool {
|
|
|
314a7ca |
float tilt_y;
|
|
|
314a7ca |
float rotation;
|
|
|
314a7ca |
float slider;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ uint32_t buttons_now,
|
|
|
314a7ca |
+ buttons_prev;
|
|
|
314a7ca |
};
|
|
|
314a7ca |
|
|
|
314a7ca |
struct xwl_tablet_pad {
|
|
|
314a7ca |
--
|
|
|
314a7ca |
2.13.5
|
|
|
314a7ca |
|