Commit graph

409 commits

Author SHA1 Message Date
Hans de Goede
4da6dd52a4 accel_profile_smooth_simple: Cleanup
Cleanup the code a bit, and make sure accel is at least 1.0 .

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-07-09 12:40:01 +10:00
Peter Hutterer
f2dfbc0b82 filter: drop delta-softening
I doubt this does what we think it does. It doesn't soften the delta changes,
rather it introduces bumps in the smooth processing of the changes.

abs(delta) below 1.0 is untouched, and abs(delta) beyond 3 or 4 isn't
noticable much. But in the slow range around the 1/-1 mark there is a bump.

For example, if our last_delta is 1.0 and delta is 1.1, the "softened"
delta is set to 0.6. That is stored as last delta, so an input sequence of:
   0.8, 0.9, 1.0, 1.1, 1.2, 1.0, 0.8, 1.1

results in "softened" deltas that don't match the input:
   0.8, 0.9, 1.0, 0.6, 0.7, 1.0, 0.8, 0.6

A better approach at smoothing this out would be to calculate the softened as:
   current = current ± diff(last, current) * 0.5
or even weighted towards the new delta
   current = current ± diff(last, current) * 0.25

In tests, this makes little difference. Dropping this function altogether is
sufficient to make the pointer pointer behave slightly better at low speeds
though the increase is small enough to attribute to confirmation bias.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-07-09 12:39:50 +10:00
Peter Hutterer
03a1ef7540 filter: rename motion_filter_destroy to filter_destroy
For better consistency with filter_dispatch(). And move the things around to keep
the consumable API together.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-07-09 12:39:41 +10:00
Peter Hutterer
280755a7c8 touchpad: drop the BOTTOM_TO_AREA/BOTTOM_NEW states
The original intention of this state was to prevent an accidental move out of
the bottom software button to start moving the cursor. That ends up actually
preventing a number of normal moves that start low enough. Simply drop the
state.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-07-04 07:51:43 +10:00
Peter Hutterer
ebc087fbf6 touchpad: reduce button size, use physical sizes where possible
The current 20% is excessive. On the t440s, the button size amounts to ~14mm
from the bottom. On the x220 it amounts to ~9mm, leaving only 31mm as actual
touchpad.

Reduce it to 15% instead, which amounts to 10.5mm on the t440 and 6mm on the
x220. Cap the button height further by making buttons a maximum height of
10mm, anything larger than that is excessive anyway.

Smaller buttons should be acceptable since we can rely on the bottom edge to
be a haptic feedback and thus a good hit-target, somewhat simliar to how
screen edges are good hit-targets.

The top software buttons stay the same size, but prefer a physical size of 6mm
instead (which is 1mm below the button marker line on the T440s). If no y
resolution is available, fall back to the 8% which is 5.6mm on the T440s.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-07-03 13:52:57 +10:00
Peter Hutterer
2219c12c3a touchpad: hook up to the tapping configuration
Now that we have run-time changes of the tap.enabled state move the check
to the IDLE state only. Otherwise the tap machine may hang if tapping is
disabled while a gesture is in progress.

Two basic tests are added to check for the tap default setting - which is now
"tap disabled by default", for two reasons:
* if you don't know that tapping is a thing (or enabled by default), you get
  spurious button events that make the desktop feel buggy.
* if you do know what tapping is and you want it, you usually know where to
  enable it, or at least you can search for it.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-07-03 13:51:11 +10:00
Peter Hutterer
401592870d Add an interface to enable/disable tapping
Provide an interface to enable/disable tapping, with a default mapping of
1/2/3 fingers mapping to L/R/M button events, respectively.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Jonas Ådahl <jadahl@gmail.com>
2014-07-03 13:48:44 +10:00
Peter Hutterer
4b88bf30d4 Add an enum for configuration return codes
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Jonas Ådahl <jadahl@gmail.com>
2014-07-03 13:48:43 +10:00
Peter Hutterer
5ab2bcad6f Fix compiler warnings for missing initializers
timer.c: In function ‘libinput_timer_arm_timer_fd’:
timer.c:48: warning: missing initializer
timer.c:48: warning: (near initialization for ‘its.it_value.tv_nsec’)

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-07-03 09:59:43 +10:00
Peter Hutterer
f28eb5ecec Add -lrt to the libs
Needed for clock_gettime()

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-07-03 09:59:43 +10:00
Peter Hutterer
5d36e8e817 configure: check for -lm through AC_CHECK_LIB
Saves us from manually appending it everywhere

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-07-03 09:59:43 +10:00
Peter Hutterer
36720c5151 Fix two doxygen refs pointing to nonexistent functions
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-07-03 09:59:26 +10:00
Peter Hutterer
fccbe88f05 touchpad: log the sysname of the device that looks like a bad clickpad
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-07-03 09:53:59 +10:00
Hans de Goede
bb3edf4c94 touchpad: Switch to smooth simple acceleration code from filter.c
The old touchpad accel code was clamping touchpad acceleration between
0.2 and 0.4, and on the test devices I have the constant_factor ended up
such that in practice the accel was almost always 0.2, so rather than having
a velocity based acceleration curve, in essence it was just always using an
acceleration of 0.2 .

This commit introduces actual velocity based acceleration based on the
recently added smooth simple acceleration code from filter.c .

Before feeding motion events to filter.c, they first get adjusted for touchpad
resolution. For touchpads where the driver does not provide resolution info,
scale based on the diagonal-size in units instead.

While at it rename tp_init_accel's dispatch parameter from touchpad to tp
to be consistent with all other functions.

Since the acceleration is also used for scrolling also adjust the scroll
start threshold for these changes.

Note that switching to the smooth simple accel code, as an added bonus gives
the tp code an accel profile with a threshold and a speed parameter, which
is exactly what is needed for the upcoming configuration interface 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-07-02 14:20:26 +10:00
Peter Hutterer
6b6f24ee1c Add functions to get the device name, PID and VID
Those three are the ones that matter for logging or device identification in
callers, so let's provide them.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Jonas Ådahl <jadahl@gmail.com>
2014-07-02 08:52:33 +10:00
Peter Hutterer
8fa5d0bf51 touchpad: disable tapping for fingers exceeding the timeout/motion threshold
The current code triggers multi-finger tapping even if the finger released was
previously held on the touchpad for a while. For an event sequence of:
1. first finger down
2. first finger move past threshold/wait past timeout
3. second finger down
4. first finger up

The second finger initiates the two-finger tap state, but the button event is
sent when the first finger releases - despite that finger not meeting the
usual tap constraints. This sequence can happen whenever a user swaps fingers.

Add the finger state to the actual touchpoints and update them whenever the
constrains are broken. Then, discard button events if the respective touch
did not meet the conditions.

http://bugs.freedesktop.org/76760

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-07-02 08:12:37 +10:00
Hans de Goede
14ad471ff5 touchpad: Simplify tp_hysteresis
Once we get beyond the:

	if (abs(diff) <= margin)
		return center;

test, then diff is either > margin or < -margin, otherwise the test would
have triggered.

So the "return center + diff;" at the end will never be reached, and the
"else if (diff < -margin)" can be turned into a simple "else".

This commit does not just simplify tp_hysteresis, but (arguably more
important) also makes it clearer to the reader what it does.

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-07-01 10:54:18 +10:00
Jonas Ådahl
053c16c5a3 Fix coding style
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2014-06-28 22:41:29 +02:00
Stephen Chandler Paul
72f5758f2a touchpad: Fix typo in documentation
"a a left and…"->"a left and…"

Signed-off-by: Stephen Chandler Paul <thatslyude@gmail.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-25 12:53:38 +10:00
Peter Hutterer
186f618814 Drop the deprecated libinput_udev_create_for_seat()
We have enough API breakage in this release that it's not worth keeping
this around. Every caller must be fixed for all the other stuff anyway,
so drop this too.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-25 11:44:20 +10:00
Peter Hutterer
dd9cd664bc Fix a few comments referring to udev_create_for_seat()
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-25 11:43:32 +10:00
Peter Hutterer
ac5fc23e49 Drop the deprecated LIBINPUT_POINTER_*_SCROLL enums
We have enough API breakage in this release that it's not worth keeping
these around. Every caller must be fixed for all the other stuff anyway,
so drop this too.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-25 11:41:16 +10:00
Hans de Goede
568004d483 timer: Complain if a timer is set more than 5 seconds from now
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-25 11:13:39 +10:00
Hans de Goede
8d6356e668 tp_post_twofinger_scroll: Move setting of t->is_pointer = false up a bit
There is no need to loop over the touch points twice.

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-25 11:11:42 +10:00
Hans de Goede
c0af1b57d4 touchpad: Avoid spurious motion event for scroll movement below threshold
If the user puts down to fingers to scroll, then changes his mind and
lifts them, without having them moved past the initial scroll threshold in
either direction, then any movement which he has done will cause a spurious
scroll event when the second finger down is lifted first.

The problem is that t->is_pointer was not being set to false in this case,
since that is done in tp_post_twofinger_scroll after checking scroll.state
which never gets set in this scenario.

Instead of changing the order, simply completely remove scroll.state completely
it is a boolean, and everywhere we check for it we also check for the axis bits
in state.direction, so it is not necessary.

Also add a check to ensure there are no spurious motion events.

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-25 11:11:39 +10:00
Peter Hutterer
4441c9debe Add msleep() helper function
For those whose eyes struggle to focus on 5 zeros in a row, or those just sick
of forgetting one zero and wondering why things don't work.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-25 11:04:14 +10:00
Peter Hutterer
bad56cac5b Merge branch 'ref-counting-context'
Conflicts:
	src/udev-seat.c
	test/log.c
2014-06-25 10:32:42 +10:00
Jonas Ådahl
faab25c25c Make context reference counted
Instead of only allowing one owner keeping a libinput context alive,
make context reference counted, replacing libinput_destroy() with
libinput_unref() while adding another function libinput_ref().

Even though there might not be any current use cases, it doesn't mean we
should hard code this usage model in the API. The old behaviour can be
emulated by never calling libinput_ref() while replacing
libinput_destroy() with libinput_unref().

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-25 10:27:03 +10:00
Jonas Ådahl
13e9a1d744 Make ref count unref/ref() functions return resulting object pointer
In order to know if an unref() destroyed an object and to allow more
convenient use of ref(), make both functions return a pointer to the
object it was passed, or NULL if that object was destroyed.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-25 10:26:59 +10:00
Peter Hutterer
97a6bf10f9 Change the logging system to be per-context
Rather than a single global logging function, make the logging dependent on
the individual context. This way we won't stomp on each other's feet in the
(admittedly unusual) case of having multiple libinput contexts.

The userdata argument to the log handler was dropped. The caller has a ref to
the libinput context now, any userdata can be attached to that context
instead.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-23 15:39:08 +10:00
Peter Hutterer
6250397ac8 udev: split libinput_udev context init into two functions
This is preparation work for context-specific log handlers.

Callers are now encouraged to first initialize the context with
libinput_udev_create_context() and then set the seat for this context with
libinput_udev_assign_seat().

In the upcoming patch to support context-specific log handlers this enables a
caller to set the log handler for a context before any devices are
initialized. Otherwise, a log message generated by a new device may pass a
libinput context that the caller is not yet aware of.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-23 15:39:08 +10:00
Peter Hutterer
967911791f Rename KEYBOARD_KEY_STATE to KEY_STATE
e912d620d0 changed from POINTER_BUTTON_STATE to
simply BUTTON_STATE, replicate that for key events too.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2014-06-23 15:23:35 +10:00
Peter Hutterer
55bf505807 Name-space the scroll event types
To provide a generic naming system of type_direction. That will become more
important once we add new axes as part of the ongoing work to support graphics
tablets.

[edit: and switch to the new defines]

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-23 14:31:56 +10:00
Peter Hutterer
41f9176c0a Add a function to get the size of a device
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-19 13:38:15 +10:00
Peter Hutterer
21cf84a580 Change absolute and touch events to use mm as default unit
Instead of device-specific coordinates that the caller can't interpret without
knowing the range anyway, return mm as the default value.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-19 13:38:15 +10:00
Peter Hutterer
3a812385d1 evdev: force a resolution of 1 where no resolution is set
Avoids nasty surprises later when we divide by 0. This matters particularly
when testing a device through uinput, which can't set the resolution.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-19 12:07:17 +10:00
Peter Hutterer
df212db2a3 evdev: keep the absinfo struct around instead of min/max
We'll need that later for conversion to mm.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2014-06-19 12:00:58 +10:00
Hans de Goede
92a67a3a94 touchpad: tp_current_touch: Fix off by one error
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-19 10:09:03 +10: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