Compare commits

...

12 Commits

Author SHA1 Message Date
Peter Hutterer
1c3ce3ce3c xf86-input-libinput 0.23.0
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-12-12 14:54:00 +10:00
Peter Hutterer
4d481ea7c8 Fix default scroll button number
Was exposing the evdev code rather than the xorg code.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2016-12-06 06:59:39 +10:00
Peter Hutterer
72bac84df9 If the parent libinput_device is unavailable, create a new one
The parent device ref's the libinput device during pre_init and unref's it
during DEVICE_INIT, so the copy is lost. During DEVICE_ON, the libinput device
is re-added and ref'd, this one stays around now. But the takeaway is: unless
the device is enabled, no libinput device reference is available.

If a device is a mixed pointer + keyboard device, a subdevice is created
during a WorkProc. The subdevice relied on the parent's libinput_device being
available and didn't even check for it. This WorkProc usually runs after
the parent's DEVICE_ON, so in most cases all is well.

But when running without logind and the server is vt-switched away, the parent
device only runs PreInit and DEVICE_INIT but never DEVICE_ON, causing the
subdevice to burn, crash, and generally fail horribly when it dereferences the
parent's libinput device.

Fix this because we have global warming already and don't need to burn more
things and also because it's considered bad user experience to have the
server crash. The simple fix is to check the parent device first and if it is
unavailable, create a new one because it will end up disabled as well anyway,
so the ref goes away as well. The use-case where the parent somehow gets
disabled but the subdevice doesn't is a bit too niche to worry about.

This doesn't happen with logind because in that case we don't get a usable fd
while VT-switched away, so we can't even run PreInit and never get this far
(see the paused fd handling in the xfree86 code for that). It can be
reproduced by setting AutoEnableDevices off, but why would you do that,
seriously.

https://bugs.freedesktop.org/show_bug.cgi?id=97117

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2016-11-19 16:24:23 +10:00
Peter Hutterer
0b073d90e6 Link the left-handed property between the tools
The property is tablet-wide, not just per tool. So when one tool is updated,
run through all other devices that share the same underlying device.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2016-11-14 13:29:30 +10:00
Peter Hutterer
669fbb0985 Drop indentation for matrix handling
Exit early if the string is NULL to reduce indentation. No functional changes.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-11-01 10:42:19 +10:00
Peter Hutterer
c4f0a9bcb8 conf: match against tablets too
Now that we sort below the xf86-input-wacom driver anyway, there's no good
reason to ignore tablets anymore.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-11-01 10:30:14 +10:00
Peter Hutterer
a61e156326 man: sort the options and properties alphabetically
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-10-27 14:25:09 +10:00
Peter Hutterer
552cbaf466 Don't init the AccelSpeed/LeftHanded properties on the base tablet device
This device never sends events, no point in exposing these options

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
2016-10-27 10:28:08 +10:00
Peter Hutterer
bc91d337d7 Fix potential NULL pointer dereferencing
Found by coverity.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-10-21 07:51:51 +10:00
Peter Hutterer
c8d2293873 Remove superfluous check for next being NULL
is_libinput_device(next) causes a dereference of next anyway, so this cannot
ever be NULL.

Besides, if next ends up as NULL that means we have lost count of how many
remaining devices use libinput, so we have other issues.

Found by coverity.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-10-20 08:38:24 +10:00
Peter Hutterer
a7014aa8c6 Remove two unused variables
They were never used anyway

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-10-20 08:28:26 +10:00
Peter Hutterer
bf7fffde52 Don't init the horiz scroll property on non-pointer devices
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-10-19 11:42:57 +10:00
4 changed files with 213 additions and 173 deletions

View File

@@ -26,3 +26,10 @@ Section "InputClass"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
EndSection
Section "InputClass"
Identifier "libinput tablet catchall"
MatchIsTablet "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
EndSection

View File

@@ -23,7 +23,7 @@
# Initialize Autoconf
AC_PREREQ([2.60])
AC_INIT([xf86-input-libinput],
[0.22.0],
[0.23.0],
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
[xf86-input-libinput])
AC_CONFIG_SRCDIR([Makefile.am])

View File

@@ -41,15 +41,6 @@ The following driver
.B Options
are supported:
.TP 7
.BI "Option \*qDevice\*q \*q" string \*q
Specifies the device through which the device can be accessed. This will
generally be of the form \*q/dev/input/eventX\*q, where X is some integer.
When using
.B InputClass
directives, this option is set by the server.
The mapping from device node to hardware is system-dependent. Property:
"Device Node" (read-only).
.TP 7
.BI "Option \*qAccelProfile\*q \*q" string \*q
Sets the pointer acceleration profile to the given profile. Permitted values
are
@@ -89,72 +80,19 @@ Enables a click method. Permitted values are
Not all devices support all methods, if an option is unsupported, the
default click method for this device is used.
.TP 7
.BI "Option \*qLeftHanded\*q \*q" bool \*q
Enables left-handed button orientation, i.e. swapping left and right buttons.
.TP 7
.BI "Option \*qMiddleEmulation\*q \*q" bool \*q
Enables middle button emulation. When enabled, pressing the left and right
buttons simultaneously produces a middle mouse button click.
.TP 7
.BI "Option \*qNaturalScrolling\*q \*q" bool \*q
Enables or disables natural scrolling behavior.
.TP 7
.BI "Option \*qScrollButton\*q \*q" int \*q
Designates a button as scroll button. If the
.BI ScrollMethod
is
.BI button
and the button is logically held down, x/y axis movement is converted into
scroll events.
.TP 7
.BI "Option \*qScrollMethod\*q \*q" string \*q
Enables a scroll method. Permitted values are
.BI none,
.BI twofinger,
.BI edge,
.BI button.
Not all devices support all options, if an option is unsupported, the
default scroll option for this device is used.
.TP 7
.BI "Option \*qHorizontalScrolling\*q \*q" bool \*q
Disables horizontal scrolling. When disabled, this driver will discard any
horizontal scroll events from libinput. Note that this does not disable
horizontal scrolling, it merely discards the horizontal axis from any scroll
events.
.TP 7
.BI "Option \*qSendEventsMode\*q \*q" (disabled|enabled|disabled-on-external-mouse) \*q
Sets the send events mode to disabled, enabled, or "disable when an external
mouse is connected".
.TP 7
.BI "Option \*qRotationAngle\*q \*q" float \*q
Sets the rotation angle of the device to the given angle, in degrees
clockwise. The angle must be between 0.0 (inclusive) and 360.0 (exclusive).
.TP 7
.BI "Option \*qTapping\*q \*q" bool \*q
Enables or disables tap-to-click behavior.
.TP 7
.BI "Option \*qTappingButtonMap\*q \*q" (lrm|lmr) \*q
Set the button mapping for 1/2/3-finger taps to left/right/middle or
left/middle/right, respectively.
.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
the finger is set down again within the timeout, the dragging process
continues.
.TP 7
.BI "Option \*qDisableWhileTyping\*q \*q" bool \*q
Indicates if the touchpad should be disabled while typing on the keyboard
(this does not apply to modifier keys such as Ctrl or Alt).
.TP 7
.BI "Option \*qDevice\*q \*q" string \*q
Specifies the device through which the device can be accessed. This will
generally be of the form \*q/dev/input/eventX\*q, where X is some integer.
When using
.B InputClass
directives, this option is set by the server.
The mapping from device node to hardware is system-dependent. Property:
"Device Node" (read-only).
.TP 7
.BI "Option \*qDragLockButtons\*q \*q" "L1 B1 L2 B2 ..." \*q
Sets "drag lock buttons" that simulate a button logically down even when it has
been physically released. To logically release a locked button, a second click
@@ -175,6 +113,68 @@ For both meta and button pair configuration, the button numbers are
device button numbers, i.e. the
.B ButtonMapping
applies after drag lock.
.TP 7
.BI "Option \*qHorizontalScrolling\*q \*q" bool \*q
Disables horizontal scrolling. When disabled, this driver will discard any
horizontal scroll events from libinput. Note that this does not disable
horizontal scrolling, it merely discards the horizontal axis from any scroll
events.
.TP 7
.BI "Option \*qLeftHanded\*q \*q" bool \*q
Enables left-handed button orientation, i.e. swapping left and right buttons.
.TP 7
.BI "Option \*qMiddleEmulation\*q \*q" bool \*q
Enables middle button emulation. When enabled, pressing the left and right
buttons simultaneously produces a middle mouse button click.
.TP 7
.BI "Option \*qNaturalScrolling\*q \*q" bool \*q
Enables or disables natural scrolling behavior.
.TP 7
.BI "Option \*qRotationAngle\*q \*q" float \*q
Sets the rotation angle of the device to the given angle, in degrees
clockwise. The angle must be between 0.0 (inclusive) and 360.0 (exclusive).
.TP 7
.BI "Option \*qScrollButton\*q \*q" int \*q
Designates a button as scroll button. If the
.BI ScrollMethod
is
.BI button
and the button is logically held down, x/y axis movement is converted into
scroll events.
.TP 7
.BI "Option \*qScrollMethod\*q \*q" string \*q
Enables a scroll method. Permitted values are
.BI none,
.BI twofinger,
.BI edge,
.BI button.
Not all devices support all options, if an option is unsupported, the
default scroll option for this device is used.
.TP 7
.BI "Option \*qSendEventsMode\*q \*q" (disabled|enabled|disabled-on-external-mouse) \*q
Sets the send events mode to disabled, enabled, or "disable when an external
mouse is connected".
.TP 7
.BI "Option \*qTapping\*q \*q" bool \*q
Enables or disables tap-to-click behavior.
.TP 7
.BI "Option \*qTappingButtonMap\*q \*q" (lrm|lmr) \*q
Set the button mapping for 1/2/3-finger taps to left/right/middle or
left/middle/right, respectively.
.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
the finger is set down again within the timeout, the dragging process
continues.
.PP
For all options, the options are only parsed if the device supports that
configuration option. For all options, the default value is the one used by
@@ -189,26 +189,59 @@ on the device. The following properties are provided by the
.B libinput
driver.
.TP 7
.BI "libinput Tapping Enabled"
1 boolean value (8 bit, 0 or 1). 1 enables tapping
.BI "libinput Accel Speed"
1 32-bit float value, defines the pointer speed. Value range -1, 1
.TP 7
.BI "libinput Tapping Button Mapping Enabled"
2 boolean value (8 bit, 0 or 1), in order "lrm" and "lmr". Indicates which
button mapping is currently enabled on this device.
.TP 7
.BI "libinput Tapping Drag Lock Enabled"
1 boolean value (8 bit, 0 or 1). 1 enables drag lock during tapping
.BI "libinput Button Scrolling Button"
1 32-bit value. Sets the button number to use for button scrolling. This
setting is independent of the scroll method, to enable button scrolling the
method must be set to button-scrolling and a valid button must be set.
.TP 7
.BI "libinput Calibration Matrix"
9 32-bit float values, representing a 3x3 calibration matrix, order is row
1, row 2, row 3
.TP 7
.BI "libinput Accel Speed"
1 32-bit float value, defines the pointer speed. Value range -1, 1
.BI "libinput Click Methods Available"
2 boolean values (8 bit, 0 or 1), in order "buttonareas", "clickfinger".
Indicates which click methods are available on this device.
.TP 7
.BI "libinput Click Methods Enabled"
2 boolean values (8 bit, 0 or 1), in order "buttonareas", "clickfinger".
Indicates which click methods are enabled on this device.
.TP 7
.BI "libinput Drag Lock Buttons"
Either one 8-bit value specifying the meta drag lock button, or a list of
button pairs. See section
.B BUTTON DRAG LOCK
for details.
.TP 7
.BI "libinput Horizontal Scrolling Enabled"
1 boolean value (8 bit, 0 or 1). Indicates whether horizontal scrolling
events are enabled or not.
.TP 7
.BI "libinput Left Handed Enabled"
1 boolean value (8 bit, 0 or 1). Indicates if left-handed mode is enabled or
disabled.
.TP 7
.BI "libinput Middle Emulation Enabled"
1 boolean value (8 bit, 0 or 1). Indicates if middle emulation is enabled or
disabled.
.TP 7
.BI "libinput Natural Scrolling Enabled"
1 boolean value (8 bit, 0 or 1). 1 enables natural scrolling
.TP 7
.BI "libinput Rotation Angle"
1 32-bit float value [0.0 to 360.0). Sets the rotation angle of the device,
clockwise of its natural neutral position.
.TP 7
.BI "libinput Scroll Methods Available"
3 boolean values (8 bit, 0 or 1), in order "two-finger", "edge", "button".
Indicates which scroll methods are available on this device.
.TP 7
.BI "libinput Scroll Method Enabled"
3 boolean values (8 bit, 0 or 1), in order "two-finger", "edge", "button".
Indicates which scroll method is currently enabled on this device.
.TP 7
.BI "libinput Send Events Modes Available"
2 boolean values (8 bit, 0 or 1), in order "disabled" and
"disabled-on-external-mouse". Indicates which send-event modes are available
@@ -219,56 +252,23 @@ on this device.
"disabled-on-external-mouse". Indicates which send-event modes is currently
enabled on this device.
.TP 7
.BI "libinput Left Handed Enabled"
1 boolean value (8 bit, 0 or 1). Indicates if left-handed mode is enabled or
disabled.
.BI "libinput Tapping Enabled"
1 boolean value (8 bit, 0 or 1). 1 enables tapping
.TP 7
.BI "libinput Scroll Methods Available"
3 boolean values (8 bit, 0 or 1), in order "two-finger", "edge", "button".
Indicates which scroll methods are available on this device.
.BI "libinput Tapping Button Mapping Enabled"
2 boolean value (8 bit, 0 or 1), in order "lrm" and "lmr". Indicates which
button mapping is currently enabled on this device.
.TP 7
.BI "libinput Scroll Method Enabled"
3 boolean values (8 bit, 0 or 1), in order "two-finger", "edge", "button".
Indicates which scroll method is currently enabled on this device.
.TP 7
.BI "libinput Button Scrolling Button"
1 32-bit value. Sets the button number to use for button scrolling. This
setting is independent of the scroll method, to enable button scrolling the
method must be set to button-scrolling and a valid button must be set.
.TP 7
.BI "libinput Click Methods Available"
2 boolean values (8 bit, 0 or 1), in order "buttonareas", "clickfinger".
Indicates which click methods are available on this device.
.TP 7
.BI "libinput Click Methods Enabled"
2 boolean values (8 bit, 0 or 1), in order "buttonareas", "clickfinger".
Indicates which click methods are enabled on this device.
.TP 7
.BI "libinput Middle Emulation Enabled"
1 boolean value (8 bit, 0 or 1). Indicates if middle emulation is enabled or
disabled.
.BI "libinput Tapping Drag Lock Enabled"
1 boolean value (8 bit, 0 or 1). 1 enables drag lock during tapping
.TP 7
.BI "libinput Disable While Typing Enabled"
1 boolean value (8 bit, 0 or 1). Indicates if disable while typing is
enabled or disabled.
.TP 7
.BI "libinput Rotation Angle"
1 32-bit float value [0.0 to 360.0). Sets the rotation angle of the device,
clockwise of its natural neutral position.
.PP
The above properties have a
Most properties have a
.BI "libinput <property name> Default"
equivalent that indicates the default value for this setting on this device.
.TP 7
.BI "libinput Drag Lock Buttons"
Either one 8-bit value specifying the meta drag lock button, or a list of
button pairs. See section
.B BUTTON DRAG LOCK
for details.
.TP 7
.BI "libinput Horizontal Scrolling Enabled"
1 boolean value (8 bit, 0 or 1). Indicates whether horizontal scrolling
events are enabled or not.
.SH BUTTON MAPPING
X clients receive events with logical button numbers, where 1, 2, 3

View File

@@ -126,8 +126,6 @@ struct xf86libinput {
struct {
int vdist;
int hdist;
int vdist_remainder;
int hdist_remainder;
} scroll;
struct {
@@ -1164,8 +1162,7 @@ swap_registered_device(InputInfoPtr pInfo)
int sigstate = xf86BlockSIGIO();
#endif
xf86RemoveEnabledDevice(pInfo);
if (next) /* shouldn't ever be NULL anyway */
xf86AddEnabledDevice(next);
xf86AddEnabledDevice(next);
driver_context.registered_InputInfoPtr = next;
#if HAVE_THREADED_INPUT
input_unlock();
@@ -2334,6 +2331,7 @@ xf86libinput_parse_calibration_option(InputInfoPtr pInfo,
{
char *str;
float matrix[9] = { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
int num_calibration;
memcpy(matrix_out, matrix, sizeof(matrix));
@@ -2343,27 +2341,29 @@ xf86libinput_parse_calibration_option(InputInfoPtr pInfo,
libinput_device_config_calibration_get_matrix(device, matrix);
memcpy(matrix_out, matrix, sizeof(matrix));
if ((str = xf86CheckStrOption(pInfo->options,
"CalibrationMatrix",
NULL))) {
int num_calibration = sscanf(str, "%f %f %f %f %f %f %f %f %f ",
&matrix[0], &matrix[1],
&matrix[2], &matrix[3],
&matrix[4], &matrix[5],
&matrix[6], &matrix[7],
&matrix[8]);
if (num_calibration != 9) {
xf86IDrvMsg(pInfo, X_ERROR,
"Invalid matrix: %s, using default\n", str);
} else if (libinput_device_config_calibration_set_matrix(device,
matrix) ==
LIBINPUT_CONFIG_STATUS_SUCCESS) {
memcpy(matrix_out, matrix, sizeof(matrix));
} else
xf86IDrvMsg(pInfo, X_ERROR,
"Failed to apply matrix: %s, using default\n", str);
free(str);
}
str = xf86CheckStrOption(pInfo->options,
"CalibrationMatrix",
NULL);
if (!str)
return;
num_calibration = sscanf(str, "%f %f %f %f %f %f %f %f %f ",
&matrix[0], &matrix[1],
&matrix[2], &matrix[3],
&matrix[4], &matrix[5],
&matrix[6], &matrix[7],
&matrix[8]);
if (num_calibration != 9) {
xf86IDrvMsg(pInfo, X_ERROR,
"Invalid matrix: %s, using default\n", str);
} else if (libinput_device_config_calibration_set_matrix(device,
matrix) ==
LIBINPUT_CONFIG_STATUS_SUCCESS) {
memcpy(matrix_out, matrix, sizeof(matrix));
} else
xf86IDrvMsg(pInfo, X_ERROR,
"Failed to apply matrix: %s, using default\n", str);
free(str);
}
static inline BOOL
@@ -2850,7 +2850,7 @@ xf86libinput_pre_init(InputDriverPtr drv,
struct xf86libinput *driver_data = NULL;
struct xf86libinput_device *shared_device = NULL;
struct libinput *libinput = NULL;
struct libinput_device *device;
struct libinput_device *device = NULL;
char *path = NULL;
bool is_subdevice;
@@ -2885,7 +2885,28 @@ xf86libinput_pre_init(InputDriverPtr drv,
}
is_subdevice = xf86libinput_is_subdevice(pInfo);
if (!is_subdevice) {
if (is_subdevice) {
InputInfoPtr parent;
struct xf86libinput *parent_driver_data;
parent = xf86libinput_get_parent(pInfo);
if (!parent) {
xf86IDrvMsg(pInfo, X_ERROR, "Failed to find parent device\n");
goto fail;
}
parent_driver_data = parent->private;
if (!parent_driver_data) /* parent already removed again */
goto fail;
xf86IDrvMsg(pInfo, X_INFO, "is a virtual subdevice\n");
shared_device = xf86libinput_shared_ref(parent_driver_data->shared_device);
device = shared_device->device;
if (!device)
xf86IDrvMsg(pInfo, X_ERROR, "Parent device not available\n");
}
if (!device) {
device = libinput_path_add_device(libinput, path);
if (!device) {
xf86IDrvMsg(pInfo, X_ERROR, "Failed to create a device for %s\n", path);
@@ -2903,23 +2924,6 @@ xf86libinput_pre_init(InputDriverPtr drv,
libinput_device_unref(device);
goto fail;
}
} else {
InputInfoPtr parent;
struct xf86libinput *parent_driver_data;
parent = xf86libinput_get_parent(pInfo);
if (!parent) {
xf86IDrvMsg(pInfo, X_ERROR, "Failed to find parent device\n");
goto fail;
}
parent_driver_data = parent->private;
if (!parent_driver_data) /* parent already removed again */
goto fail;
xf86IDrvMsg(pInfo, X_INFO, "is a virtual subdevice\n");
shared_device = xf86libinput_shared_ref(parent_driver_data->shared_device);
device = shared_device->device;
}
pInfo->private = driver_data;
@@ -2971,10 +2975,12 @@ xf86libinput_pre_init(InputDriverPtr drv,
return Success;
fail:
if (driver_data->valuators)
valuator_mask_free(&driver_data->valuators);
if (driver_data->valuators_unaccelerated)
valuator_mask_free(&driver_data->valuators_unaccelerated);
if (driver_data) {
if (driver_data->valuators)
valuator_mask_free(&driver_data->valuators);
if (driver_data->valuators_unaccelerated)
valuator_mask_free(&driver_data->valuators_unaccelerated);
}
free(path);
if (shared_device)
xf86libinput_shared_unref(shared_device);
@@ -3492,7 +3498,28 @@ LibinputSetPropertyLeftHanded(DeviceIntPtr dev,
if (!supported && left_handed)
return BadValue;
} else {
struct xf86libinput *other;
driver_data->options.left_handed = *data;
xorg_list_for_each_entry(other,
&driver_data->shared_device->device_list,
shared_device_link) {
DeviceIntPtr other_device = other->pInfo->dev;
if (other->options.left_handed == *data)
continue;
XIChangeDeviceProperty(other_device,
atom,
val->type,
val->format,
PropModeReplace,
val->size,
val->data,
TRUE);
}
}
return Success;
@@ -4093,7 +4120,8 @@ LibinputInitAccelProperty(DeviceIntPtr dev,
enum libinput_config_accel_profile profile;
BOOL profiles[2] = {FALSE};
if (!libinput_device_config_accel_is_available(device))
if (!libinput_device_config_accel_is_available(device) ||
driver_data->capabilities & CAP_TABLET)
return;
prop_accel = LibinputMakeProperty(dev,
@@ -4261,7 +4289,8 @@ LibinputInitLeftHandedProperty(DeviceIntPtr dev,
{
BOOL left_handed = driver_data->options.left_handed;
if (!libinput_device_config_left_handed_is_available(device))
if (!libinput_device_config_left_handed_is_available(device) ||
driver_data->capabilities & CAP_TABLET)
return;
prop_left_handed = LibinputMakeProperty(dev,
@@ -4357,6 +4386,7 @@ LibinputInitScrollMethodsProperty(DeviceIntPtr dev,
return;
scroll_button = libinput_device_config_scroll_get_default_button(device);
scroll_button = btn_linux2xorg(scroll_button);
prop_scroll_button_default = LibinputMakeProperty(dev,
LIBINPUT_PROP_SCROLL_BUTTON_DEFAULT,
XA_CARDINAL, 32,
@@ -4653,6 +4683,9 @@ LibinputInitHorizScrollProperty(DeviceIntPtr dev,
{
BOOL enabled = driver_data->options.horiz_scrolling_enabled;
if ((driver_data->capabilities & CAP_POINTER) == 0)
return;
prop_horiz_scroll = LibinputMakeProperty(dev,
LIBINPUT_PROP_HORIZ_SCROLL_ENABLED,
XA_INTEGER, 8,