Commit graph

874 commits

Author SHA1 Message Date
Peter Hutterer
bd1dd67892 test: fix the oeffis pytest
Since the soname was added, the liboeffis.so file no longer exists in
the build directory - it is created on install.

Not sure how this passed the CI pytest run but it certainly fails
locally.
2023-05-10 12:10:40 +10:00
Peter Hutterer
333e98a191 doc/api: add some more high-level overview to the libei page 2023-05-10 11:36:51 +10:00
Peter Hutterer
8302b1ddac doc/api: add the unicode icons for a splash of color
Sometimes it's good to focus on the important issues in life.
2023-05-10 11:36:51 +10:00
Peter Hutterer
5c64a9d77c doc/api: add liboeffis to the various sections 2023-05-10 11:36:51 +10:00
Peter Hutterer
e130c9aeb1 meson.build: add soname versions to the generated libraries
Our soname tracks the library version, even though on Linux only the
first number is actually being used. The rest is just to make it easier
for tools to find the right version. So let's do that.

And until the 1.0 version is out and our library ABI is stable, hardcode
to 1.0.0

This commit also moves the header define up for better grouping.
2023-05-09 00:52:43 +00:00
Peter Hutterer
b37868e904 doc/protocol: fix link to the liboeffis API docs 2023-05-09 09:56:29 +10:00
Peter Hutterer
5a1caca643 doc/protocol: fix the link to the C libraries section 2023-05-09 09:53:51 +10:00
Peter Hutterer
40ba30da82 meson.build: install our headers into a versioned subfolder
This makes it possible to have multiple (incompatible) versions
installed simultaneously.

Any incompatible version requires us bumping the major version, so our
headers are simply installed into the hardcoded libei-1.0 subdir.

This also changes the pkgconfig names to include the API version, so
it's now `pkgconfig --cflags libei-1.0`.
2023-05-08 14:33:50 +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
61d97269ab ei: fix capability checks for sending events
Fixes da37da1308
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
408a3a9462 eis: drop the vestiges of client restrictions
Leftover from 479bda259a (and possibly
others). This dates back to when a client could have restrictions
configured on the same fd. This is now all out-of-band (portals!) so the
compositor knows what the client is allowed to set up anyway.

No need for this (read-only) API here.
2023-05-08 13:38:40 +10:00
Peter Hutterer
f56a9000c0 eis: split up the API docs into smaller categories
See c076c48336 for the libei change,
mostly copy-pasted after that anyway.
2023-05-08 13:30:36 +10:00
Peter Hutterer
08efdee83d eis: remove a misleading paragraph from the docs
The 99% use-case for receiver clients is probably going to be capturing
logical input, not physical input.
2023-05-08 13:03:15 +10:00
Peter Hutterer
b3c202af23 ei: tighten the event type checks
Require exact event types, not just approximate ones. It's always a bug
to call any of these functions for an event type that's something else.
2023-05-08 12:49:40 +10:00
Peter Hutterer
c076c48336 doc: split the libei doxygen API into multiple submodules
The API is quite long now, so let's split it up into multiple logical
groups. The main page is now roughly graspable, with seats, devices,
regions and keymaps in submodules.

The sender and receiver APIs are also grouped into two separate APIs -
anyone implementing either doesn't need the other, it just messes things
up.
2023-05-05 14:05:30 +10:00
Peter Hutterer
5bb6e80ded doc: some minor doxygen updates 2023-05-05 14:05:30 +10:00
Peter Hutterer
aa866c5a92 Add a few more doxygen comments 2023-05-05 14:05:30 +10:00
Peter Hutterer
60d94aecda doc: rename the mainpage sections to get @ref ei to work
Otherwise doxygen tries to link to these sections instead to the struct
ei/eis it's supposed to link to.
2023-05-05 14:05:30 +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
Peter Hutterer
6ee202569f doc: point to the main branch, not the master branch 2023-05-04 14:11:34 +10:00
Peter Hutterer
e1b2db8c10 Purge the pseudo-code examples
They haven't been kept up-to-date with API changes, so let's point to
the actual working demo tools instead.
2023-05-04 14:11:34 +10:00
Peter Hutterer
a902d5dbd8 protocol: replace the capabilities enum with an interface list
Previously we had ei_seat.capabilities and ei_device.capabilities,
both referring to the same enum. The seat caps were used to bind,
the device caps were used to announce capabilities.

The device caps were already mostly superfluous as the information
they carried was implicitly available by the set of interfaces
the device announced - if the device has a keyboard interface
it must also have the keyboard capability.

So let's drop the separate enum and make the capabilities
the set of supported interfaces. In the device we can drop the
event directly and just send the interface list. In the seat
we have a capability event that sends each *possible* interface
with a custom-assigned mask. The client can then use that mask
to bind to the capability as before.

For example:
   <- ei_seat.capability(0x1, "ei_pointer")
   <- ei_seat.capability(0x4, "ei_keyboard")
   <- ei_seat.capability(0x8, "ei_touchscreen")
   <- ei_seat.done()
   -> ei_seat.bind(0x4 | 0x8)  # bind to keyboard and touchscreen
   <- ei_seat.device()
   -> ei_device.interface("ei_keyboard")
   -> ei_device.interface("ei_touchscreen")
   <- ei_device.done()

In the generated bindings we simply use the interface index
to generate the masks, but the protocol at least states that
the mask may not be constant.

Because the button/scroll interfaces are not exposed by the C API, some
of the handling is a bit awkward since we need to use both depending
whether we have pointer/pointer_absolute selected.

Fixes #28

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2023-05-02 05:53:25 +00:00
Peter Hutterer
bf88b34918 Split the ei_pointer interface up into its components
Split the ei_pointer protocol interface into ei_pointer,
ei_pointer_absolute, ei_scroll and ei_button.

This gets rid of the slightly awkward pointer vs pointer absolute
handling. Those were two different capabilities but tied to the same
interface.

Plus it paves the way for devices that are keyboards with scroll
buttons, etc.
2023-05-02 05:53:25 +00:00
Peter Hutterer
a157cbfa42 Rename an internal struct to scroll_state
To avoid future name clashes.
2023-05-02 05:53:25 +00:00
Peter Hutterer
6215eecfbd test: fix a debug log typo 2023-04-27 15:22:07 +10:00
Peter Hutterer
d21726965b doc: move the sentinel attribute to unconfuse doxygen
The compiler doesn't care, doxygen apprently does.
2023-04-27 14:42:25 +10:00
Peter Hutterer
97a7a3e360 doc: fix two obsolete API comments 2023-04-27 14:42:22 +10:00
Peter Hutterer
53f4564019 meson: require the python modules that the scanner requires
The scanner uses attr and jinja2, so let's make sure we have them.
2023-04-26 14:25:21 +10:00
Peter Hutterer
f6cd949472 test: cast the varargs to the right data size
Fixes the test suite issues on 32 bit. Only needed for the 64 bit
arguments, but let's do the 32 bit as well for solidarity and
readability.

Fixes #30
2023-04-26 12:18:58 +10:00
Peter Hutterer
9c5c3c890f ei: de-duplicate ei_seat_unbind_capability
ei_seat_unbind_capabilities does the same, so let's use that.
2023-04-14 10:52:39 +10:00
Peter Hutterer
cf74cfeb1e ei: fix ei_seat_unbind_capabilities
Simplify the code a little but more importantly: if we get down to zero
capabilities close the devices - just like we do in
ei_seat_unbind_capability.
2023-04-14 10:51:40 +10:00
Peter Hutterer
1a4764d99b libei 0.5 2023-04-06 14:19:22 +10:00
Peter Hutterer
f15736e809 scanner: add a validator for Interface.mode
Not really needed since we currently have an assert in create but this
makes the code more obvious.
2023-04-06 14:01:07 +10:00
Peter Hutterer
3546a443a9 scanner: auto-mangle the interface name when accessed
Now that we only have one place where we need to mangle the name, let's
make this a property of the Interface instead.
2023-04-06 14:00:44 +10:00
Peter Hutterer
cfd2980ae4 scanner: look up interfaces by protocol name
Now that we have it, let's use it instead having to mangle names.
2023-04-06 13:57:20 +10:00
Peter Hutterer
24680aef2e test: use an enum iterator to loop through the interface names 2023-04-06 13:57:20 +10:00
Peter Hutterer
5aad9fd777 scanner: add the protocol name so we can compile some #defines
The protocol name on an interface is a fixed string that is part of
the ABI since it's used in a few messages (e.g.
ei_handshake.interface_version). To avoid typos, let's expose that
string in the scanner and #define it in the generated sources.
2023-04-06 13:57:20 +10:00
Peter Hutterer
fa07430683 scanner: use mangle_name for the interface name 2023-04-06 13:57:20 +10:00
Peter Hutterer
99b36ba652 test: add a test for pointer vs abs pointer receiving 2023-04-06 13:57:20 +10:00
Peter Hutterer
7f7880d953 test: add test for receiving the device interfaces 2023-04-06 13:57:20 +10:00
Peter Hutterer
5b1b5aec1a proto: replace pointer/keyboard/touchscreen with a generic "interface" event
Since these events are merely notifications of a single object, we can make
this more generic. This allows us to introduce future capabilities without
having to bump the seat.
2023-04-06 13:57:18 +10:00
Peter Hutterer
4b77664dc1 test: if we fail to load liboeffis.so, skip the rest of the pytests
This gives us a nicer behavior when (semi-intentionally) running pytest
in the source directory.
2023-04-06 12:04:51 +10:00
Peter Hutterer
6179c91580 test: fix the exception check for the missing eiproto module
When running pytest from the source directory we get a
ModuleNotFoundError, not an ImportError.
2023-04-06 12:04:35 +10:00
Peter Hutterer
0aa8bab9c0 test: drop the default timeouts to 2
There's no need to wait any longer.
2023-04-05 14:22:31 +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