xfree86: Implement gesture support for test input driver

This commit is contained in:
Povilas Kanapickas 2021-05-30 13:26:45 +03:00
parent dccc0275f4
commit 1cdc3b5d14
2 changed files with 86 additions and 1 deletions

View File

@ -31,7 +31,7 @@ extern "C" {
#include <stdint.h>
#define XF86IT_PROTOCOL_VERSION_MAJOR 1
#define XF86IT_PROTOCOL_VERSION_MINOR 0
#define XF86IT_PROTOCOL_VERSION_MINOR 1
enum xf86ITResponseType {
XF86IT_RESPONSE_SERVER_VERSION,
@ -70,6 +70,8 @@ enum xf86ITEventType {
XF86IT_EVENT_BUTTON,
XF86IT_EVENT_KEY,
XF86IT_EVENT_TOUCH,
XF86IT_EVENT_GESTURE_PINCH,
XF86IT_EVENT_GESTURE_SWIPE,
};
typedef struct {
@ -127,6 +129,30 @@ typedef struct {
xf86ITValuatorData valuators;
} xf86ITEventTouch;
typedef struct {
xf86ITEventHeader header;
uint16_t gesture_type;
uint16_t num_touches;
uint32_t flags;
double delta_x;
double delta_y;
double delta_unaccel_x;
double delta_unaccel_y;
double scale;
double delta_angle;
} xf86ITEventGesturePinch;
typedef struct {
xf86ITEventHeader header;
uint16_t gesture_type;
uint16_t num_touches;
uint32_t flags;
double delta_x;
double delta_y;
double delta_unaccel_x;
double delta_unaccel_y;
} xf86ITEventGestureSwipe;
typedef union {
xf86ITEventHeader header;
xf86ITEventClientVersion version;
@ -135,6 +161,8 @@ typedef union {
xf86ITEventButton button;
xf86ITEventKey key;
xf86ITEventTouch touch;
xf86ITEventGesturePinch pinch;
xf86ITEventGestureSwipe swipe;
} xf86ITEventAny;
#ifdef __cplusplus

View File

@ -58,6 +58,7 @@
enum xf86ITDeviceType {
DEVICE_KEYBOARD = 1,
DEVICE_POINTER,
DEVICE_POINTER_GESTURE,
DEVICE_POINTER_ABS,
DEVICE_POINTER_ABS_PROXIMITY,
DEVICE_TOUCH,
@ -474,6 +475,14 @@ init_touch(InputInfoPtr pInfo)
InitTouchClassDeviceStruct(dev, ntouches, XIDirectTouch, 2);
}
static void
init_gesture(InputInfoPtr pInfo)
{
DeviceIntPtr dev = pInfo->dev;
int ntouches = TOUCH_MAX_SLOTS;
InitGestureClassDeviceStruct(dev, ntouches);
}
static void
device_init(DeviceIntPtr dev)
{
@ -489,6 +498,10 @@ device_init(DeviceIntPtr dev)
case DEVICE_POINTER:
init_pointer(pInfo);
break;
case DEVICE_POINTER_GESTURE:
init_pointer(pInfo);
init_gesture(pInfo);
break;
case DEVICE_POINTER_ABS:
init_pointer_absolute(pInfo);
break;
@ -678,6 +691,37 @@ handle_touch(InputInfoPtr pInfo, xf86ITEventTouch *event)
xf86PostTouchEvent(dev, event->touchid, event->touch_type, 0, mask);
}
static void
handle_gesture_swipe(InputInfoPtr pInfo, xf86ITEventGestureSwipe *event)
{
DeviceIntPtr dev = pInfo->dev;
xf86ITDevicePtr driver_data = pInfo->private;
xf86IDrvMsg(pInfo, X_DEBUG, "Handling gesture swipe event\n");
driver_data->last_event_num++;
xf86PostGestureSwipeEvent(dev, event->gesture_type, event->num_touches, event->flags,
event->delta_x, event->delta_y,
event->delta_unaccel_x, event->delta_unaccel_y);
}
static void
handle_gesture_pinch(InputInfoPtr pInfo, xf86ITEventGesturePinch *event)
{
DeviceIntPtr dev = pInfo->dev;
xf86ITDevicePtr driver_data = pInfo->private;
xf86IDrvMsg(pInfo, X_DEBUG, "Handling gesture pinch event\n");
driver_data->last_event_num++;
xf86PostGesturePinchEvent(dev, event->gesture_type, event->num_touches, event->flags,
event->delta_x, event->delta_y,
event->delta_unaccel_x, event->delta_unaccel_y,
event->scale, event->delta_angle);
}
static void
client_new_handle_event(InputInfoPtr pInfo, xf86ITEventAny *event)
{
@ -715,6 +759,12 @@ client_ready_handle_event(InputInfoPtr pInfo, xf86ITEventAny *event)
case XF86IT_EVENT_TOUCH:
handle_touch(pInfo, &event->touch);
break;
case XF86IT_EVENT_GESTURE_PINCH:
handle_gesture_pinch(pInfo, &(event->pinch));
break;
case XF86IT_EVENT_GESTURE_SWIPE:
handle_gesture_swipe(pInfo, &(event->swipe));
break;
case XF86IT_EVENT_CLIENT_VERSION:
xf86IDrvMsg(pInfo, X_ERROR, "Only single ClientVersion event is allowed\n");
teardown_client_connection(pInfo);
@ -759,6 +809,8 @@ is_supported_event(enum xf86ITEventType type)
case XF86IT_EVENT_BUTTON:
case XF86IT_EVENT_KEY:
case XF86IT_EVENT_TOUCH:
case XF86IT_EVENT_GESTURE_PINCH:
case XF86IT_EVENT_GESTURE_SWIPE:
return true;
}
return false;
@ -775,6 +827,8 @@ get_event_size(enum xf86ITEventType type)
case XF86IT_EVENT_BUTTON: return sizeof(xf86ITEventButton);
case XF86IT_EVENT_KEY: return sizeof(xf86ITEventKey);
case XF86IT_EVENT_TOUCH: return sizeof(xf86ITEventTouch);
case XF86IT_EVENT_GESTURE_PINCH: return sizeof(xf86ITEventGesturePinch);
case XF86IT_EVENT_GESTURE_SWIPE: return sizeof(xf86ITEventGestureSwipe);
}
abort();
}
@ -864,6 +918,7 @@ get_type_name(InputInfoPtr pInfo, xf86ITDevicePtr driver_data)
switch (driver_data->device_type) {
case DEVICE_TOUCH: return XI_TOUCHSCREEN;
case DEVICE_POINTER: return XI_MOUSE;
case DEVICE_POINTER_GESTURE: return XI_TOUCHPAD;
case DEVICE_POINTER_ABS: return XI_MOUSE;
case DEVICE_POINTER_ABS_PROXIMITY: return XI_TABLET;
case DEVICE_KEYBOARD: return XI_KEYBOARD;
@ -986,6 +1041,8 @@ pre_init(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
driver_data->device_type = DEVICE_KEYBOARD;
} else if (strcmp(device_type_option, "Pointer") == 0) {
driver_data->device_type = DEVICE_POINTER;
} else if (strcmp(device_type_option, "PointerGesture") == 0) {
driver_data->device_type = DEVICE_POINTER_GESTURE;
} else if (strcmp(device_type_option, "PointerAbsolute") == 0) {
driver_data->device_type = DEVICE_POINTER_ABS;
} else if (strcmp(device_type_option, "PointerAbsoluteProximity") == 0) {