Commit Graph

82 Commits

Author SHA1 Message Date
Peter Hutterer
1e88664d95 Use the libinput touch count to init the right number of touches
Initial version by Johannes Pointner <h4nn35.work@gmail.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-05-02 13:59:00 +10:00
Peter Hutterer
d84e0035d1 Implement the custom acceleration curve options
One new property, and the existing accel profile gets extended to keep one
extra value. The new property libinput Accel Curve Points is a list of pairs
of points to be added to the acceleration curve.

libinput only supports adding points to the curve so we simply declare the
behavior as undefined when the curve is set multiple times. Also helps to
identify those that bother to read the man page before playing with random
driver values.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-04-20 14:04:25 +10:00
Peter Hutterer
6c75acfcdf Use xf86SetStrOption to check for string options
This one shows up in the log and marks it as used.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-04-20 13:34:23 +10:00
Evangelos Foutras
0db82219bb Fix "left handed" property not set on all pointers
Remove conditional that prevents the LIBINPUT_PROP_LEFT_HANDED{,DEFAULT}
properties from being set on all pointer devices (only the first got it).
This appears to be a debugging left-over accidentally merged in
6d3bd4544a.

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

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-03-22 10:59:01 +10:00
Peter Hutterer
9d9f59fd4c Apply the capabilities checks on subdevices when applying the config
Properties are initialized on the correct devices only but on resume we'd just
blindly apply the config from our device. Depending on the resume order, this
would mean we'd apply a previously set config with a default config.

Example:
* pointer device with keyboard subdevice
* pointer device exports natural scrolling, keyboard device does not and
  remains at default (off)
* client enables natural scrolling on the pointer device
* VT switch away, VT switch back
* pointer device gets enabled first, enables natural scrolling on the
  libinput device
* keyboard device gets enabled second, resets to the default value

Reported-by: Yuxuan Shui <yshuiv7@gmail.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Tested-by: Yuxuan Shui <yshuiv7@gmail.com>
2018-02-21 09:53:12 +10:00
Peter Hutterer
7353481490 Split LibinputDeviceApplyConfig into helper functions
No functional changes
2018-02-02 14:25:44 +10:00
Peter Hutterer
6d3bd4544a Move the subdevice capabilities check into the properties
87f9fe3a6fafe60134c6's intention was to not create properties that a subdevice
doesn't have configuration options for (i.e. if you have a pointer+keyboard
device, don't expose tapping configuration on the keyboard subdevice).

The result was messy, the checker function had a confusing triple-negation and
some properties weren't checked - e.g. left-handed was allowed for touch/tablet
but not for pointer, dwt was allowed for any device.

Fix this by moving the check into the property init function directly and
inverting the helper function to be easier to read.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-02-02 14:25:31 +10:00
Peter Hutterer
6ce3d0249d Post a motion event before a tablet button down
Not all clients update the pointer position correctly from the button events
(for historical reasons) so we need to send a motion event before the button
event that represents a tip state change.

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

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-08-17 15:20:29 +10:00
Peter Hutterer
87f9fe3a6f Only initialize properties that match capabilities on a subdevice
If a device is split into multiple subdevices, usually pointer+keyboard, we
initialized properties matching the libinput device on both devices. This
results in the keyboard having e.g. a Accel Speed or Left Handed settings even
though it cannot send any events of that type.

Filter by capabilities on the subdevice so we only get those properties that
match the subdevice's capabilities.

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

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-05-29 08:15:20 +10:00
Peter Hutterer
0c657e0dcf Update copyright years
because why not

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-05-18 14:03:06 +10:00
Peter Hutterer
8bc694595d Post a motion event after proximity events
This patch splits the meat of xf86libinput_handle_tablet_axis into a helper
function xf86libinput_post_tablet_motion(), to be called right after we send
the proximity in event.

Clients that don't handle proximity (e.g. all XI2 clients) don't see the
coordinates we send along with the proximity events. And, for historical
reasons, they may not look at the coordinates in button events. So a device
that comes into proximity and immediately sends a tip down button event
doesn't send a motion event, causing the client to think the tip down was at
whatever the last known position was (before previous prox-out).

The practical effect is that when a user tries to draw a few dots, they end up
being connected to each other.

https://bugzilla.redhat.com/show_bug.cgi?id=1433755

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-03-22 11:14:15 +10:00
Peter Hutterer
aae2c8ad9a Open sysfs files directly instead of going through the server
Only use-case here are pad mode LEDs that now live in /sys/class/leds. Asking
the server to open them is pointless, the server only knows how to open Option
"Device". And since the LEDs are in sysfs we should have access to them
anyway, so no need for jumping through or hula-ing hoops.

xf86CloseSerial() works as intended as it's a slim wrapper around close(), so
we only have to worry about the open() path here.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-02-27 09:34:36 +10:00
Peter Hutterer
dafc296f2d Add streq() macro, replace strcmp instances with it
And why isn't this a thing in glibc yet

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
2017-02-27 09:34:36 +10:00
Peter Hutterer
7c90f06d56 Update pad modes in a workproc, not during the input thread
Updating the property directly causes us to send events from the input thread
which has some "interesting" side effects like messing up the reply order or
just crashing the server.

Schedule a work proc instead and update it whenever the server is back in the
main thread.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-02-27 09:34:36 +10:00
Peter Hutterer
19ceef972e Drop unnecessary function declaration
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-01-27 12:14:29 +10:00
Peter Hutterer
974ab6b62b Add tablet tool area ratio property
By default, the X server maps the tablet axes to the available screen area.
When a tablet is mapped to the screen but has a different aspect ratio than
the screen, input data is skewed. Expose an area ratio property to map the
a subsection of the available tablet area into the desired ratio.

Differences to the wacom driver: there the x/y min/max values must be
specified manually and in device coordinates. For this driver we merely
provide the area ratio (e.g. 4:3) and let the driver work out the rest.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com>
2017-01-12 14:53:41 +10:00
Peter Hutterer
5d04707381 Implement stylus pressure curve support
Takes a 4-point cubic bezier curve as input and maps the pressure coordinates
to the values outlined by this curve. This is an extension of the current
implementation in the xf86-input-wacom driver which only allows the two center
control points to be modified.

Over the years a few users have noted that the wacom driver's pressure curve
makes it impossible to cap the pressure at a given value. Given our bezier
implementation here, it's effectively a freebie to add configurability of the
first and last control points. We do require all control points' x coordinates
to be in ascending order.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-01-04 09:57:57 +10:00
Peter Hutterer
0dad7408fa Calculate the required scroll distance based on the angle
For a mouse with a click angle of 15 degrees things are unchanged. For devices
with angles less than 10, the current code scrolled way too fast. Because the
angle wasn't used anywhere, each tick would count as full scroll wheel event,
a slight movement of the wheel would thus scroll as much as a large movement
on a normal mouse.

Fix this by taking the actual click angle of the device into account. We
calculate some multiple of the angle that's close enough to the default 15
degrees of the wheel and then require that many click events to hit the full
scroll distance. For example, a mouse with a click angle of 3 degrees now
requires 5 clicks to trigger a full legacy scroll button event.

XI2.1 clients get the intermediate events (i.e. in this case five times
one-fifth of the scroll distance) and can thus scroll smoothly, or more
specifically in smaller events than usual.

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

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2017-01-03 15:16:21 +10:00
Peter Hutterer
ea02578a4e Move axis value calculation into a helper function
The only difference here is the axis number.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2017-01-03 15:16:21 +10:00
Peter Hutterer
2ceb2e1b18 Add a comment regarding scroll dist default values
Changed this during development because I forgot that the value actually
matters (for touchpads anyway).

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2017-01-03 15:16:21 +10:00
Peter Hutterer
f47f78eb0b Ignore LED updates for disabled devices
If an XKB AccessX timeout is set and a VT switch is triggered, the
AccessXTimeoutExpire function may be called after the device has already been
disabled. This can cause a null-pointer dereference as our shared libinput
device may have been released by then.

In the legacy drivers this would've simply caused a write to an invalid fd
(-1), not a crash. Here we need to be more careful.

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

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2016-12-21 07:58:26 +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
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
Peter Hutterer
1dd61abf7e Wrap the input_lock calls into ifdefs
Missing from a790ff35f9

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-10-19 10:46:22 +10:00
Peter Hutterer
a790ff35f9 Swap the registered input device on DEVICE_OFF when needed
If we don't swap out the pInfo previously passed to xf86AddEnabledDevice(),
the thread eventually calls read_input on a struct that has been deleted.
Avoid this by swapping out the to-be-destroyed pInfo with the first one we
find.

Reproducer: sudo udevadm trigger --type=devices --action=add

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2016-10-19 07:56:46 +10:00
Peter Hutterer
6318ac420b Fix tap button map option handling
Copy/paste error

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

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-10-14 13:34:56 +10:00
Keith Packard
b87d2530db Initializing strip association with wrong index
This looks like a cut&paste coding error to me, and it generated a
compiler warning about possibly uninitialized value.

Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-09-19 09:51:00 +10:00
Peter Hutterer
fa69bb1bc2 Always delay hotplugging subdevices
Avoid creating new devices from within the input thread which was the case for
tablet tools. It requires a lot more care about locking and has a potential to
mess up things.

Instead, schedule a WorkProc and buffer all events until we have the device
created. Once that's done, replay the event sequence so far. If the device
comes into proximity and out again before we manage to create the new device
we just ditch the whole sequence and wait for the next proximity in.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-09-09 16:34:05 +10:00
Peter Hutterer
af4fa36884 Add support for configurable tap button mapping
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2016-09-07 14:41:59 +10:00
Peter Hutterer
a5b3c209fc Add support for the rotation configuration
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-08-31 11:11:37 +10:00
Peter Hutterer
0168716fa1 Whitespace fix
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-08-19 11:35:08 +10:00
Peter Hutterer
d43e514430 Expose tablet pad modes as properties
There is not good wire protocol for pad modes so instead we just export the
information via properties. One property to tell us how many groups and how
many modes each group has. One property for the current mode of each group.
And three properties to tell us which group each button, ring and strip is in.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-08-16 07:49:49 +10:00
Peter Hutterer
5f2fff3c24 Ensure parent devices are actual parent devices
The list returned by xf86FirstLocalDevice() includes our own device. If the
parent device is removed before the hotplug callback is invoked, the first
match with the same shared-device ID is our own device (or potentially another
subdevice on the same already-removed parent). Avoid this by making sure the
matched device is actually a parent device.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Keith Packard <keithp@keithp.com>
2016-08-16 07:49:49 +10:00
Peter Hutterer
116cddba69 Bail out of PreInit if the parent driver data is NULL
If the parent device is removed before the WorkProc is called, the private
data is NULL.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2016-08-12 11:34:35 +10:00
Peter Hutterer
fb4847d243 Block input events while creating the virtual subdevices
If an event comes in halfway through the new device creation we read it from
libinput's epollfd but depending on the setup stage the new device may not be
ready yet.

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-08-12 11:34:35 +10:00
Peter Hutterer
ce85b11e4c Fix button offset for tablet pad buttons
4-7 is reserved for scroll buttons, as usual

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-07-08 13:02:32 +10:00
Peter Hutterer
ae4f0a8d72 Init touch x/y axis labels as MT axis labels
https://bugs.freedesktop.org/show_bug.cgi?id=96481

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2016-06-14 12:15:48 +10:00
Keith Packard
289de5be15 Use xf86AddEnabledDevice instead of AddEnabledDevice when threaded [v3]
libinput can't run at SIGIO time, so it has been using
AddEnabledDevice to run in non-signal context.

Threaded input runs all input in non-signal context, so we want to use
xf86AddEnabledDevice at last.

v2: use XINPUT ABI version check instead of testing for presence of
    AddEnabledDevice, which can't get removed from the server until
    a few more patches past the threaded input change are merged.

v3: remove reference to XI86_SIGNAL_IO, which was presumably
    a planned change to the xf86AddEnabledDevice path to make that
    not use SIGIO.

Signed-off-by: Keith Packard <keithp@keithp.com>
Tested-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-05-30 18:21:33 +10:00
Peter Hutterer
ceea2bb8ba Change some fixed floats to decimal notation
Just to make it more obvious we're using floats/doubles here.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-05-30 15:28:47 +10:00
Peter Hutterer
d8aef83834 Fix proximity events
Two bugs caused proximity events to be discarded. First, on proximity out
posting through pDev would be discarded because pDev is the parent device that
we use as a base for hotplugging the real devices for each tool from. That
device never sends events though, doing so will see the event discarded in the
server.

Second, if the tool already exists don't just exit, send the proximity event
first. To unify the three paths where we do send the events simply move them
down to the exit phase of the function.

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

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-05-23 14:15:22 +10:00
Peter Hutterer
34b6ed980f Add tablet pad support
Modelled to be mostly compatible to the xf86-input-wacom driver behavior. The
pad gets 7 axes, the first three of which are mute and the others are always
available but obviously only send events when the axis is there.

The strip axes are incompatible, the wacom driver merely forwards the device
events (which are a bitshifted value), libinput normalizes it and we just
expand this back into an integer range. Let's see how we go with this.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-05-09 12:06:24 +10:00
Peter Hutterer
ce85432f41 Discard buttons >= 256
https://bugs.freedesktop.org/show_bug.cgi?id=95295

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-05-09 08:15:43 +10:00
Peter Hutterer
181ea654dd Fix potential use of uninitialized values
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-04-28 14:41:43 +10:00