Commit graph

302 commits

Author SHA1 Message Date
Peter Hutterer
c317de742b libei: immediately remove devices added for a removed seat
Once the SEAT_REMOVED event has been processed, adding new devices is
pointless. But we do promise a DEVICE_REMOVED event for any device added with
ei_device_add(), so let's immediately queue an event and mark the device as
dead.

Since the SEAT_REMOVED event may still be pending in the queue (i.e. not yet
read by the client), we need to prepend the event to the queue. Note that
client that immediately add a device when a device is removed will cause
an infinite loop.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-29 14:10:47 +10:00
Peter Hutterer
f068ddf2a8 libei: only log the state when it changed
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-29 14:10:47 +10:00
Peter Hutterer
57fc23c67d libei: require ei_device_remove() for a never-added device
This simplifies the handling of devices that were never added a bit, including
handling the refs between seat and device. And for legitimate use-cases
there's no reason why a caller would create a device but never add it.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-29 12:23:35 +10:00
Peter Hutterer
659de273e9 libei: skip logging if we don't have a log handler
Mostly useful for the unit tests, saves on setup.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-29 11:50:23 +10:00
Peter Hutterer
03e5a547f5 test: add a few more tests for disconnection behavior
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-29 11:28:29 +10:00
Peter Hutterer
eef9c51df3 libei: fix the device/seat ref handling once again
Previously we didn't always clean up properly, especially where unexpected
removals happened. So the new approach is:
- the device always has a ref to the seat, we must not remove the seat until
  even not-yet-added devices are released
- the seat has a ref to the device *after* it was added. this is a circular
  ref so we need to make sure the device is manually removed from the seat
  so we can actually reach a refcount 1

This is made slightly more complicated by us calling ei_disconnect() whenever
we fail to write on the fd. The result is re-entrant functions that we need to
protect against inadvertent changes. The best option here is probably to mark
the context as degraded and clean up once we finished whatever we were really
doing - that's a larger rework though.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-29 11:28:29 +10:00
Peter Hutterer
96109fb415 test: when dropping the ei context, also drop our seat ref
Otherwise we don't actually clean up everything, making the whole thing
pointless.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-28 15:41:29 +10:00
Peter Hutterer
11857968c6 test: handle dispatch helpers for NULL contexts
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-27 13:30:43 +10:00
Peter Hutterer
0558866f5b test: add a test to simulate the xdotool/xwayland behavior
xdotool sends the events and disconnects immediately, Xwayland queues up those
events until it has a seat but then also disconnects immediately. Let's
emulate this behavior so we can catch breakages before Xwayland sees them.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-27 11:35:11 +10:00
Peter Hutterer
683ff5cca0 Fix double device removal
Removing a seat could cause two device remove events to happen. Fix this by
splitting the removal up into two bits: removed by server and removed by
client. Only once both bits are set, remove the device.

This needs to happen in libei and libeis.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-27 11:35:06 +10:00
Peter Hutterer
1db2af00c5 test: some better debugging of events
Add a debug marker to show any changes done during the final event processing,
and print the event name for wrong event types.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-26 14:35:57 +10:00
Peter Hutterer
3dafd9a362 libeis: better message debugging
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-26 13:54:47 +10:00
Peter Hutterer
ebe6261c89 README: mention seats in the high-level overview
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-26 12:02:45 +10:00
Peter Hutterer
f3a225c757 examples: update the examples for seats
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-26 08:53:33 +10:00
Peter Hutterer
0429ca2491 libei: print the device IDs as hex in the added/resumed/suspended debug logs
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-23 14:25:53 +10:00
Peter Hutterer
54c06f8d1e libeis: add eis_client_get/set_user_data
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-22 14:05:09 +10:00
Peter Hutterer
51bec40aa5 tools/demo-server: split the keymap handling into two functions
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 11:36:44 +10:00
Peter Hutterer
08650b0268 tools/demo-server: set the server keymap in our local struct
Where the demo server is run with a --layout, set that in our local struct so
the printed messages use the correct keysyms.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 11:36:37 +10:00
Peter Hutterer
787a664b5a libeis: don't treat it as bug when the client doesn't send a keymap
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 11:29:55 +10:00
Peter Hutterer
ab386f3cdb util: add an _unref_ cleanup + declaration function
To cut down on the boilerplate, an unref-able struct variable can now be
declared as
   _unref_(type) *name = NULL;
which is the equivalent of
   _cleanup_(type_unrefp) struct type *name = NULL;

Let's see how that style ends up reading.

This means we can get rid of the custom _cleanup_foo_ functions everywhere, no
need for all the extra #defines etc. A somewhat special case is systemd which
defines the various unrefp functions for us in the headers, so we can use them
directly.

OBJECT_IMPLEMENT_UNREF now also creates the unrefp function for this object -
this of course conflicts where DECLARE_UNREF_CLEANUP_FUNC is in scope. Not a
problem so far, let's see how we go.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 11:17:16 +10:00
Peter Hutterer
2076057ba2 util: add a macro to create unref cleanup functions
Slightly less boilerplate than before.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 10:47:47 +10:00
Peter Hutterer
5e24b35ecb tools: use a cleanup func for the event in the demo client
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 10:47:47 +10:00
Peter Hutterer
ff6633db97 libei: Improve function namespacing
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 10:47:47 +10:00
Peter Hutterer
93b96e42ad Add an EIS-controlled seat to the hierarchy
After CONNECT, the EIS implementation needs to add one or more seats. The
libei client can only create devices within those seats. This mirrors the
wayland hierarchy as well as the X.Org one.

The seat has a set of allowed capabilities, so the client knows ahead of time
when it may not be possible to create a specific device.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 10:47:47 +10:00
Peter Hutterer
207cd5fd24 libei: rename added to device_added
Make space for a future seat_added/removed

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 10:10:16 +10:00
Peter Hutterer
faff1ed597 tools/demo-server: add --force to remove a leftover socket path
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-21 10:10:16 +10:00
Peter Hutterer
9b6257bb9d libei: some more documentation and reshuffling
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-20 16:11:10 +10:00
Peter Hutterer
799d64d284 doc: fix typos
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-20 15:49:40 +10:00
Peter Hutterer
d99d1e8707 libeis: better logging of client bugs
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-01 15:28:46 +10:00
Peter Hutterer
7318512a89 libeis: switch the keymap to be a separate object
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-01 15:28:46 +10:00
Peter Hutterer
937f9fd8c5 libei: add a bunch of log messages for client bugs
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-01 15:28:46 +10:00
Peter Hutterer
76d59c11c9 libei: switch the keymap to be a separate object
This fits better with the rest of the API and also fits much nicer into the
most common use-case of "device doesn't have a keymap".

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-01 15:28:46 +10:00
Peter Hutterer
02efb19e2b libei: better logging of capabilities
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-01 15:28:46 +10:00
Peter Hutterer
3fc94f03b5 libeis: warn if connecting a device without capabilities
This is always a bug - where the device doesn't have recognized capabilities,
it should be rejected. libeis does the right thing and converts the
eis_device_connect() to a _disconnect() call but it's still useful to warn the
caller.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-10-01 15:28:46 +10:00
Peter Hutterer
070bdd9668 doc: fix a missing word
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-30 13:09:59 +10:00
Peter Hutterer
472f2ee84d util: disable coredumps for the munit helper
Really no need for those in a test suite

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-30 13:09:57 +10:00
Peter Hutterer
631fb3c0af Add C++ header guards
And a basic build test for C++ to make sure including the headers doesn't
completely fail.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-29 17:30:49 +10:00
Peter Hutterer
27cab50172 Mark the log functions as printf
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-29 17:30:49 +10:00
Peter Hutterer
0ba6cc2740 Add a crawly to the bug message
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-29 17:30:49 +10:00
Peter Hutterer
159d553ea3 test: switch the libei unit tests to the munit helpers
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-29 17:30:49 +10:00
Peter Hutterer
261f34eda8 meson.build: fix the doxygen generation
Having an output of '.' means the $builddir/doc directory was removed on ninja
clean, only for ninja to then fail because doc/libei.h wasn't there. Let's use
the reference from meson test cases itself.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-29 17:29:40 +10:00
Peter Hutterer
7158cfc242 meson.build: drop unused install command
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-29 17:21:38 +10:00
Peter Hutterer
50617775bc libei: drop a no longer useful declaration
Obsolete with the object-based touch support

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-28 12:00:08 +10:00
Peter Hutterer
96ba358984 doc: hook up doxygen
Build the doxygen API documentation. This is copied from libinput so it takes
over that style (which is more readable than the default doxygen style).
Some extra documentation is added too and all the immediate errors are fixed
in this commit but doxygen still warns about undocumented parameters.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-28 12:00:08 +10:00
Peter Hutterer
9db3e80cf4 README: fix an outdated repo link
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-28 11:08:14 +10:00
Peter Hutterer
40d7b3cade Add support for touch events
Client-side the approach is a managed touch object rather than passing the
touchid around. This is intentional, it allows for a stackable API in the
future if we need to add things like pressure or major/minor to it.

On the server side the touches are managed through the event object anyway, so
we don't need the same abstraction there.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-27 23:48:51 +00:00
Peter Hutterer
a27276b4c5 Drop mentions of capability monitoring
The original idea here was that a libei client could request the Pointer
capability to be notified of any pointer movements, thus providing a simple
way to capture input for the synergy use-case.

This is a can of worms better left untouched. How input events are captured
and what information is available is quite specific to the display server, let
alone the triggers for when it needs to start and stop. To have that in libei
requires something like triggers ("start when pointer hits the edge") which
again opens a new can of worms. Which seat are we referring to? What is a
screen edge? How about shortcuts?

Receiving input events can be handled by libeis anyway: any EIS server is
capable of receiving input events by definition so the capability monitoring
could be solved by making the capturing compositor a libei client and the
other process an EIS server. i.e. the circle is closed with:

[compositor|libei] -> [EIS|synergy-client]
                               ||
	                  [synergy-server|libei] -> [EIS|compositor]

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-24 05:22:26 +00:00
Peter Hutterer
90d2b1b980 Add support for absolute pointer motion events
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-24 11:24:58 +10:00
Peter Hutterer
09ad65d5c6 Implement eis_device_set_name and get_name
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-24 11:21:46 +10:00
Peter Hutterer
eb40872770 Fix client-side removal of devices
Because events may be in-transit when a client removes the device, we need to
make this a full roundtrip to the server. Otherwise the client may assume a
device is removed, releases all references and then gets the original device
added event for that device. Better to have this as a round-trip instead.

This requires the server to call eis_device_disconnect() on the removed
notifications but we do so during eis_event_unref() anyway in case the server
forgets.

And it changes some of the API behaviors, so adjust the tests for that.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-09-24 10:41:55 +10:00