Commit graph

2481 commits

Author SHA1 Message Date
Peter Hutterer
f86c89c5c8 tablet: check the button range before we use it
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Stephen Chandler Paul <thatslyude@gmail.com>
2014-06-18 15:41:52 +10:00
Stephen Chandler Paul
4e4ff21e31 Sanitize distance and pressure axes before reporting their values
This commit changes two things with the way distance and pressure axes are
reported:
1. Distance and pressure are made mutually exclusive. When there is a distance
   event and a pressure event and the tool is in contact with the tablet, only
   the pressure change will be reported. When the tool is not in contact and
   both a distance and pressure change are received, only the distance update
   will be received.
2. Bad distance events are not reported to the caller. There is a certain
   distance a tool can be from the tablet where the tablet recongnizes that a
   tool appeared, but the tool doesn't send any useful information to the
   tablet. When this happens, the distance will update to it's minimum or
   maximum value, and no other axis updates will be sent. Since this can give
   a caller the impression that the tool is within a useful proximity of the
   tablet, we filter out any distance events with a value of maximum or minimum
   when the tool is not within useful proximity of the tablet.

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-17 17:17:14 -04:00
Stephen Chandler Paul
8f572b6fd1 tablet: Report and normalize distance, pressure, and tilt axes
Report the values for the distance, pressure, and tilt axes. Pressure is
normalized to a range of 0 to 1, and tilt is normalized to a range of -1 to 1.

Based off the patch originally written by Carlos Garnacho

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-17 17:17:14 -04:00
Stephen Chandler Paul
5561e4502d tablet: Handle button-events
Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-17 17:17:14 -04:00
Stephen Chandler Paul
5fa892a88e Emit LIBINPUT_EVENT_TABLET_PROXIMITY_OUT when tool leaves proximity
This event is just used to notify the caller when the tool's no longer in
proximity. When an event like this occurs, everything from evdev up until the
next EV_SYN event is discarded along with any events that occured since the last
EV_SYN event. This also silences any tool update events where the tool type is
changed to LIBINPUT_TOOL_NONE, so we don't end up filling the tool list with a
bunch of tools that aren't actually tools.

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-17 17:17:13 -04:00
Stephen Chandler Paul
e5212e2080 Emit LIBINPUT_TABLET_EVENT_TOOL_UPDATE events on tool changes
Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-17 17:17:11 -04:00
Stephen Chandler Paul
3a65184287 Add the libinput_tool object
This will be used to represent a tool in use on a drawing tablet.

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-17 17:16:01 -04:00
Stephen Chandler Paul
9357166114 evdev: Add basic support for tablet devices
These devices set the LIBINPUT_DEVICE_CAP_TABLET flag, and emit a lot more axis
information then mice and touchpads. As such, tablet events are in a whole new
group of events that is separate from everything else.

In this commit, only X and Y axes are reported in libinput.

Based off the patch originally written by Carlos Garnacho

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-17 17:15:58 -04:00
Carlos Garnacho
53affdc9bb Add LIBINPUT_DEVICE_CAP_TABLET libinput_device_capability value
This capability flag would be enabled when events are driven through
a stylus, ie. on a tablet.

Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-16 20:31:03 -04:00
Stephen Chandler Paul
812ea542e7 Add bitfield helper functions from libdevdev-util.h and some tests
Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-16 20:31:03 -04:00
Peter Hutterer
2e289b2026 Document the top software button behavior
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-13 11:49:45 +10:00
Peter Hutterer
d1f1563aab path: log two errors as application bugs
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-13 11:48:14 +10:00
Peter Hutterer
509d31b810 Add two doxygen cross-references for the logging functions
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-13 11:48:04 +10:00
Peter Hutterer
fc51daff73 touchpad: always call into the the tap state machine
A button event consumed by the softbutton or clickpad code does not feed into
the tap state machine, leaving it in its current state. The touch generating
that event however may have triggered state changes.

For some tap/click combinations this gives us either double press/release
events or an inconsistent order of events. Those issues include:
* a really short physical click causes a click + tap-click
* a really short physical click on the right software button causes a right
  click + left tap-click
* tap + click causes double button left press events

To avoid these, notify the tap code that a button event has occured and
process that accordingly. Depending on the state this may either continue to
the DEAD state or release the current tap button and then go to the DEAD
state.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-12 10:29:26 +10:00
Hans de Goede
4ddd19d6bd Add a log_msg_va function
This is useful for when we use libraries which want us to provide them with
a logging callback.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-11 10:31:43 +10:00
Hans de Goede
96445bc243 timer.h: Add #include libinput-util.h
libinput-util.h is needed for the linked list definitions.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-11 10:30:12 +10:00
Peter Hutterer
5a0c06b0d1 touchpad: Prefix tap-debugging message
For consistency with the butto state debugging

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-11 09:58:55 +10:00
Peter Hutterer
c433017388 touchpad: log the invalid event as bug, not just as info
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-11 09:58:55 +10:00
Hans de Goede
04c7987443 evdev-mt-touchpad-tap: Switch over to new timer subsystem
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-10 20:55:18 +10:00
Hans de Goede
31ef8bff44 evdev-mt-touchpad-buttons: Switch over to new timer subsystem
Besides being a nice cleanup, this gives us proper per touch timeouts.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-10 20:55:18 +10:00
Hans de Goede
f638677051 Add a timer subsystem
Currently we are using DIY timers in the touchpad softbutton and tap handling
code, and at least the softbutton code gets its wrong. It uses one timer-fd
per touchpad to set a timeout per touch, which means that if a timeout is
set for 100ms from now for touch 1, and then 50 ms later touch 2 sets a timeout
for 200 ms from now, then the timeout for touch 1 will come 150 ms too late.

This commits adds a proper timer subsystem so that we've one place to deal
with timer handling, and so that we can only get it wrong (well hopefully
we get it right) in one place.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-10 20:55:18 +10:00
Peter Hutterer
7222f839d0 Mark the log function as attribute printf
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-10 20:55:10 +10:00
Peter Hutterer
83ee3c9962 Drop empty FFI_CFLAGS
Leftover from weston

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-10 20:54:33 +10:00
Jonas Ådahl
f533ef212e doc: Fix spelling
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2014-06-09 23:39:06 +02:00
Jonas Ådahl
864232bcb2 evdev: Migrate rest of 32 bit time variables to uint64_t
Makes tests pass again with long uptime.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2014-06-09 22:26:22 +02:00
Stephen Chandler Paul
e912d620d0 s/libinput_pointer_button_state/libinput_button_state/
Button states are applicable to more then just the pointer, so having a
non-generic name name for a generic enumerator value like
libinput_pointer_button_state doesn't make sense. Changing it to something
generic like libinput_button_state allows it to be reused by other devices that
may potentially be added to libinput in the future.

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-09 20:48:05 +02:00
Jonas Ådahl
f3084e2c0d Use floating point numbers instead of fixed point numbers
Fixed point numbers can easily overflow, and double to fixed point
conversion is lossy. Use floating point (double) where fixed point
numbers where previously used and remove the li_fixed_t type.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-09 20:46:53 +02:00
Peter Hutterer
14a1d189ff touchpad: whitespace fix
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-05 07:58:51 +10:00
Peter Hutterer
82438a2cf6 touchpad: Drop the scroll direction lock, increase threshold instead
The direction lock was intended to avoid erroneous horizontal scroll events
when scrolling vertically (and vice versa). Some testing on my touchpad here
shows that it is too easy to accidentally lock the direction when no lock is
intended (e.g. moving around an image). And quite hard to figure out what a
pure vertical gesture is.

I get movements from 90 degrees to 70 degrees for something my brain would
consider vertical scrolling. Depending on the hand position, the fingers
actually perform a slight curve, not a straight line.

Hence - drop the direction lock, but increase the threshold a little. It
doesn't totally avoid horizontal scroll events but keeps them minimal.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-05 07:58:16 +10:00
Peter Hutterer
fd27450ae0 touchpad: break up a long line
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-04 11:29:09 +10:00
Peter Hutterer
4982b46010 Add our own version of linux/input.h
Avoids having to #define any values we're trying to use.

Header file is from Linux 3.15-rc8.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Jonas Ådahl <jadahl@gmail.com>
2014-06-04 09:40:39 +10:00
Peter Korsgaard
fa8439e644 evdev: Provide fallback definition for KEY_MICMUTE
KEY_MICMUTE was added relatively recently (3.1 with 33009557bd: Add
KEY_MICMUTE and enable it on Lenovo X220), so provide a fallback definition
similar to how we do it for KEY_LIGHTS_TOGGLE to fix compilation with older
toolchains.

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2014-06-02 23:23:26 +02:00
Peter Korsgaard
0d02b13ec2 evdev: Use correct fallback value for KEY_LIGHTS_TOGGLE
The kernel defines KEY_LIGHTS_TOGGLE as 0x21e, not 0x160 (which is KEY_OK).

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2014-06-02 23:23:13 +02:00
Peter Hutterer
bd4550cfb2 touchpad: fix two indentation issues in the header
7 whitespace -> tab

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-02 14:01:30 +10:00
Hans de Goede
9cf548e770 touchpad: Add support for top softbutton area
Add support for the top softbutton area found on some laptops.

For details of how this works, see the updated
doc/touchpad-softbutton-state-machine.svg diagram.

Basically this mirrors the state-machine for the bottom softbutton area, with
one exception, if a finger stays at least inner timeout milliseconds in the
top button area and then moves out of it, it will be ignored rather then
become the pointer. This is done so that people using the top buttons together
with a trackstick and accidentally move their finger out of the upper area
don't get spurious pointer movements from the finger on the trackpad.

This behavior is indentical to xf86-input-synaptics, which also ignores
movements from touches which start in the top button area.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-02 14:01:23 +10:00
Hans de Goede
cb05a3aa91 touchpad: Rename some variables and functions
Rename some clickpad softbutton area variables to have bottom in their
name, this is a preperation patch for adding top softbutton area support.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-02 14:01:14 +10:00
Peter Hutterer
055b1c8bc9 Replace log_bug with per-component bug macros
When we knowingly hit a bug, we should know what the bug is caused by. Log
that in a standardized fashion.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-05-30 11:55:23 +10:00
Peter Hutterer
ba6f0b566c Remove old touchpad code
With the addition of software buttons for clickpads, the new touchpad code has
overtaken this driver in terms of features. The older driver was disabled in
6a61032625.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-05-30 11:55:23 +10:00
Peter Hutterer
90b8de4ddd evdev: INPUT_PROP_DIRECT devices can't be touchpads
Devices that are direct input devices are marked by the kernel with the
INPUT_PROP_DIRECT property. Touchpads are always indirect input devices, so
let's do the easiest check first before we try device-specific capabilities.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-05-30 07:11:59 +10:00
Jonas Ådahl
eae6bec344 filter: Ignore non-suitable trackers when calculating initial velocity
calculate_velocity() didn't skip pointer trackers far away in time when
calculating the initial velocity. This check was done later when
iterating the rest, so while at it, simplify the function by doing both
iterations in one single loop.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-05-29 13:06:42 +02:00
Jonas Ådahl
acce2da38c filter: Fix get_direction for short vectors
Short vectors alongside the x axis produced inverted directions.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-05-29 13:06:39 +02:00
Jonas Ådahl
e18e9d56a8 touchpad: Make anisotropic motion deltas isotropic
The x and y absolute axis may have different resolutions, meaning 1 unit
long motion delta on one axis is not physically as long as 1 unit motion
delta on the other axis.

In order to make these anisotropic input motion deltas output as isotropic
motion deltas, apply scaling to one of the axis making it have the same
dimension as the other, before passing it through the motion filter
which assumes all deltas are isotropic.

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

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-05-29 13:06:36 +02:00
Jonas Ådahl
505e92b1a5 Add basic mouse pointer acceleration
This patch reimplements the simple smooth pointer acceleration profile
from X.org xserver. The algorithm is identical to the classic profile
with a non-zero pointer acceleration threshold.

When support for changable parameters is in place, to get a pointer
acceleration the same as the default classic profile of X.org a
polynomial acceleration profile should be used for when the threshold
parameter is zero.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-05-29 13:06:32 +02:00
Jonas Ådahl
7cb4540916 filter: Add motion filter destruction helper
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-05-29 13:06:16 +02:00
Hans de Goede
bdb13fd1d3 touchpad: Stop scrolling on a button click / tap
On a button click / tap the scrolling event handler no longer gets called,
ensure that any in progress scrolling is stopped.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-05-27 16:35:03 +10:00
Hans de Goede
8d41230d65 touchpad: Refactor tp_post_scroll_events()
Put the actual scroll event posting in the straight path.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-05-27 16:34:58 +10:00
Hans de Goede
ecb132fef6 touchpad: Fix sending of scroll stop events
Setting tp->scroll.direction = 0 before checking tp->scroll.direction
to see if we need to send stop scroll events for vert / horz scrolling does
not really work well.

Also we need to check direction with an axis mask, not the axis number.

While at it also add a tp_stop_scroll_events() helper function for this.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-05-27 16:34:54 +10:00
Hans de Goede
cee3a482f3 touchpad: Clear touches being the pointer when doing 2 finger scrolling
When doing 2 finger scrolling we don't want any spurious movement events after
scrolling. touchpad_2fg_no_motion tests for this, but it lifts touch 0
(which is the pointer as it came down first) first, so it only catches the
case where touch 1 suddenly gets promoted to being the pointer.

However if touch 1 is lifted first, then touch 0 is still the pointer and
will cause spurious movement events. Swap the 2 litest_touch_up calls to
catch this (and make the test fail), and add code to clear the is_pointer
flag on all touched when doing 2 finger scrolling to fix it again.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-05-27 16:34:51 +10:00
Jonas Ådahl
b064b05829 filter: Fix coding style
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2014-05-26 22:59:43 +02:00
Peter Hutterer
5082eaf250 Merge branch 'clickpad-improvements-v2' of git://people.freedesktop.org/~jwrdegoede/libinput 2014-05-23 08:51:29 +10:00