Commit graph

348 commits

Author SHA1 Message Date
Peter Hutterer
b4da6738d3 Retrofit event timestamps to all device events based on the frame
As we now buffer device frames we can apply the timestamp of the frame
event to all currently pending events.
2022-05-17 15:31:20 +10:00
Peter Hutterer
48bf74a5b9 Add a pending event queue for incoming device events
Incoming device events are now added to a device-internal queue. Once
the frame event comes in, that queue is shuffled over to the main event
queue. For libei/the EIS implementation this means that device events
are seen only once the frame event appears from the sender (or it is
emulated by other means).
2022-05-17 15:31:20 +10:00
Peter Hutterer
8e95e8994b ei: expose ei_event_get_context() internally 2022-05-17 15:31:20 +10:00
Peter Hutterer
0d5ce5dd87 util: add the macros to run through a list backwards
This ended up being unused but I wrote the code so we might as well
include it.
2022-05-17 14:36:39 +10:00
Peter Hutterer
d99e42b808 Add timestamps to frame events
Currently only implemented for frame events, the vague plan for the
future is to merely queue the device events internally and "release"
them once a frame event was received, retrofitting the timestamp to the
C event struct (i.e. making ei_event_get_time() available on all device
events).

Meanwhile, the frame event it is.
2022-05-17 07:18:41 +10:00
Peter Hutterer
e913462a23 Print the strerror too if a message fails 2022-05-16 14:15:03 +10:00
Peter Hutterer
8cff3cfd10 Remove an outdated comment
We must support virtual devices on receiver contexts - that's the only
way to handle relative pointer devices that move in pixel(-ish) units.
2022-05-09 17:46:40 +10:00
Peter Hutterer
5b286a4d3a ei: add receiver handling for empty/flushing frame events
Where the sender sends empty frame events, or a device event without a
subsequent frame events ensure that event is filtered or emulated in our
event queue.

Note: because of our sender filters, we cannot actually test
this, at least not easily. Let's hope it works.
2022-05-05 13:46:26 +10:00
Peter Hutterer
f0605b5e53 Add a filter for empty frames on the receiver side 2022-05-05 13:41:36 +10:00
Peter Hutterer
6f230edfa8 Assert on start_emulating if we're left with a pending frame event 2022-05-04 13:42:27 +10:00
Peter Hutterer
5b82cb4fe8 Flush the frame event before a stop_emulating 2022-05-04 13:42:27 +10:00
Peter Hutterer
1fd88a364c Warn if the touch isn't down for a touch motion 2022-05-04 13:27:16 +10:00
Peter Hutterer
1f37500607 Add a bunch of warnings when sending events outside of emulating 2022-05-04 13:26:12 +10:00
Jonas Ådahl
4c874469d5 Only auto-stop emulating if sender 2022-05-02 06:46:18 +00:00
Peter Hutterer
a4dde7c35f Filter empty frame events
We only need frame events after device events (pointer, touch,
keyboard). In some cases, the library prevents an event from being
written to the wire, e.g. if the coordinates are out of region, but the
client will still call ei_device_frame() for that now-filtered event.

Keep a boolean to remember if we have sent something that requires a
frame event and filter accordingly.

Note that this currently filters the *sender* side only, not the
receiver side. A sender that gets an empty frame event onto the wire
will still get that into the other side.

This also doesn't handle the flushing of frame events before other
events, ideally we should enforce a frame event before e.g. stop
emulating.
2022-04-29 11:38:07 +10:00
Peter Hutterer
35aca1a387 Enforce a frame after ei_touch_destroy()
Destroying a touch causes ei_touch_up if the touch is still down. But
for the event sequence to be correct we also need to add a frame event
here, otherwise the touch up may be "pending" on the remote until the
next actual event happens and a frame is added.

A client that doesn't want this should just call ei_touch_up()
2022-04-29 11:38:07 +10:00
Peter Hutterer
cede41d190 Only send touch up events on destroy if the touch is down
Otherwise we trig a bug error message every time we unref the touch.
2022-04-29 11:38:07 +10:00
Peter Hutterer
e345474515 ei: frame events must be sent on state emulating, not resumed 2022-04-29 11:38:07 +10:00
Peter Hutterer
8261415330 Better touch debugging messages 2022-04-29 11:16:41 +10:00
Peter Hutterer
1f5bc7df7d Improve the "message type" debug output a bit
Make it clear that that number is an errno
2022-04-29 11:16:41 +10:00
Peter Hutterer
40c8f15d2e Whitespace fix 2022-04-29 11:16:41 +10:00
Jonas Ådahl
c9c0fbd55d eis: Remove eis_backend_fd_add_fd()
eis_backend_fd_add_client() should be used instead.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2022-04-27 02:00:07 +00:00
Jonas Ådahl
e115c6549b eis: Add API to add client getting an fd
Creates the socket and adds it; is intended to be used to create client
connections that are passed via a secure channel, e.g. via portals.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2022-04-27 02:00:07 +00:00
Jonas Ådahl
a68f5a6e83 eis: Fix a couple of coding style issues
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2022-04-21 22:55:13 +00:00
Jonas Ådahl
8571060bf8 eis: Clarify mmap restrictions on keymap
Require to mmap using MAP_PRIVATE, to allow sealing.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2022-04-21 23:39:25 +02:00
Jonas Ådahl
05438a17df libei: Clarify whether a context owns a passed fd
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2022-04-21 23:39:22 +02:00
Peter Hutterer
f35be22d2c Rename ei active/passive to sender/receiver
This is more explicit in what it actually does, making it easier to
immediately understand the code.
2022-04-04 15:42:27 +10:00
Peter Hutterer
fa091d7ac4 Differentiate between physical and virtual devices
With passive libei contexts receiving events sent by the EIS
implementation, the type of device changes significantly. While a
relative input device could still send data in logical pixels,
absolute devices may not have that luxury.

Best example here is an external tablet (think: Wacom Intuos): that
tablet has no built-in mapping to a screen and thus cannot capture input
events in logical pixels.

Address this by adding a device type, either virtual or physical.
In terms of functionality, the device's type decides:
- only virtual devices have regions
- only physical devices have a size

The event API remains as-is but the event data not represents either
logical pixels (virtual devices) or mm (physical device).

An EIS implementation connected to a passive libei context would likely
create:
- a virtual relative device (sending deltas in logical pixels)
- one or more physical absolute devices (sending deltas in mm)
2022-04-04 05:28:36 +00:00
Peter Hutterer
9d85b1289d Change to allow dynamic binding of capabilities
Previously, a client could only bind to a capability immediately after
SEAT_ADDED and with a rather awkward API to confirm the capabilities.

Change this to allow for dynamic binding of capabilities, i.e. a client
calls ei_bind_capability() or ei_unbind_capability() whenever it feels
like, causing the respective devices of this capabilty to be added or
removed.

This allows for clients that are temporarily disinterested in a
capability but may require said capability later.

The default function takes one capability, a helper for enable/disable
multiple capabilities in one go is provided as well. On the protocol,
only the "bind" request exists which always represents the currently
wanted set of capabilities.

Note that the helper functions for multiple capabilities require NULL
(not zero) as sentinel, thanks to gcc.
2022-04-04 05:24:16 +00:00
Peter Hutterer
7b760e5950 eis: the EIS context does not have a is_active setting
This is a leftover from an earlier implementation that didn't get
removed in time. This extends to a macro that was using the context flag
(rather than the client flag) and in turn caused a bunch of false
positives on the tests.
2022-03-28 16:53:11 +10:00
Peter Hutterer
42c1a69436 Add ei_is_active()
Typical clients shouldn't need this but the test suite does so let's add
it.
2022-03-28 16:39:10 +10:00
Peter Hutterer
b4afb2014f Correct two comments regarding active vs passive context 2022-03-28 16:38:59 +10:00
Peter Hutterer
3dbd278529 Remove a stray uint32_t from the documentation 2022-03-28 15:36:46 +10:00
Peter Hutterer
c42129c0ff Fix a comment referring to an old implementation 2022-03-28 15:36:46 +10:00
Peter Hutterer
a5e6af5bff eis: after the client binds the seat, drop the capabilities
This way eis_seat_has_capability() returns the effective capabilities
the server can actually use - no point creating touch devices when the
client has not confirmed that.

In theory we should have a eis_seat_get_effective_capabilities() to
differ between configured and effective capabilities, but I'm having a
hard time thinking of a use-case where the implementation forgets
which caps it enabled.

The side-effect of this patch is that adding a device without
capabilities requested by the client now produces warning.
2022-03-07 11:21:36 +10:00
Peter Hutterer
c012579c51 eis: remove eis_device_set_name(), use eis_device_configure_name()
For consistency with all configure calls
2022-03-07 11:03:30 +10:00
Peter Hutterer
541dcb415d ei: require the client to confirm capabilities rather than drop them
Our API requires a client to know which capability to pass into the
drop_capabilities function. This doesn't work for capabilities newer
than the client's version so they do not get disabled. The client will
thus receive devices it didn't ask for and doesn't know how to handle.

Let's invert the requirement and require the caller to confirm the
capabilities it wants - all others are dropped.

This is an API break but also requires updates of all clients, the
previous simple case of just calling ei_seat_bind() will now result in
zero capabilities.
2022-03-07 11:02:35 +10:00
Peter Hutterer
faa9500afe Add concept of active/passive libei contexts
A libei context can be initialized as active or passive context -
an "active" context sends events, a "passive" context receives events.
The EIS context supports both simultaneously, it is up to the
implementation to disconnect libei clients that it does not want to
suppport.

For example, the xdotool use-case creates an active libei context. The
EIS implementation controls and sets up the devices, but libei
sends the events.

In an input-capturing use-case, the EIS implementation controls
and sets up the devices **and** sends the events. libei is merely the
receiver for any event, it cannot send events. Thus this use-case
requires a passive libei context.

Most of this code is copy/paste with minor modifications - libei already
had the code to send events, libeis had the code to receive events, so
the vast majority of this patch is copying the code into the respective
other library, swap "ei" and "eis" and then apply the various minor
modifications needed to hook into the existing library.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-03-04 14:04:33 +10:00
Peter Hutterer
72cfef9a56 eis: don't allow for region changes once the region was added 2022-03-04 13:59:00 +10:00
Peter Hutterer
9f1db1e10b doc: updates all over the place 2022-03-04 13:47:08 +10:00
Peter Hutterer
d695cf1ab7 doc: fix the documentation for the eis capabilities 2022-03-04 13:46:50 +10:00
Peter Hutterer
30895bd825 doc: document the events a little 2022-03-04 13:46:50 +10:00
David Redondo
46b39c2b38 Some doc fixes relating to keymaps
There are no client created keymaps anymore.
2022-03-03 14:05:20 +01:00
Peter Hutterer
b6f477fb96 util-object: split macro to generate unref into one two
One macro that also defines the cleanup function, one macro that only
defines the unref. This is required for any place where we want to
use cleanup from multiple source files - like the test suite.
2022-03-03 05:41:15 +00:00
Peter Hutterer
d5bdcfc0da eis: add the functions to fetch a region back from the device
Same as ei_device_get_region() and friends.
2022-03-03 15:03:26 +10:00
Peter Hutterer
c15fcdc140 util: add a helper for fetching the cmdline.
Better than duplicating this three times.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-03-03 00:43:02 +00:00
Peter Hutterer
46681e2855 Add SPDX identifiers to all source files
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-03-03 00:27:36 +00:00
Peter Hutterer
d2166bf2bd Documentation updates
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-03-02 15:55:04 +10:00
Peter Hutterer
fb4b11de43 Fix a typo in the docs
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-03-02 15:55:04 +10:00
Peter Hutterer
5ab50db599 util-io: avoid variable length arrays for clang's benefit
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-03-01 23:28:49 +00:00