mirror of
https://github.com/X11Libre/xf86-input-libinput.git
synced 2026-03-24 01:24:04 +00:00
Implement support for touchpad gestures
This commit is contained in:
@@ -78,6 +78,11 @@
|
||||
#define CAP_TABLET 0x8
|
||||
#define CAP_TABLET_TOOL 0x10
|
||||
#define CAP_TABLET_PAD 0x20
|
||||
#define CAP_GESTURE 0x40
|
||||
|
||||
#if ABI_XINPUT_VERSION >= SET_ABI_VERSION(24, 4)
|
||||
#define HAS_GESTURES
|
||||
#endif
|
||||
|
||||
struct xf86libinput_driver {
|
||||
struct libinput *libinput;
|
||||
@@ -1089,9 +1094,18 @@ xf86libinput_init_touch(InputInfoPtr pInfo)
|
||||
if (ntouches == 0) /* unknown - mtdev */
|
||||
ntouches = TOUCH_MAX_SLOTS;
|
||||
InitTouchClassDeviceStruct(dev, ntouches, XIDirectTouch, 2);
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAS_GESTURES
|
||||
static void
|
||||
xf86libinput_init_gesture(InputInfoPtr pInfo)
|
||||
{
|
||||
DeviceIntPtr dev = pInfo->dev;
|
||||
int ntouches = TOUCH_MAX_SLOTS;
|
||||
InitGestureClassDeviceStruct(dev, ntouches);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
xf86libinput_init_tablet_pen_or_eraser(InputInfoPtr pInfo,
|
||||
struct libinput_tablet_tool *tool)
|
||||
@@ -1335,6 +1349,10 @@ xf86libinput_init(DeviceIntPtr dev)
|
||||
}
|
||||
if (driver_data->capabilities & CAP_TOUCH)
|
||||
xf86libinput_init_touch(pInfo);
|
||||
#ifdef HAS_GESTURES
|
||||
if (driver_data->capabilities & CAP_GESTURE)
|
||||
xf86libinput_init_gesture(pInfo);
|
||||
#endif
|
||||
if (driver_data->capabilities & CAP_TABLET_TOOL)
|
||||
xf86libinput_init_tablet(pInfo);
|
||||
if (driver_data->capabilities & CAP_TABLET_PAD)
|
||||
@@ -1737,6 +1755,86 @@ xf86libinput_handle_touch(InputInfoPtr pInfo,
|
||||
xf86PostTouchEvent(dev, touchids[slot], type, 0, m);
|
||||
}
|
||||
|
||||
#ifdef HAS_GESTURES
|
||||
static void
|
||||
xf86libinput_handle_gesture_swipe(InputInfoPtr pInfo,
|
||||
struct libinput_event_gesture *event,
|
||||
enum libinput_event_type event_type)
|
||||
{
|
||||
DeviceIntPtr dev = pInfo->dev;
|
||||
struct xf86libinput *driver_data = pInfo->private;
|
||||
int type;
|
||||
uint32_t flags = 0;
|
||||
|
||||
if ((driver_data->capabilities & CAP_GESTURE) == 0)
|
||||
return;
|
||||
|
||||
switch (event_type) {
|
||||
case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
|
||||
type = XI_GestureSwipeBegin;
|
||||
break;
|
||||
case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
|
||||
type = XI_GestureSwipeUpdate;
|
||||
break;
|
||||
case LIBINPUT_EVENT_GESTURE_SWIPE_END:
|
||||
type = XI_GestureSwipeEnd;
|
||||
if (libinput_event_gesture_get_cancelled(event))
|
||||
flags |= XIGestureSwipeEventCancelled;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
xf86PostGestureSwipeEvent(dev, type,
|
||||
libinput_event_gesture_get_finger_count(event),
|
||||
flags,
|
||||
libinput_event_gesture_get_dx(event),
|
||||
libinput_event_gesture_get_dy(event),
|
||||
libinput_event_gesture_get_dx_unaccelerated(event),
|
||||
libinput_event_gesture_get_dy_unaccelerated(event));
|
||||
}
|
||||
|
||||
static void
|
||||
xf86libinput_handle_gesture_pinch(InputInfoPtr pInfo,
|
||||
struct libinput_event_gesture *event,
|
||||
enum libinput_event_type event_type)
|
||||
{
|
||||
DeviceIntPtr dev = pInfo->dev;
|
||||
struct xf86libinput *driver_data = pInfo->private;
|
||||
int type;
|
||||
uint32_t flags = 0;
|
||||
|
||||
if ((driver_data->capabilities & CAP_GESTURE) == 0)
|
||||
return;
|
||||
|
||||
switch (event_type) {
|
||||
case LIBINPUT_EVENT_GESTURE_PINCH_BEGIN:
|
||||
type = XI_GesturePinchBegin;
|
||||
break;
|
||||
case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
|
||||
type = XI_GesturePinchUpdate;
|
||||
break;
|
||||
case LIBINPUT_EVENT_GESTURE_PINCH_END:
|
||||
type = XI_GesturePinchEnd;
|
||||
if (libinput_event_gesture_get_cancelled(event))
|
||||
flags |= XIGesturePinchEventCancelled;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
xf86PostGesturePinchEvent(dev, type,
|
||||
libinput_event_gesture_get_finger_count(event),
|
||||
flags,
|
||||
libinput_event_gesture_get_dx(event),
|
||||
libinput_event_gesture_get_dy(event),
|
||||
libinput_event_gesture_get_dx_unaccelerated(event),
|
||||
libinput_event_gesture_get_dy_unaccelerated(event),
|
||||
libinput_event_gesture_get_scale(event),
|
||||
libinput_event_gesture_get_angle_delta(event));
|
||||
}
|
||||
#endif
|
||||
|
||||
static InputInfoPtr
|
||||
xf86libinput_pick_device(struct xf86libinput_device *shared_device,
|
||||
struct libinput_event *event)
|
||||
@@ -2295,9 +2393,20 @@ xf86libinput_handle_event(struct libinput_event *event)
|
||||
case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
|
||||
case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
|
||||
case LIBINPUT_EVENT_GESTURE_SWIPE_END:
|
||||
#ifdef HAS_GESTURES
|
||||
xf86libinput_handle_gesture_swipe(pInfo,
|
||||
libinput_event_get_gesture_event(event),
|
||||
type);
|
||||
#endif
|
||||
break;
|
||||
case LIBINPUT_EVENT_GESTURE_PINCH_BEGIN:
|
||||
case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
|
||||
case LIBINPUT_EVENT_GESTURE_PINCH_END:
|
||||
#ifdef HAS_GESTURES
|
||||
xf86libinput_handle_gesture_pinch(pInfo,
|
||||
libinput_event_get_gesture_event(event),
|
||||
type);
|
||||
#endif
|
||||
break;
|
||||
case LIBINPUT_EVENT_TABLET_TOOL_AXIS:
|
||||
event_handling = xf86libinput_handle_tablet_axis(pInfo,
|
||||
@@ -3295,6 +3404,10 @@ xf86libinput_create_subdevice(InputInfoPtr pInfo,
|
||||
options = xf86ReplaceBoolOption(options, "_libinput/cap-pointer", 1);
|
||||
if (capabilities & CAP_TOUCH)
|
||||
options = xf86ReplaceBoolOption(options, "_libinput/cap-touch", 1);
|
||||
#ifdef HAS_GESTURES
|
||||
if (capabilities & CAP_GESTURE)
|
||||
options = xf86ReplaceBoolOption(options, "_libinput/cap-gesture", 1);
|
||||
#endif
|
||||
if (capabilities & CAP_TABLET_TOOL)
|
||||
options = xf86ReplaceBoolOption(options, "_libinput/cap-tablet-tool", 1);
|
||||
if (capabilities & CAP_TABLET_PAD)
|
||||
@@ -3333,6 +3446,10 @@ caps_from_options(InputInfoPtr pInfo)
|
||||
capabilities |= CAP_POINTER;
|
||||
if (xf86CheckBoolOption(pInfo->options, "_libinput/cap-touch", 0))
|
||||
capabilities |= CAP_TOUCH;
|
||||
#ifdef HAS_GESTURES
|
||||
if (xf86CheckBoolOption(pInfo->options, "_libinput/cap-gesture", 0))
|
||||
capabilities |= CAP_GESTURE;
|
||||
#endif
|
||||
if (xf86CheckBoolOption(pInfo->options, "_libinput/cap-tablet-tool", 0))
|
||||
capabilities |= CAP_TABLET_TOOL;
|
||||
|
||||
@@ -3478,6 +3595,10 @@ xf86libinput_pre_init(InputDriverPtr drv,
|
||||
driver_data->capabilities |= CAP_KEYBOARD;
|
||||
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH))
|
||||
driver_data->capabilities |= CAP_TOUCH;
|
||||
#ifdef HAS_GESTURES
|
||||
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_GESTURE))
|
||||
driver_data->capabilities |= CAP_GESTURE;
|
||||
#endif
|
||||
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_TOOL))
|
||||
driver_data->capabilities |= CAP_TABLET;
|
||||
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_PAD))
|
||||
@@ -3500,7 +3621,7 @@ xf86libinput_pre_init(InputDriverPtr drv,
|
||||
* this device, create a separate device instead */
|
||||
if (!is_subdevice &&
|
||||
driver_data->capabilities & CAP_KEYBOARD &&
|
||||
driver_data->capabilities & (CAP_POINTER|CAP_TOUCH)) {
|
||||
driver_data->capabilities & (CAP_POINTER|CAP_TOUCH|CAP_GESTURE)) {
|
||||
driver_data->capabilities &= ~CAP_KEYBOARD;
|
||||
xf86libinput_create_subdevice(pInfo,
|
||||
CAP_KEYBOARD,
|
||||
|
||||
Reference in New Issue
Block a user