Commit graph

124 commits

Author SHA1 Message Date
Peter Hutterer
1175595acf tools: make the demo client send the correct discrete events
Multiples of 120 are needed
2023-06-01 15:12:07 +10:00
Peter Hutterer
708aed6402 Export the event names through helper functions
Approximately every user of libei(s) will want something like this for
easier debugging, converting the numeric event type into something that
can be printed into the debug logs.

Let's provide this here so this doesn't need to be duplicated.
2023-05-22 02:39:08 +00:00
Ian Douglas Scott
cf932d1efb tools: Consistently refer to $XDG_RUNTIME_DIR
In one place, `$XDG_RUNTIME` was referenced. Which is wrong since the
variable is called `$XDG_RUNTIME_DIR`. The other uses referred to
`XDG_RUNTIME`, which could be taken as a shorthand, but it's clearer to
just use the name of the variable.
2023-05-20 02:28:48 +00:00
Peter Hutterer
3b8ce3dca1 Drop a few unused unref functions
Fixes 'warning: unused function 'ei_device_unrefp' [-Wunused-function]'
and friends.
2023-05-18 14:03:26 +10:00
Peter Hutterer
a890ce96bb tools: bind to the new capabilities in ei-debug-events 2023-05-10 12:21:04 +10:00
Peter Hutterer
a7f9712d83 tools: make the button/scroll caps available on demo-server seats 2023-05-08 14:08:32 +10:00
Peter Hutterer
1fc58e3a90 tools: ei-demo-client should bind all caps at once
Binding single capabilities is allowed but our device handling expects
the devices to be "complete". So if we bind to pointer only, the demo
server creates a pointer-only device and then fails at sending buttons.
2023-05-08 14:08:32 +10:00
Peter Hutterer
d01a39ef82 tools: ei-demo-client needs to bind to the new button/scroll caps 2023-05-08 13:49:31 +10:00
Peter Hutterer
3e39dabeac tools/demo-server: check if we have a touch before sending one
If the client was disconnected, the returned touch is NULL. Check for
that instead of blindly assuming we can send the touch.
2023-05-08 13:47:06 +10:00
Peter Hutterer
2a178f416f tools/demo-server: only print now if we actually have events
And move it to the start of the loop so we print the current timestamp
followed by processing the incoming events (if any). These events thus
should have timestamps less than now.
2023-05-08 13:47:06 +10:00
Peter Hutterer
e6954b76d3 eis: change the API to match the protocol interfaces closer
Same as the corresponding ei change a few commits ago, this one does all
the EIS renaming in the same manner.

As with the libei changes, an EIS implementation must now handle the
EIS_DEVICE_CAP_BUTTON and EI_DEVICE_CAP_SCROLL capabilities. In
virtually all cases, clients will likely expect that a device with the
pointer or absolute pointer capabilities will also have button and
scroll capabilities.
2023-05-05 14:04:17 +10:00
Peter Hutterer
da37da1308 ei: change the API to match the protocol interfaces closer
Now that the protocol interfaces are more fine-grained, let's match this
with the C API too.

This is just a rename of things so that in general
ei_pointer_*foo now becomes ei_foo*.

A few notable renames for better readability here:
- ei_device_scroll_delta (because scroll_scroll is awkward)
- ei_event_scroll_get_dx/dy and
  ei_event_scroll_get_discrete_dx/dy to indicate the delta-ness

Beyond that, clients must ensure to check/bind to the new
EI_DEVICE_CAP_BUTTON and EI_DEVICE_CAP_SCROLL capabilities to be able
to send button or scroll events.

Note that this API now allows for an EIS implementation to send a device
that only has a button or a scroll cap. Or a pointer cap without
buttons, etc. It's up to the clients how to handle such devices
(probably: ignore them).
2023-05-05 14:02:33 +10:00
Salman Malik
a438e46e18 config: Make memfd_create optional
`memfd_create` doesn't seem to be supported on
all platforms (e.g. ubuntu 18 has trouble with it).
Even though, I was able to substitute `memfd_create`
with a direct system call, I was not able to get
the `MFD_CLOXEC` flag (from fcntl.h) working cleanly
(there were redefinitions/conflicts for other
structures when trying to use <linux/*> headers).
Making it optional for time being till we have
figured out how to make it work broadly.
2023-03-28 11:24:06 +00:00
Peter Hutterer
30aab5179e Merge branch 'main' into wip/drop-protobuf 2023-03-07 12:55:18 +10:00
Peter Hutterer
7810be8a80 meson: split into separate meson.build files for src/tools 2023-03-07 11:10:06 +10:00
Peter Hutterer
44295ab044 tools: add touch support to the ei-demo-client 2023-03-06 16:25:04 +10:00
Peter Hutterer
46bef9fe86 tools: add touchscreen support to the eis-demo-server 2023-03-06 16:11:55 +10:00
Peter Hutterer
8c2f51fcff tools: fix a debug message in the demo client 2023-03-06 16:11:53 +10:00
Jonas Ådahl
e4f23f69fc demos: Print timestamp 2023-03-03 11:27:01 +10:00
Peter Hutterer
c5ebd345fd tools: copy the default log handler to the eis demo server
The default log handler logs to stderr, but we want stdout here to have
it intermixed with our real log messages (easier to debug this way).
Would probably be better to have this somewhere shared but for now this
will do.
2023-03-03 11:16:48 +10:00
Peter Hutterer
1925218e15 tools: whitespace fix in the demo server 2023-02-13 13:24:37 +10:00
Peter Hutterer
92f92bc3a5 tools: cleanup our clients in the eis demo server
Where we're interrupted before a disconnect event from the client, we
would leave the demo client hanging. This upsets valgrind.
2023-02-13 13:24:37 +10:00
Peter Hutterer
129eabcd29 tools: add a comment to the demo server
Might save some other poor soul having to debug this ...
2023-02-13 13:24:37 +10:00
Peter Hutterer
ff9830c122 Add a sequence number to START_EMULATING
This makes it easier to correlate a particular input transaction
(whether there are events or not) with out-of-band information like the
planned portal InputCapture::Activated signal's "activation-id".
2023-02-09 11:48:29 +10:00
Peter Hutterer
a5cc87c837 Purge the properties from the protocol
The primary use-case for these properties in libei itself was to send
some fixed information (pid, cmdline and conection type). In the portal
case, these can be obtained out-of-band via the portal. In the
non-portal case these can be obtained from the socket itself (fetch pid,
look up /proc/pid/cmdline) which is just as reliable as trusting
whatever libei sends.

The only other use-case for the properties was the activation id in the
InputCapture::Activated portal signal. This can be achieved with a
serial in the START_EMULATING event.
2023-02-09 11:48:29 +10:00
Peter Hutterer
affc464caa util-time: fix the us2ms function
Turns out this was converting in the wrong direction and the only call
site we had didn't notice/care.
2023-02-01 12:52:34 +10:00
Peter Hutterer
eeefb3dc00 liboeffis is a wrapper library for the RemoteDesktop communication
libei used to have direct portal support code (see the git history) but:
- that code was a custom proposed portal that never went anywhere
- libei has slowly changed to be more an input event transport layer since
  it is now also used sending events *to* a libei context
- a number of libei users will never need the DBus code, either because they
  don't want it or because they talk Dbus themselves na ddon't need this
  abstraction.

Luckily, it's quite easy to move this into a separate library with a
simple API that does, effectively, the same trick as the old portal backend.
This API is aiming to be as simple as possible because the tools that
require anything more complex should talk to DBus directly.

An example tool that uses the API to retrieve an EIS fd over the
RemoteDesktop portal is included in this patch.

"Öffis" is a German word meaning public transport. It also sounds like the
French Œuf, the word for egg.

Co-authored-by: Olivier Fourdan <ofourdan@redhat.com>
2022-12-08 11:22:50 +10:00
Peter Hutterer
8fc654bfb0 Purge the portal code
The original idea here was that we would have an EmulatedInput portal
that allows the application to connect directly to the EIS
implementation to exchange input events - instead of ping-ponging DBus
events through the xdg-desktop-portal as the RemoteDesktop portal
requires.

This is no longer accurate, there are suggested PRs open to add
RemoteDesktop.ConnectToEIS to achieve the same through the existing
RemoteDesktop interface [1] and to add a new InputCapture portal
to allow for events to be sent to a libei receiver context [2].

The example EmulatedInput portal is thus superfluous and can be removed
from here.

We could switch the ei_setup_backend_portal() code to use RemoteDesktop
or InputCapture, depending on the context type, the utility of this is
questionable. Interaction with portals is complex, one needs to
implement the Session/Request interfaces correctly and in the case of
InputCapture also handle the complex zones/pointer barrier setup.
libportal does some of this (or it will, anyway) so it's more useful for
an application to use libportal and then just pass the received fd to
libei.

If there is a future need for this to be handled as part of libei, we
can (re)implement this, but for now it's best to just purge all of this.

[1] https://github.com/flatpak/xdg-desktop-portal/pull/762
[2] https://github.com/flatpak/xdg-desktop-portal/pull/714
2022-12-08 10:45:47 +10:00
Peter Hutterer
06210ee439 tools: drop help for obsolete --sender option from the eis-demo-server 2022-09-06 08:56:20 +10:00
Peter Hutterer
0a382dec3d tools: print property values in the demo client and server 2022-08-01 10:12:06 +00:00
Peter Hutterer
27af399992 tools/demo-client: keep a ref to the ptr/kbd/abs devices
Otherwise calling unref on them on exit makes the demo client go boom.
2022-08-01 10:12:06 +00:00
Peter Hutterer
f6aaedf701 tools/demo-client: stop means stop sending events
The demo client has an inner while loop for the events, followed by
the code to send events to the server. Skip that code if our while loop
indicated we'll stop.
2022-08-01 10:12:06 +00: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
a330b31713 tools: add ei-debug-events
Prints out a YAML-compatible list of events for debugging.

This tool also takes a --socketfd argument which names the fd number
that the EIS connection is on. This allows the tool to be started from
some other process that does the EIS connection, e.g. a portal
implementation.
2022-04-22 09:47:04 +10:00
Peter Hutterer
eea1a24285 tools: fix a few issues in the demo server
A few copy/paste errors and a use-after-free because our demo-client was
never removed from the server list on disconnect.
2022-04-07 14:55:58 +10:00
Peter Hutterer
21985060b9 tools: print the returned negative errno on failure
errno is at some other random value
2022-04-07 13:42:03 +10: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
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
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
420c461643 tools: add active/passive mode to the demo server and client
Starting the demo client with --passive initializes a passive context,
and the server will send events to any active context.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-03-04 14:04:33 +10: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
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
5f2afdf806 Fix a bunch of compiler warnings
Most are signed vs unsigned, the remaining ones are an unused
variables/functions.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-03-01 23:28:49 +00:00
Peter Hutterer
56187e1543 eis-demo-server: add ei client tracking
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2022-02-28 02:23:40 +00:00
Peter Hutterer
802e5965cc tools: add a blurb to each tool to list what it is for
Let's not force users/developers to dig through the commit log to figure
out what each tool does.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2021-09-01 12:29:44 +10:00
Peter Hutterer
28532aa9c6 tools: no need to abort on errors in the fake portal
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2021-09-01 12:29:44 +10:00
Peter Hutterer
b863445c28 tools: default to LIBEI_SOCKET in the fake portal too
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2021-09-01 12:29:44 +10:00
Peter Hutterer
df5237a7ea tools: update the portal for the latest version
The latest version of the portal communication adds session capabilities
and wraps the calls a bit differently.

This now  also includes a helper tool for the impl.portal part so we can
run xdg-desktop-portal against that without the need for a mutter
implementation.
Use:
- run the eis-demo-server
- run the eis-fake-impl-portal
- run the xdg-desktop-portal (it'll use the fake impl portal)
- run an ei client with the portal enabled

Note that the ei-fake-portal is a shortcut, it will open eis directly
without going through the impl.portal.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2021-09-01 12:29:44 +10:00
Peter Hutterer
4b3b48291b tools: whitespace fixes in the demo client
And fix a missing field initializer warning while we're here.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2021-08-27 09:14:00 +10:00