Commit e8f5394b authored by Peter Hutterer's avatar Peter Hutterer

Add property/option for enabling/disabling tap-n-drag

Signed-off-by: Peter Hutterer's avatarPeter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 20f5269a
......@@ -45,7 +45,7 @@ XORG_DEFAULT_OPTIONS
# Obtain compiler/linker options from server and required extensions
PKG_CHECK_MODULES(XORG, [xorg-server >= 1.10] xproto [inputproto >= 2.2])
PKG_CHECK_MODULES(LIBINPUT, [libinput >= 1.0.901])
PKG_CHECK_MODULES(LIBINPUT, [libinput >= 1.1.901])
# Define a configure option for an alternate input module directory
AC_ARG_WITH(xorg-module-dir,
......
......@@ -30,6 +30,12 @@
/* Tapping default enabled/disabled: BOOL, 1 value, read-only */
#define LIBINPUT_PROP_TAP_DEFAULT "libinput Tapping Enabled Default"
/* Tap drag enabled/disabled: BOOL, 1 value */
#define LIBINPUT_PROP_TAP_DRAG "libinput Tapping Drag Enabled"
/* Tap drag default enabled/disabled: BOOL, 1 value */
#define LIBINPUT_PROP_TAP_DRAG_DEFAULT "libinput Tapping Drag Enabled Default"
/* Tap drag lock enabled/disabled: BOOL, 1 value */
#define LIBINPUT_PROP_TAP_DRAG_LOCK "libinput Tapping Drag Lock Enabled"
......
......@@ -129,6 +129,14 @@ mouse is connected".
.BI "Option \*qTapping\*q \*q" bool \*q
Enables or disables tap-to-click behavior.
.TP 7
.BI "Option \*qTappingDrag\*q \*q" bool \*q
Enables or disables drag during tapping behavior ("tap-and-drag"). When
enabled, a tap followed by a finger held down causes a single button down
only, all motions of that finger thus translate into dragging motion.
Tap-and-drag requires option
.B Tapping
to be enabled.
.TP 7
.BI "Option \*qTappingDragLock\*q \*q" bool \*q
Enables or disables drag lock during tapping behavior. When enabled, a
finger up during tap-and-drag will not immediately release the button. If
......
......@@ -112,6 +112,7 @@ struct xf86libinput {
struct options {
BOOL tapping;
BOOL tap_drag;
BOOL tap_drag_lock;
BOOL natural_scrolling;
BOOL left_handed;
......@@ -386,6 +387,13 @@ LibinputApplyConfig(DeviceIntPtr dev)
"Failed to set Tapping DragLock to %d\n",
driver_data->options.tap_drag_lock);
if (libinput_device_config_tap_get_finger_count(device) > 0 &&
libinput_device_config_tap_set_drag_enabled(device,
driver_data->options.tap_drag) != LIBINPUT_CONFIG_STATUS_SUCCESS)
xf86IDrvMsg(pInfo, X_ERROR,
"Failed to set Tapping Drag to %d\n",
driver_data->options.tap_drag);
if (libinput_device_config_calibration_has_matrix(device) &&
libinput_device_config_calibration_set_matrix(device,
driver_data->options.matrix) != LIBINPUT_CONFIG_STATUS_SUCCESS)
......@@ -1276,6 +1284,30 @@ xf86libinput_parse_tap_option(InputInfoPtr pInfo,
return tap;
}
static inline BOOL
xf86libinput_parse_tap_drag_option(InputInfoPtr pInfo,
struct libinput_device *device)
{
BOOL drag;
if (libinput_device_config_tap_get_finger_count(device) == 0)
return FALSE;
drag = xf86SetBoolOption(pInfo->options,
"TappingDrag",
libinput_device_config_tap_get_drag_enabled(device));
if (libinput_device_config_tap_set_drag_enabled(device, drag) !=
LIBINPUT_CONFIG_STATUS_SUCCESS) {
xf86IDrvMsg(pInfo, X_ERROR,
"Failed to set Tapping Drag Lock to %d\n",
drag);
drag = libinput_device_config_tap_get_drag_enabled(device);
}
return drag;
}
static inline BOOL
xf86libinput_parse_tap_drag_lock_option(InputInfoPtr pInfo,
struct libinput_device *device)
......@@ -1683,6 +1715,7 @@ xf86libinput_parse_options(InputInfoPtr pInfo,
/* libinput options */
options->tapping = xf86libinput_parse_tap_option(pInfo, device);
options->tap_drag = xf86libinput_parse_tap_drag_option(pInfo, device);
options->tap_drag_lock = xf86libinput_parse_tap_drag_lock_option(pInfo, device);
options->speed = xf86libinput_parse_accel_option(pInfo, device);
options->accel_profile = xf86libinput_parse_accel_profile_option(pInfo, device);
......@@ -2046,6 +2079,8 @@ _X_EXPORT XF86ModuleData libinputModuleData = {
/* libinput-specific properties */
static Atom prop_tap;
static Atom prop_tap_default;
static Atom prop_tap_drag;
static Atom prop_tap_drag_default;
static Atom prop_tap_drag_lock;
static Atom prop_tap_drag_lock_default;
static Atom prop_calibration;
......@@ -2135,6 +2170,37 @@ LibinputSetPropertyTap(DeviceIntPtr dev,
return Success;
}
static inline int
LibinputSetPropertyTapDrag(DeviceIntPtr dev,
Atom atom,
XIPropertyValuePtr val,
BOOL checkonly)
{
InputInfoPtr pInfo = dev->public.devicePrivate;
struct xf86libinput *driver_data = pInfo->private;
struct libinput_device *device = driver_data->shared_device->device;
BOOL* data;
if (val->format != 8 || val->size != 1 || val->type != XA_INTEGER)
return BadMatch;
data = (BOOL*)val->data;
if (checkonly) {
if (*data != 0 && *data != 1)
return BadValue;
if (!xf86libinput_check_device(dev, atom))
return BadMatch;
if (libinput_device_config_tap_get_finger_count(device) == 0)
return BadMatch;
} else {
driver_data->options.tap_drag = *data;
}
return Success;
}
static inline int
LibinputSetPropertyTapDragLock(DeviceIntPtr dev,
Atom atom,
......@@ -2673,6 +2739,8 @@ LibinputSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
if (atom == prop_tap)
rc = LibinputSetPropertyTap(dev, atom, val, checkonly);
else if (atom == prop_tap_drag)
rc = LibinputSetPropertyTapDrag(dev, atom, val, checkonly);
else if (atom == prop_tap_drag_lock)
rc = LibinputSetPropertyTapDragLock(dev, atom, val, checkonly);
else if (atom == prop_calibration)
......@@ -2704,6 +2772,7 @@ LibinputSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
rc = LibinputSetPropertyHorizScroll(dev, atom, val, checkonly);
else if (atom == prop_device || atom == prop_product_id ||
atom == prop_tap_default ||
atom == prop_tap_drag_default ||
atom == prop_tap_drag_lock_default ||
atom == prop_calibration_default ||
atom == prop_accel_default ||
......@@ -2777,6 +2846,30 @@ LibinputInitTapProperty(DeviceIntPtr dev,
1, &tap);
}
static void
LibinputInitTapDragProperty(DeviceIntPtr dev,
struct xf86libinput *driver_data,
struct libinput_device *device)
{
BOOL drag = driver_data->options.tap_drag;
if (libinput_device_config_tap_get_finger_count(device) == 0)
return;
prop_tap_drag = LibinputMakeProperty(dev,
LIBINPUT_PROP_TAP_DRAG,
XA_INTEGER, 8,
1, &drag);
if (!prop_tap_drag)
return;
drag = libinput_device_config_tap_get_default_drag_enabled(device);
prop_tap_drag_default = LibinputMakeProperty(dev,
LIBINPUT_PROP_TAP_DRAG_DEFAULT,
XA_INTEGER, 8,
1, &drag);
}
static void
LibinputInitTapDragLockProperty(DeviceIntPtr dev,
struct xf86libinput *driver_data,
......@@ -3293,6 +3386,7 @@ LibinputInitProperty(DeviceIntPtr dev)
prop_float = XIGetKnownProperty("FLOAT");
LibinputInitTapProperty(dev, driver_data, device);
LibinputInitTapDragProperty(dev, driver_data, device);
LibinputInitTapDragLockProperty(dev, driver_data, device);
LibinputInitCalibrationProperty(dev, driver_data, device);
LibinputInitAccelProperty(dev, driver_data, device);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment