Log of Meson test suite run on 2024-08-12T18:28:25.769106

==================================== 1/9 =====================================
test:         libei / unit-tests-utils
start time:   16:28:25
duration:     0.04s
result:       exit status 0
command:      UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 LD_LIBRARY_PATH=/var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/subprojects/munit MESON_TEST_ITERATION=1 MALLOC_PERTURB_=73 /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/test/unit-tests-utils --log-visible debug
----------------------------------- stdout -----------------------------------
Running test suite with seed 0xab9fdba2...
test_bits_mask                       [ OK    ] [ 0.00000585 / 0.00000488 CPU ]
test_bits_flag_8                     [ OK    ] [ 0.00000562 / 0.00000463 CPU ]
test_bits_flag_32                    [ OK    ] [ 0.00000484 / 0.00000443 CPU ]
test_signal_blocker                  [ OK    ] [ 0.00001751 / 0.00001716 CPU ]
test_pass_fd                         [ OK    ] [ 0.00017324 / 0.00017263 CPU ]
test_iobuf_recv_fd                   [ OK    ] [ 0.00009922 / 0.00009885 CPU ]
test_iobuf_append_fd_too_many        [ OK    ] [ 0.00008108 / 0.00008081 CPU ]
test_iobuf_append_fd                 [ OK    ] [ 0.00006799 / 0.00006701 CPU ]
test_iobuf_append_short              [ OK    ] [ 0.00003249 / 0.00003198 CPU ]
test_iobuf_pop                       [ OK    ] [ 0.00002763 / 0.00002731 CPU ]
test_iobuf_prepend_empty_buffer      [ OK    ] [ 0.00002261 / 0.00002243 CPU ]
test_iobuf_append_values             [ OK    ] [ 0.00001811 / 0.00001791 CPU ]
test_iobuf_append_prepend            [ OK    ] [ 0.00001948 / 0.00001934 CPU ]
test_iobuf_take_fd                   [ OK    ] [ 0.00001691 / 0.00001674 CPU ]
test_iobuf_cleanup                   [ OK    ] [ 0.00002958 / 0.00002905 CPU ]
test_iobuf_new                       [ OK    ] [ 0.00002827 / 0.00002803 CPU ]
list_foreach                         [ OK    ] [ 0.00000375 / 0.00000361 CPU ]
list_first_last                      [ OK    ] [ 0.00000423 / 0.00000396 CPU ]
test_list_nth                        [ OK    ] [ 0.00000451 / 0.00000407 CPU ]
test_list_append                     [ OK    ] [ 0.00000409 / 0.00000383 CPU ]
test_list_insert                     [ OK    ] [ 0.00000435 / 0.00000406 CPU ]
test_source_write                    [ OK    ] [ 0.00016453 / 0.00016427 CPU ]
test_source_readd                    [ OK    ] [ 0.00004808 / 0.00004779 CPU ]
test_source                          [ OK    ] [ 0.00006657 / 0.00006640 CPU ]
test_sink                            [ OK    ] [ 0.00003179 / 0.00003150 CPU ]
test_strv_from_mem                   [ OK    ] [ 0.00005305 / 0.00005286 CPU ]
test_strlen0                         [ OK    ] [ 0.00000468 / 0.00000437 CPU ]
test_cmdline_as_str                  [ OK    ] [ 0.00023716 / 0.00023750 CPU ]
test_strreplace                      [ OK    ] [ 0.00002892 / 0.00002880 CPU ]
test_strendswith                     [ OK    ] [ 0.00000836 / 0.00000820 CPU ]
test_strstartswith                   [ OK    ] [ 0.00000823 / 0.00000807 CPU ]
test_strstrip                        [ OK    ] [ 0.00003597 / 0.00003583 CPU ]
test_strjoin                         [ OK    ] [ 0.00002604 / 0.00002594 CPU ]
test_kvsplit_double                  [ OK    ] [ 0.00006159 / 0.00006150 CPU ]
test_strsplit                        [ OK    ] [ 0.00004547 / 0.00004541 CPU ]
35 of 35 (100%) tests successful, 0 (0%) test skipped.
==============================================================================

==================================== 2/9 =====================================
test:         libei / unit-tests-ei
start time:   16:28:25
duration:     0.04s
result:       exit status 0
command:      UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 LD_LIBRARY_PATH=/var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/subprojects/munit MALLOC_PERTURB_=174 MESON_TEST_ITERATION=1 /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/test/unit-tests-ei --log-visible debug
----------------------------------- stdout -----------------------------------
Running test suite with seed 0xe908de59...
test_brei_send_message               [ OK    ] [ 0.00032133 / 0.00032054 CPU ]
test_brei_marshal_bad_sig            [ OK    ] [ 0.00005700 / 0.00005286 CPU ]
test_brei_marshal                    [ OK    ] [ 0.00002414 / 0.00002384 CPU ]
test_brei_string_proto_length        [ OK    ] [ 0.00000705 / 0.00000630 CPU ]
test_configure_name                  [ OK    ] [ 0.00014532 / 0.00014517 CPU ]
test_init_unref                      [ OK    ] [ 0.00003791 / 0.00003771 CPU ]
test_log_handler                     [ OK    ] [ 0.00012633 / 0.00012625 CPU ]
test_region_convert                  [ OK    ] [ 0.00000496 / 0.00000468 CPU ]
test_region_contains                 [ OK    ] [ 0.00000501 / 0.00000475 CPU ]
test_region_setters                  [ OK    ] [ 0.00003046 / 0.00003015 CPU ]
10 of 10 (100%) tests successful, 0 (0%) test skipped.
==============================================================================

==================================== 3/9 =====================================
test:         libei / unit-tests-eis
start time:   16:28:25
duration:     0.03s
result:       exit status 0
command:      UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MALLOC_PERTURB_=231 LD_LIBRARY_PATH=/var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/subprojects/munit MESON_TEST_ITERATION=1 /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/test/unit-tests-eis --log-visible debug
----------------------------------- stdout -----------------------------------
Running test suite with seed 0xd545b0a7...
test_brei_send_message               [ OK    ] [ 0.00027679 / 0.00027198 CPU ]
test_brei_marshal_bad_sig            [ OK    ] [ 0.00004818 / 0.00004782 CPU ]
test_brei_marshal                    [ OK    ] [ 0.00003694 / 0.00003652 CPU ]
test_brei_string_proto_length        [ OK    ] [ 0.00000494 / 0.00000450 CPU ]
test_log_handler                     [ OK    ] [ 0.00011919 / 0.00011904 CPU ]
test_region_contains                 [ OK    ] [ 0.00000297 / 0.00000278 CPU ]
test_region_setters                  [ OK    ] [ 0.00000399 / 0.00000382 CPU ]
7 of 7 (100%) tests successful, 0 (0%) test skipped.
==============================================================================

==================================== 4/9 =====================================
test:         libei / unit-tests-oeffis
start time:   16:28:25
duration:     0.03s
result:       exit status 0
command:      UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 LD_LIBRARY_PATH=/var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/subprojects/munit MALLOC_PERTURB_=150 MESON_TEST_ITERATION=1 /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/test/unit-tests-oeffis --log-visible debug
----------------------------------- stdout -----------------------------------
Running test suite with seed 0xb38057e4...
test_failed_connect                  [ OK    ] [ 0.00130207 / 0.00034065 CPU ]
test_init_unref                      [ OK    ] [ 0.00004902 / 0.00004873 CPU ]
2 of 2 (100%) tests successful, 0 (0%) test skipped.
==============================================================================

==================================== 5/9 =====================================
test:         libei / dtdcheck
start time:   16:28:25
duration:     0.05s
result:       exit status 0
command:      MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MESON_TEST_ITERATION=1 UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MALLOC_PERTURB_=18 /usr/bin/xmllint --dtdvalid /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0/proto/protocol.dtd /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0/proto/protocol.xml
----------------------------------- stdout -----------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="ei">

  <copyright>
    Copyright © 2008-2011 Kristian Høgsberg
    Copyright © 2010-2011 Intel Corporation
    Copyright © 2012-2013 Collabora, Ltd.
    Copyright © 2023 Red Hat, Inc.

    Permission is hereby granted, free of charge, to any person
    obtaining a copy of this software and associated documentation files
    (the "Software"), to deal in the Software without restriction,
    including without limitation the rights to use, copy, modify, merge,
    publish, distribute, sublicense, and/or sell copies of the Software,
    and to permit persons to whom the Software is furnished to do so,
    subject to the following conditions:

    The above copyright notice and this permission notice (including the
    next paragraph) shall be included in all copies or substantial
    portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
    ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.
  </copyright>

  <interface name="ei_handshake" version="1">
    <description summary="handshake object">
      This is a special interface to setup the client as seen by the EIS
      implementation. The object for this interface has the fixed object
      id 0 and only exists until the connection has been set up, see the
      ei_handshake.connection event.

      The ei_handshake version is 1 until:
      - the EIS implementation sends the handshake_version event with
        a version other than 1, and, in response,
      - the client sends the handshake_version request with a
        version equal or lower to the EIS implementation version.

      The EIS implementation must send the handshake_version event immediately
      once the physical connection has been established.

      Once the ei_connection.connection event has been sent the handshake
      is destroyed by the EIS implementation.
    </description>

    <!-- ei_handshake client requests version 1 -->

    <request name="handshake_version" since="1">
      <description summary="handshake version notification request">
        Notifies the EIS implementation that this client supports the
        given version of the ei_handshake interface. The version number
        must be less than or equal to the version in the
        handshake_version event sent by the EIS implementation when
        the connection was established.

        Immediately after sending this request, the client must assume the negotiated
        version number for the ei_handshake interface and the EIS implementation
        may send events and process requests matching that version.

        This request must be sent exactly once and it must be the first request
        the client sends.
      </description>
      <arg name="version" type="uint32" summary="the interface version"/>
    </request>

    <request name="finish" since="1">
      <description summary="setup completion request">
        Notify the EIS implementation that configuration is complete.

        In the future (and possibly after requiring user interaction),
        the EIS implementation responds by sending the ei_handshake.connection event.
      </description>
    </request>

    <enum name="context_type" since="1">
      <description summary="context type">
        This enum denotes context types for the libei context.

        A context type of receiver is a libei context receiving events
        from the EIS implementation. A context type of sender is a libei context
        sending events to the EIS implementation.
      </description>
      <entry name="receiver" value="1" summary="this client receives events from the EIS implementation"/>
      <entry name="sender" value="2" summary="this client sends events to the EIS implementation"/>
    </enum>

    <request name="context_type" since="1">
      <description summary="context type request">
        Notify the EIS implementation of the type of this context. The context types
        defines whether the client will send events to or receive events from the
        EIS implementation.

        Depending on the context type, certain requests must not be used and some
        events must not be sent by the EIS implementation.

        This request is optional, the default client type is context_type.receiver.
        This request must not be sent more than once and must be sent before
        ei_handshake.finish.
      </description>
      <arg name="context_type" type="uint32" enum="context_type" summary="the client context type"/>
    </request>

    <request name="name" since="1">
      <description summary="context name request">
        Notify the EIS implementation of the client name. The name is a
        human-presentable UTF-8 string and should represent the client name
        as accurately as possible. This name may be presented to the user
        for identification of this client (e.g. to confirm the client has
        permissions to connect).

        There is no requirement for the EIS implementation to use this name. For
        example, where the client is managed through an XDG Desktop Portal an EIS
        implementation would typically use client identification information sent
        by the portal instead.

        This request is optional, the default client name is implementation-defined.
        This request must not be sent more than once and must be sent before
        ei_handshake.finish.
      </description>
      <arg name="name" type="string" summary="the client name"/>
    </request>

    <request name="interface_version" since="1">
      <description summary="interface support notification">
        Notify the EIS implementation that the client supports the
        given named interface with the given maximum version number.

        Future objects created by the EIS implementation will
        use the respective interface version (or any lesser version)
        as announced by the ei_connection.interface_version event.

        This request must be sent for the "ei_connection" interface,
        failing to do so will result in the EIS implementation disconnecting
        the client on ei_handshake.finish.

        This request must not be sent for the "ei_handshake" interface, use
        the ei_handshake.handshake_version request instead.

        Note that an EIS implementation may consider some interfaces to
        be required and immediately ei_connection.disconnect a client
        not supporting those interfaces.

        This request must not be sent more than once per interface and must be
        sent before ei_handshake.finish.
      </description>
      <arg name="name" type="string" summary="the interface name"/>
      <arg name="version" type="uint32" summary="the interface version"/>
    </request>

    <!-- ei_handshake events version 1 -->
    <event name="handshake_version" since="1">
      <description summary="handshake version notification event">
        This event is sent exactly once and immediately after connection
        to the EIS implementation.

        In response, the client must send the ei_handshake.handshake_version request
        with any version up to including the version provided in this event.
        See the ei_handshake.handshake_version request for details on what happens next.
      </description>
      <arg name="version" type="uint32" summary="the interface version"/>
    </event>

    <event name="interface_version" since="1">
      <description summary="interface support event">
        Notifies the client that the EIS implementation supports
        the given named interface with the given maximum version number.

        The client must not assume those interfaces are supported unless
        and until those versions have been received.

        This request must not be sent for the "ei_handshake" interface, use
        the handshake_version event instead.

        This event may be sent by the EIS implementation for any
        other supported interface (but not necessarily all supported
        interfaces) before the ei_handshake.connection event.
      </description>
      <arg name="name" type="string" summary="the interface name"/>
      <arg name="version" type="uint32" summary="the interface version"/>
    </event>

    <event name="connection" type="destructor" since="1">
      <description summary="the core connection object">
        Provides the client with the connection object that is the top-level
        object for all future requests and events.

        This event is sent exactly once at some unspecified time after the client
        sends the ei_handshake.finish request to the EIS implementation.

        The ei_handshake object will be destroyed by the
        EIS implementation immediately after this event has been sent, a
        client must not attempt to use it after that point.

        The version sent by the EIS implementation is the version of the "ei_connection"
        interface as announced by ei_handshake.interface_version, or any
        lower version.

        The serial number is the start value of the EIS implementation's serial
        number sequence. Clients must not assume any specific value for this
        serial number. Any future serial number in any event is monotonically
        increasing by an unspecified amount.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
      <arg name="connection" type="new_id" interface="ei_connection" summary="the connection object"/>
      <arg name="version" type="uint32" summary="the version of the connection object"/>
    </event>
  </interface>

  <interface name="ei_connection" version="1">
    <description summary="core global object">
      The core connection object. This is the top-level object for any communication
      with the EIS implementation.

      Note that for a client to receive this object, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <!-- ei_connection client requests version 1 -->

    <request name="sync" since="1">
      <description summary="asynchronous roundtrip">
        The sync request asks the EIS implementation to emit the 'done' event
        on the returned ei_callback object. Since requests are
        handled in-order and events are delivered in-order, this can
        be used as a synchronization point to ensure all previous requests and the
        resulting events have been handled.

        The object returned by this request will be destroyed by the
        EIS implementation after the callback is fired and as such the client must not
        attempt to use it after that point.

        The callback_data in the ei_callback.done event is always zero.

        Note that for a client to use this request it must announce
        support for the "ei_callback" interface in ei_handshake.interface_version.
        It is a protocol violation to request sync without having announced the
        "ei_callback" interface and the EIS implementation must disconnect
        the client.
      </description>
      <arg name="callback" type="new_id" interface="ei_callback" summary="callback object for the sync request"/>
      <arg name="version" type="uint32" summary="the interface version"/>
    </request>

    <request name="disconnect" type="destructor" since="1">
      <description summary="disconnection request">
        A request to the EIS implementation that this client should be disconnected.
        This is a courtesy request to allow the EIS implementation to distinquish
        between a client disconnecting on purpose and one disconnecting through the
        socket becoming invalid.

        Immediately after sending this request, the client may destroy the
        ei_connection object and it should close the socket. The EIS implementation
        will treat the connection as already disconnected on receipt and does not
        send the ei_connection.disconnect event in response to this request.
      </description>
    </request>

    <!-- ei_connection events version 1 -->

    <enum name="disconnect_reason" since="1">
      <description summary="disconnection reason">
        A reason why a client was disconnected. This enum is intended to
        provide information to the client on whether it was disconnected as
        part of normal operations or as result of an error on either the client
        or EIS implementation side.

        A nonzero value describes an error, with the generic value "error" (1) reserved
        as fallback.

        This enum may be extended in the future, clients must be able to handle
        values that are not in their supported version of this enum.
      </description>
      <entry name="disconnected" value="0" summary="client was purposely disconnected"/>
      <entry name="error" value="1" summary="an error caused the disconnection"/>
      <entry name="mode" value="2" summary="sender/receiver client sent request for receiver/sender mode"/>
      <entry name="protocol" value="3" summary="client committed a protocol violation"/>
      <entry name="value" value="4" summary="client sent an invalid value"/>
      <entry name="transport" value="5" summary="error on the transport layer"/>
    </enum>

    <event name="disconnected" type="destructor" since="1">
      <description summary="disconnection event">
        This event may be sent by the EIS implementation immediately before
        the client is disconnected. The last_serial argument is set to the last
        serial number used in a request by the client or zero if the client has not
        yet issued a request.

        Where a client is disconnected by EIS on purpose, for example after
        a user interaction, the reason is disconnect_reason.disconnected (i.e. zero)
        and the explanation is NULL.

        Where a client is disconnected due to some invalid request or other
        protocol error, the reason is one of disconnect_reason (i.e. nonzero) and
        explanation may contain a string explaining why. This string is
        intended to help debugging only and is not guaranteed to stay constant.

        The ei_connection object will be destroyed by the
        EIS implementation immediately after this event has been sent, a
        client must not attempt to use it after that point.

        There is no guarantee this event is sent - the connection may be closed
        without a disconnection event.
      </description>
      <arg name="last_serial" type="uint32" summary="the last serial sent by the EIS implementation"/>
      <arg name="reason" type="uint32" enum="disconnect_reason" summary="the reason for being disconnected"/>
      <arg name="explanation" type="string" allow-null="true" summary="an explanation for debugging purposes"/>
    </event>

    <event name="seat" since="1">
      <description summary="Seat presence notification">
        Notification that a new seat has been added.

        A seat is a set of input devices that logically belong together.

        This event is only sent if the client announced support for the
        "ei_seat" interface in ei_handshake.interface_version.
        The interface version is equal or less to the client-supported
        version in ei_handshake.interface_version for the "ei_seat"
        interface.
      </description>
      <arg name="seat" type="new_id" interface="ei_seat"/>
      <arg name="version" type="uint32" summary="the interface version"/>
    </event>

    <event name="invalid_object" since="1">
      <description summary="Invalid object in request notification">
        Notification that an object ID used in an earlier request was
        invalid and does not exist.

        This event is sent by the EIS implementation when an object that
        does not exist as seen by the EIS implementation. The protocol is
        asynchronous and this may occur e.g. when the EIS implementation
        destroys an object at the same time as the client requests functionality
        from that object. For example, an EIS implementation may send
        ei_device.destroyed and destroy the device's resources (and protocol object)
        at the same time as the client attempts to ei_device.start_emulating
        on that object.

        It is the client's responsibilty to unwind any state changes done
        to the object since the last successful message.
      </description>
      <arg name="last_serial" type="uint32" summary="the last serial sent by the EIS implementation"/>
      <arg name="invalid_id" type="uint64"/>
    </event>

    <event name="ping" since="1">
      <description summary="ping event">
        The ping event asks the client to emit the 'done' event
        on the provided ei_pingpong object. Since requests are
        handled in-order and events are delivered in-order, this can
        be used as a synchronization point to ensure all previous requests
        and the resulting events have been handled.

        The object returned by this request must be destroyed by the
        ei client implementation after the callback is fired and as
        such the client must not attempt to use it after that point.

        The callback_data in the resulting ei_pingpong.done request is
        ignored by the EIS implementation.

        Note that for a EIS implementation to use this request the client must
        announce support for this interface in ei_handshake.interface_version. It is
        a protocol violation to send this event to a client without the
        "ei_pingpong" interface.
      </description>
      <arg name="ping" type="new_id" interface="ei_pingpong" summary="callback object for the ping request"/>
      <arg name="version" type="uint32" summary="the version of the callback object"/>
    </event>
  </interface>

  <interface name="ei_callback" version="1">
    <description summary="callback object">
      Interface for ensuring a roundtrip to the EIS implementation.
      Clients can handle the 'done' event to get notified when
      the related request that created the ei_callback object is done.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <!-- ei_callback events version 1 -->

    <event name="done" type="destructor" since="1">
      <description summary="done event">
        Notify the client when the related request is done. Immediately after this event
        the ei_callback object is destroyed by the EIS implementation and as such the
        client must not attempt to use it after that point.
      </description>
      <arg name="callback_data" type="uint64" summary="request-specific data for the callback"/>
    </event>
  </interface>

  <interface name="ei_pingpong" version="1">
    <description summary="callback object">
      Interface for ensuring a roundtrip to the client implementation.
      This interface is identical to ei_callback but is intended for
      the EIS implementation to enforce a roundtrip to the client.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <!-- ei_pingpong client requests version 1 -->

    <request name="done" type="destructor" since="1">
      <description summary="done event">
        Notify the EIS implementation when the related event is done. Immediately after this request
        the ei_pingpong object is destroyed by the client and as such must not be used
        any further.
      </description>
      <arg name="callback_data" type="uint64" summary="request-specific data for the callback"/>
    </request>

    <!-- ei_pingpong events version 1 -->
  </interface>

  <interface name="ei_seat" version="1">
    <description summary="seat object">
      An ei_seat represents a set of input devices that logically belong together. In most
      cases only one seat is present and all input devices on that seat share the same
      pointer and keyboard focus.

      A seat has potential capabilities, a client is expected to bind to those capabilities.
      The EIS implementation then creates logical input devices based on the capabilities the
      client is interested in.

      Immediately after creation of the ei_seat object, the EIS implementation sends a burst
      of events with information about this seat. This burst of events is terminated by the
      ei_seat.done event.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <!-- ei_seat client requests version 1 -->

    <request name="release" since="1">
      <description summary="Seat removal request">
        Notification that the client is no longer interested in this seat.
        The EIS implementation will release any resources related to this seat and
        send the ei_seat.destroyed event once complete.

        Note that releasing a seat does not guarantee another seat becomes available.
        In other words, in most single-seat cases, releasing the seat means the
        connection becomes effectively inert.
      </description>
    </request>

    <request name="bind" since="1">
      <description summary="Seat binding">
        Bind to the bitmask of capabilities given. The bitmask is zero or more of the
        masks representing an interface as provided in the ei_seat.capability event.
        See the ei_seat.capability event documentation for examples.

        Binding masks that are not supported in the ei_device's interface version
        is a client bug and may result in disconnection.

        A client may send this request multiple times to adjust the capabilities it
        is interested in. If previously-bound capabilities are dropped by the client,
        the EIS implementation may ei_device.remove devices that have these capabilities.
      </description>
      <arg name="capabilities" type="uint64" summary="bitmask of the capabilities"/>
    </request>

    <!-- ei_seat events version 1 -->

    <event name="destroyed" type="destructor" since="1">
      <description summary="Seat removal notification">
        This seat has been removed and a client should release all
        associated resources.

        This ei_seat object will be destroyed by the EIS implementation immmediately after
        after this event is sent and as such the client must not attempt to use
        it after that point.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="name" since="1">
      <description summary="Seat name notification">
        The name of this seat, if any. This event is optional and sent once immediately
        after object creation.

        It is a protocol violation to send this event after the ei_seat.done event.
      </description>
      <arg name="name" type="string" summary="the seat name"/>
    </event>

    <event name="capability" since="1">
      <description summary="Seat capability notification">
        A notification that this seat supports devices with the given interface.
        The interface is mapped to a bitmask by the EIS implementation.
        A client may then binary OR these bitmasks in ei_seat.bind.
        In response, the EIS implementation may then create device based on those
        bound capabilities.

        For example, an EIS implementation may map "ei_pointer" to 0x1,
        "ei_keyboard" to 0x4 and "ei_touchscreen" to 0x8. A client may then
        ei_seat.bind(0xc) to bind to keyboard and touchscreen but not pointer.
        Note that as shown in this example the set of masks may be sparse.
        The value of the mask is contant for the lifetime of the seat but may differ
        between seats.

        Note that seat capabilities only represent a mask of possible capabilities on
        devices in this seat. A capability that is not available on the seat cannot
        ever be available on any device in this seat. For example, a seat that only has the
        pointer and keyboard capabilities can never have a device with the touchscreen
        capability. It is up to the EIS implementation to decide how many (if any) devices
        with any given capability exist in this seat.

        Only interfaces that the client announced during ei_handshake.interface_version
        can be a seat capability.

        This event is sent multiple times - once per supported interface.
        The set of capabilities is constant for the lifetime of the seat.

        It is a protocol violation to send this event after the ei_seat.done event.
      </description>
      <arg name="mask" type="uint64" summary="the mask representing this capability"/>
      <arg name="interface" type="string" summary="the interface name for this capability"/>
    </event>

    <event name="done" since="1">
      <description summary="Seat setup completion notification">
        Notification that the initial burst of events is complete and
        the client can set up this seat now.

        It is a protocol violation to send this event more than once.
      </description>
    </event>

    <event name="device" since="1">
      <description summary="Device presence notification">
        Notification that a new device has been added.

        This event is only sent if the client announced support for the
        "ei_device" interface in ei_handshake.interface_version.
        The interface version is equal or less to the client-supported
        version in ei_handshake.interface_version for the "ei_device"
        interface.
      </description>
      <arg name="device" type="new_id" interface="ei_device" summary="the new device"/>
      <arg name="version" type="uint32" summary="the interface version"/>
    </event>
  </interface>

  <interface name="ei_device" version="2">
    <description summary="device object">
      An ei_device represents a single logical input devices. Like physical input devices
      an ei_device may have multiple capabilities and may e.g. function as pointer
      and keyboard.

      Depending on the ei_handshake.context_type, an ei_device can
      emulate events via client requests or receive events. It is a protocol violation
      to emulate certain events on a receiver device, or for the EIS implementation
      to send certain events to the device. See the individual request/event documentation
      for details.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <!-- ei_device client requests version 1 -->

    <request name="release" since="1">
      <description summary="Device removal request">
        Notification that the client is no longer interested in this device.

        Note that releasing a device does not guarantee another device becomes available.

        The EIS implementation will release any resources related to this device and
        send the ei_device.destroyed event once complete.
      </description>
    </request>

    <request name="start_emulating" since="1" context-type="sender">
      <description summary="Device start emulating request">
        Notify the EIS implementation that the given device is about to start
        sending events. This should be seen more as a transactional boundary than a
        time-based boundary. The primary use-cases for this are to allow for setup on
        the EIS implementation side and/or UI updates to indicate that a device is
        sending events now and for out-of-band information to sync with a given event
        sequence.

        There is no actual requirement that events start immediately once emulation
        starts and there is no requirement that a client calls ei_device.stop_emulating
        after the most recent events.
        For example, in a remote desktop use-case the client would call
        ei_device.start_emulating once the remote desktop session starts (rather than when
        the device sends events) and ei_device.stop_emulating once the remote desktop
        session stops.

        The sequence number identifies this transaction between start/stop emulating.
        It must go up by at least 1 on each call to ei_device.start_emulating.
        Wraparound must be handled by the EIS implementation but callers must ensure
        that detection of wraparound is possible.

        It is a protocol violation to request ei_device.start_emulating after
        ei_device.start_emulating without an intermediate stop_emulating.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="last_serial" type="uint32" summary="the last serial sent by the EIS implementation"/>
      <arg name="sequence" type="uint32" summary="sequence number to identify this emulation sequence"/>
    </request>

    <request name="stop_emulating" since="1" context-type="sender">
      <description summary="Device start emulating request">
        Notify the EIS implementation that the given device is no longer sending
        events. See ei_device.start_emulating for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="last_serial" type="uint32" summary="the last serial sent by the EIS implementation"/>
    </request>

    <request name="frame" since="1" context-type="sender">
      <description summary="Device frame request">
        Generate a frame event to group the current set of events
        into a logical hardware event. This function must be called after one
        or more events on any of ei_pointer, ei_pointer_absolute,
        ei_scroll, ei_button, ei_keyboard or ei_touchscreen has
        been requested by the EIS implementation.

        The EIS implementation should not process changes to the device state
        until the ei_device.frame event. For example, pressing and releasing
        a key within the same frame is a logical noop.

        The given timestamp applies to all events in the current frame.
        The timestamp must be in microseconds of CLOCK_MONOTONIC.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="last_serial" type="uint32" summary="the last serial sent by the EIS implementation"/>
      <arg name="timestamp" type="uint64" summary="timestamp in microseconds"/>
    </request>

    <!-- ei_device events version 1 -->

    <event name="destroyed" type="destructor" since="1">
      <description summary="Device removal notification">
        This device has been removed and a client should release all
        associated resources.

        This ei_device object will be destroyed by the EIS implementation immmediately after
        after this event is sent and as such the client must not attempt to use
        it after that point.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="name" since="1">
      <description summary="device name notification">
        The name of this device, if any. This event is optional and sent once immediately
        after object creation.

        It is a protocol violation to send this event after the ei_device.done event.
      </description>
      <arg name="name" type="string" summary="the device name"/>
    </event>

    <enum name="device_type" since="1">
      <description summary="device type">
        If the device type is ei_device.device_type.virtual, the device is a
        virtual device representing input as applied on the EIS implementation's
        screen. A relative virtual device generates input events in logical pixels,
        an absolute virtual device generates input events in logical pixels on one
        of the device's regions. Virtual devices do not have a ei_device.dimension but
        it may have an ei_device.region.

        If the device type is ei_device.device_type.physical, the device is a
        representation of a physical device as if connected to the EIS
        implementation's host computer. A relative physical device generates input
        events in mm, an absolute physical device generates input events in mm
        within the device's specified physical size. Physical devices do not have
        regions and no ei_device.region events are sent for such devices.
      </description>
      <entry name="virtual" value="1" summary="a virtual device"/>
      <entry name="physical" value="2" summary="representation of a physical device"/>
    </enum>

    <event name="device_type" since="1">
      <description summary="device type notification">
        The device type, one of virtual or physical.

        Devices of type ei_device.device_type.physical are supported only clients of
        type ei_handshake.context_type.receiver.

        This event is sent once immediately after object creation.
        It is a protocol violation to send this event after the ei_device.done event.
      </description>
      <arg name="device_type" type="uint32" enum="device_type" summary="the device type"/>
    </event>

    <event name="dimensions" since="1">
      <description summary="device dimensions notification">
        The device dimensions in mm. This event is optional and sent once immediately
        after object creation.

        This event is only sent for devices of ei_device.device_type.physical.

        It is a protocol violation to send this event after the ei_device.done event.
      </description>
      <arg name="width" type="uint32" summary="the device physical width in mm"/>
      <arg name="height" type="uint32" summary="the device physical height in mm"/>
    </event>

    <event name="region" since="1">
      <description summary="device dimensions notification">
        Notifies the client of one region. The number of regions is constant for a device
        and all regions are announced immediately after object creation.

        A region is rectangular and defined by an x/y offset and a width and a height.
        A region defines the area on an EIS desktop layout that is accessible by
        this device - this region may not be the full area of the desktop.
        Input events may only be sent for points within the regions.

        The use of regions is private to the EIS compositor and coordinates may not
        match the size of the actual desktop. For example, a compositor may set a
        1920x1080 region to represent a 4K monitor and transparently map input
        events into the respective true pixels.

        Absolute devices may have different regions, it is up to the libei client
        to send events through the correct device to target the right pixel. For
        example, a dual-head setup my have two absolute devices, the first with a
        zero offset region spanning the left screen, the second with a nonzero
        offset spanning the right screen.

        The physical scale denotes a constant multiplication factor that needs to be applied to
        any relative movement on this region for that movement to match the same
        *physical* movement on another region.

        It is an EIS implementation bug to advertise the touch and/or absolute pointer capability
        on a device_type.virtual device without advertising an ei_region for this device.

        This event is optional and sent immediately after object creation. Where a device
        has multiple regions, this event is sent once for each region.
        It is a protocol violation to send this event after the ei_device.done event.

        Note: the fourth argument ('hight') was misspelled when the protocol was declared
        stable but changing the name is an API breaking change.
      </description>
      <arg name="offset_x" type="uint32" summary="region x offset in logical pixels"/>
      <arg name="offset_y" type="uint32" summary="region y offset in logical pixels"/>
      <arg name="width" type="uint32" summary="region width in logical pixels"/>
      <!-- note the typo: hight -->
      <arg name="hight" type="uint32" summary="region height in logical pixels"/>
      <arg name="scale" type="float" summary="the physical scale for this region"/>
    </event>

    <event name="interface" since="1">
      <description summary="device capability notification">
        Notification that a new device has a sub-interface.

        This event may be sent for the following interfaces:
        - "ei_pointer"
        - "ei_pointer_absolute"
        - "ei_scroll"
        - "ei_button"
        - "ei_keyboard"
        - "ei_touchscreen"
        The interface version is equal or less to the client-supported
        version in ei_handshake.interface_version for the respective interface.

        It is a protocol violation to send a notification for an interface that
        the client has not bound to with ei_seat.bind.

        This event is optional and sent immediately after object creation
        and at most once per interface.
        It is a protocol violation to send this event after the ei_device.done event.
      </description>
      <arg name="object" type="new_id" interface_arg="interface_name"/>
      <arg name="interface_name" type="string" summary="the interface name"/>
      <arg name="version" type="uint32" summary="the interface version"/>
    </event>

    <event name="done" since="1">
      <description summary="device setup completion notification">
        Notification that the initial burst of events is complete and
        the client can set up this device now.

        It is a protocol violation to send this event more than once per device.
      </description>
    </event>

    <event name="resumed" since="1">
      <description summary="device resumed notification">
        Notification that the device has been resumed by the EIS implementation
        and (depending on the ei_handshake.context_type) the client may request
        ei_device.start_emulating or the EIS implementation may
        ei_device.start_emulating events.

        It is a client bug to request emulation of events on a device that is
        not resumed. The EIS implementation may silently discard such events.

        A newly advertised device is in the ei_device.paused state.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="paused" since="1">
      <description summary="device paused notification">
        Notification that the device has been paused by the EIS implementation
        and no futher events will be accepted on this device until
        it is resumed again.

        For devices of ei_device_setup.context_type sender, the client thus does
        not need to request ei_device.stop_emulating and may request
        ei_device.start_emulating after a subsequent ei_device.resumed.

        For devices of ei_device_setup.context_type receiver and where
        the EIS implementation did not send a ei_device.stop_emulating
        prior to this event, the device may send a ei_device.start_emulating
        event after a subsequent ei_device.resumed event.

        Pausing a device resets the logical state of the device to neutral.
        This includes:
        - any buttons or keys logically down are released
        - any modifiers logically down are released
        - any touches logically down are released

        It is a client bug to request emulation of events on a device that is
        not resumed. The EIS implementation may silently discard such events.

        A newly advertised device is in the ei_device.paused state.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="start_emulating" since="1" context-type="receiver">
      <description summary="Device start emulating event">
        See the ei_device.start_emulating request for details.

        It is a protocol violation to send this event for a client
        of an ei_handshake.context_type other than receiver.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
      <arg name="sequence" type="uint32"/>
    </event>

    <event name="stop_emulating" since="1" context-type="receiver">
      <description summary="Device stop emulating event">
        See the ei_device.stop_emulating request for details.

        It is a protocol violation to send this event for a client
        of an ei_handshake.context_type other than receiver.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="frame" since="1" context-type="receiver">
      <description summary="Device frame event">
        See the ei_device.frame request for details.

        It is a protocol violation to send this event for a client
        of an ei_handshake.context_type other than receiver.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
      <arg name="timestamp" type="uint64" summary="timestamp in microseconds"/>
    </event>

    <!-- ei_device events version 2 -->

    <event name="region_mapping_id" since="2">
      <description summary="region id notification">
        Notifies the client that the region specified in the next ei_device.region
        event is to be assigned the given mapping_id.

        This ID can be used by the client to identify an external resource that has a
        relationship with this region.
        For example the client may receive a data stream with the video
        data that this region represents. By attaching the same identifier to the data
        stream and this region the EIS implementation can inform the client
        that the video data stream and the region represent paired data.

        This event is optional and sent immediately after object creation but before
        the corresponding ei_device.region event. Where a device has multiple regions,
        this event may be sent zero or one time for each region.
        It is a protocol violation to send this event after the ei_device.done event or
        to send this event without a corresponding following ei_device.region event.
      </description>
      <arg name="mapping_id" type="string" summary="region mapping id"/>
    </event>

  </interface>

  <interface name="ei_pointer" version="1">
    <description summary="pointer object">
      Interface for pointer motion requests and events.

      This interface is only provided once per device and where a client
      requests ei_pointer.release the interface does not get re-initialized. An
      EIS implementation may adjust the behavior of the device (including removing
      the device) if the interface is releasd.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <!-- ei_pointer client requests version 1 -->

    <request name="release" since="1">
      <description summary="Pointer removal request">
        Notification that the client is no longer interested in this pointer.
        The EIS implementation will release any resources related to this pointer and
        send the ei_pointer.destroyed event once complete.
      </description>
    </request>

    <request name="motion_relative" since="1" context-type="sender">
      <description summary="Relative motion request">
        Generate a relative motion event on this pointer.

        It is a client bug to send this request more than once
        within the same ei_device.frame and the EIS implementation
        may ignore either or all such requests and/or disconnect the client.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="x" type="float" summary="the x movement in logical pixels"/>
      <arg name="y" type="float" summary="the y movement in logical pixels"/>
    </request>

    <!-- ei_pointer events version 1 -->

    <event name="destroyed" type="destructor" since="1">
      <description summary="Pointer removal notification">
        This object has been removed and a client should release all
        associated resources.

        This object will be destroyed by the EIS implementation immmediately after
        after this event is sent and as such the client must not attempt to use
        it after that point.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="motion_relative" since="1" context-type="receiver">
      <description summary="Relative motion event">
        See the ei_pointer.motion_relative request for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.
      </description>
      <arg name="x" type="float"/>
      <arg name="y" type="float"/>
    </event>
  </interface>

  <interface name="ei_pointer_absolute" version="1">
    <description summary="absolute pointer object">
      Interface for absolute pointer requests and events.

      This interface is only provided once per device and where a client
      requests ei_pointer_absolute.release the interface does not get
      re-initialized. An EIS implementation may adjust the behavior of the
      device (including removing the device) if the interface is releasd.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <!-- ei_pointer_absolute client requests version 1 -->

    <request name="release" since="1">
      <description summary="Pointer absolute removal request">
        Notification that the client is no longer interested in this object.
        The EIS implementation will release any resources related to this object and
        send the ei_pointer_absolute.destroyed event once complete.
      </description>
    </request>

    <request name="motion_absolute" since="1" context-type="sender">
      <description summary="Absolute motion request">
        Generate an absolute motion event on this pointer. The x/y
        coordinates must be within the device's regions or the event
        is silently discarded.

        It is a client bug to send this request more than once
        within the same ei_device.frame and the EIS implementation
        may ignore either or all such requests and/or disconnect the client.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="x" type="float" summary="the x position in logical pixels"/>
      <arg name="y" type="float" summary="the y position in logical pixels"/>
    </request>

    <!-- ei_pointer_absolute events version 1 -->

    <event name="destroyed" type="destructor" since="1">
      <description summary="Pointer absolute removal notification">
        This object has been removed and a client should release all
        associated resources.

        This object will be destroyed by the EIS implementation immmediately after
        after this event is sent and as such the client must not attempt to use
        it after that point.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="motion_absolute" since="1" context-type="receiver">
      <description summary="Absolute motion event">
        See the ei_pointer_absolute.motion_absolute request for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.
      </description>
      <arg name="x" type="float"/>
      <arg name="y" type="float"/>
    </event>
  </interface>

  <interface name="ei_scroll" version="1">
    <description summary="scroll object">
      Interface for scroll requests and events.

      This interface is only provided once per device and where a client
      requests ei_scroll.release the interface does not get
      re-initialized. An EIS implementation may adjust the behavior of the
      device (including removing the device) if the interface is releasd.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <request name="release" since="1">
      <description summary="Scroll removal request">
        Notification that the client is no longer interested in this object.
        The EIS implementation will release any resources related to this object and
        send the ei_scroll.destroyed event once complete.
      </description>
    </request>

    <request name="scroll" since="1" context-type="sender">
      <description summary="Scroll request">
        Generate a a smooth (pixel-precise) scroll event on this pointer.
        Clients must not send ei_scroll.scroll_discrete events for the same event,
        the EIS implementation is responsible for emulation of discrete
        scroll events.

        It is a client bug to send this request more than once
        within the same ei_device.frame and the EIS implementation
        may ignore either or all such requests and/or disconnect the client.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="x" type="float" summary="the x movement in logical pixels"/>
      <arg name="y" type="float" summary="the y movement in logical pixels"/>
    </request>

    <request name="scroll_discrete" since="1" context-type="sender">
      <description summary="Scroll discrete request">
        Generate a a discrete (e.g. wheel) scroll event on this pointer.
        Clients must not send ei_scroll.scroll events for the same event,
        the EIS implementation is responsible for emulation of smooth
        scroll events.

        A discrete scroll event is based logical scroll units (equivalent to one
        mouse wheel click). The value for one scroll unit is 120, a fraction or
        multiple thereof represents a fraction or multiple of a wheel click.

        It is a client bug to send this request more than once
        within the same ei_device.frame and the EIS implementation
        may ignore either or all such requests and/or disconnect the client.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="x" type="int32" summary="the x movement in fractions or multiples of 120"/>
      <arg name="y" type="int32" summary="the y movement in fractions or multiples of 120"/>
    </request>

    <request name="scroll_stop" since="1" context-type="sender">
      <description summary="Scroll stop request">
        Generate a a scroll stop or cancel event on this pointer.

        A scroll stop event notifies the EIS implementation that the interaction causing a
        scroll motion previously triggered with ei_scroll.scroll or
        ei_scroll.scroll_discrete has stopped. For example, if all
        fingers are lifted off a touchpad, two-finger scrolling has logically
        stopped. The EIS implementation may use this information to e.g. start kinetic scrolling
        previously based on the previous finger speed.

        If is_cancel is nonzero, the event represents a cancellation of the
        current interaction. This indicates that the interaction has stopped to the
        point where further (server-emulated) scroll events from this device are wrong.

        It is a client bug to send this request more than once
        within the same ei_device.frame and the EIS implementation
        may ignore either or all such requests and/or disconnect the client.

        It is a client bug to send this request for an axis that
        had a a nonzero value in either ei_scroll.scroll or ei_scroll.scroll_discrete
        in the current frame and the EIS implementation
        may ignore either or all such requests and/or disconnect the client.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="x" type="uint32" summary="nonzero if this axis stopped scrolling"/>
      <arg name="y" type="uint32" summary="nonzero if this axis stopped scrolling"/>
      <arg name="is_cancel" type="uint32" summary="nonzero to indicate this is a cancel event"/>
    </request>

    <!-- ei_scroll events version 1 -->

    <event name="destroyed" type="destructor" since="1">
      <description summary="Scroll removal notification">
        This object has been removed and a client should release all
        associated resources.

        This object will be destroyed by the EIS implementation immmediately after
        after this event is sent and as such the client must not attempt to use
        it after that point.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="scroll" since="1" context-type="receiver">
      <description summary="Scroll event">
        See the ei_scroll.scroll request for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.
      </description>
      <arg name="x" type="float"/>
      <arg name="y" type="float"/>
    </event>

    <event name="scroll_discrete" since="1" context-type="receiver">
      <description summary="Discrete scroll event">
        See the ei_scroll.scroll_discrete request for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.
      </description>
      <arg name="x" type="int32"/>
      <arg name="y" type="int32"/>
    </event>

    <event name="scroll_stop" since="1" context-type="receiver">
      <description summary="Scroll stop event">

        See the ei_scroll.scroll_stop request for details.
        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.
      </description>
      <arg name="x" type="uint32"/>
      <arg name="y" type="uint32"/>
      <arg name="is_cancel" type="uint32"/>
    </event>
  </interface>

  <interface name="ei_button" version="1">
    <description summary="button object">
      Interface for button requests and events.

      This interface is only provided once per device and where a client
      requests ei_button.release the interface does not get
      re-initialized. An EIS implementation may adjust the behavior of the
      device (including removing the device) if the interface is releasd.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <request name="release" since="1">
      <description summary="Button removal request">
        Notification that the client is no longer interested in this object.
        The EIS implementation will release any resources related to this object and
        send the ei_button.destroyed event once complete.
      </description>
    </request>

    <enum name="button_state" since="1">
      <description summary="Button state">
        The logical state of a button.
      </description>
      <entry name="released" value="0" summary="the button is logically up"/>
      <entry name="press" value="1" summary="the button is logically down"/>
    </enum>

    <request name="button" since="1" context-type="sender">
      <description summary="Button state change request">
        Generate a button event on this pointer.

        The button codes must match the defines in linux/input-event-codes.h.

        It is a client bug to send more than one button request for the same button
        within the same ei_device.frame and the EIS implementation
        may ignore either or all button state changes and/or disconnect the client.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="button" type="uint32" summary="button code"/>
      <arg name="state" type="uint32" enum="button_state"/>
    </request>

    <!-- ei_button events version 1 -->

    <event name="destroyed" type="destructor" since="1">
      <description summary="Pointer removal notification">
        This pointer has been removed and a client should release all
        associated resources.

        This ei_scroll object will be destroyed by the EIS implementation immmediately after
        after this event is sent and as such the client must not attempt to use
        it after that point.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="button" since="1" context-type="receiver">
      <description summary="Button state change event">
        See the ei_scroll.button request for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.

        It is an EIS implementation bug to send more than one button request
        for the same button within the same ei_device.frame.
      </description>
      <arg name="button" type="uint32"/>
      <arg name="state" type="uint32" enum="button_state"/>
    </event>

  </interface>

  <interface name="ei_keyboard" version="1">
    <description summary="keyboard object">
      Interface for keyboard requests and events.

      This interface is only provided once per device and where a client
      requests ei_keyboard.release the interface does not get re-initialized. An
      EIS implementation may adjust the behavior of the device (including removing
      the device) if the interface is releasd.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <!-- ei_keyboard client requests version 1 -->

    <request name="release" since="1">
      <description summary="keyboard removal request">
        Notification that the client is no longer interested in this keyboard.
        The EIS implementation will release any resources related to this keyboard and
        send the ei_keyboard.destroyed event once complete.
      </description>
    </request>

    <enum name="key_state" since="1">
      <description summary="Key state">
        The logical state of a key.
      </description>
      <entry name="released" value="0" summary="the key is logically up"/>
      <entry name="press" value="1" summary="the key is logically down"/>
    </enum>

    <request name="key" since="1" context-type="sender">
      <description summary="Key state change request">
        Generate a key event on this keyboard. If the device has an
        ei_keyboard.keymap, the key code corresponds to that keymap.

        The key codes must match the defines in linux/input-event-codes.h.

        It is a client bug to send more than one key request for the same key
        within the same ei_device.frame and the EIS implementation
        may ignore either or all key state changes and/or disconnect the client.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than sender.
      </description>
      <arg name="key" type="uint32" summary="the key code"/>
      <arg name="state" type="uint32" enum="key_state" summary="logical state of the key"/>
    </request>

    <!-- ei_keyboard events version 1 -->

    <event name="destroyed" type="destructor" since="1">
      <description summary="Keyboard removal notification">
        This keyboard has been removed and a client should release all
        associated resources.

        This ei_keyboard object will be destroyed by the EIS implementation immmediately after
        after this event is sent and as such the client must not attempt to use
        it after that point.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <enum name="keymap_type" since="1">
      <description summary="the keymap type">
        The keymap type describes how the keymap in the ei_keyboard.keymap event
        should be parsed.
      </description>
      <entry name="xkb" value="1" summary="a libxkbcommon-compatible XKB keymap"/>
    </enum>

    <event name="keymap" since="1">
      <description summary="keymap notification">
        Notification that this device has a keymap. Future key events must be
        interpreted by the client according to this keymap. For clients
        of ei_handshake.context_type sender it is the client's
        responsibility to send the correct ei_keyboard.key keycodes to
        generate the expected keysym in the EIS implementation.

        The keymap is constant for the lifetime of the device.

        This event provides a file descriptor to the client which can be
        memory-mapped in read-only mode to provide a keyboard mapping
        description. The fd must be mapped with MAP_PRIVATE by
        the recipient, as MAP_SHARED may fail.

        This event is optional and only sent immediately after the ei_keyboard object is created
        and before the ei_device.done event. It is a protocol violation to send this
        event after the ei_device.done event.
      </description>
      <arg name="keymap_type" type="uint32" enum="keymap_type" summary="the keymap type"/>
      <arg name="size" type="uint32" summary="the keymap size in bytes"/>
      <arg name="keymap" type="fd" summary="file descriptor to the keymap"/>
    </event>

    <event name="key" since="1" context-type="receiver">
      <description summary="Key state change event">
        See the ei_keyboard.key request for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.

        It is a protocol violation to send a key down event in the same
        frame as a key up event for the same key in the same frame.
      </description>
      <arg name="key" type="uint32"/>
      <arg name="state" type="uint32" enum="key_state"/>
    </event>

    <event name="modifiers" since="1">
      <description summary="Modifier change event">
        Notification that the EIS implementation has changed group or modifier
        states on this device, but not necessarily in response to an
        ei_keyboard.key event. Future ei_keyboard.key requests must take the
        new group or modifier state into account.

        This event should not be sent in response to ei_keyboard.key events
        that change the group or modifier state according to the keymap. The
        client is expected to track such group or modifier states on its own.

        A client must assume that all modifiers are lifted when it
        receives an ei_device.paused event. The EIS implementation
        must send this event after ei_device.resumed to notify the client
        of any nonzero modifier state.

        This event does not reqire an ei_device.frame and should
        be processed immediately by the client.

        This event is only sent for devices with an ei_keyboard.keymap.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
      <arg name="depressed" type="uint32" summary="depressed modifiers"/>
      <arg name="locked" type="uint32" summary="locked modifiers"/>
      <arg name="latched" type="uint32" summary="latched modifiers"/>
      <arg name="group" type="uint32" summary="the keyboard group (layout)"/>
    </event>
  </interface>

  <interface name="ei_touchscreen" version="1">
    <description summary="touchscreen object">
      Interface for touchscreen requests and events.

      This interface is only provided once per device and where a client
      requests ei_touchscreen.release the interface does not get re-initialized. An
      EIS implementation may adjust the behavior of the device (including removing
      the device) if the interface is releasd.

      Note that for a client to receive objects of this type, it must announce
      support for this interface in ei_handshake.interface_version.
    </description>

    <!-- ei_touchscreen client requests version 1 -->

    <request name="release" since="1">
      <description summary="touch removal request">
        Notification that the client is no longer interested in this touch.
        The EIS implementation will release any resources related to this touch and
        send the ei_touch.destroyed event once complete.
      </description>
    </request>

    <request name="down" since="1" context-type="sender">
      <description summary="touch down request">
        Notifies the EIS implementation about a new touch logically down at the
        given coordinates. The touchid is a unique id for this touch. Touchids
        may be re-used after ei_touchscreen.up.

        The x/y coordinates must be within the device's regions or the event and future
        ei_touchscreen.motion events with the same touchid are silently discarded.

        It is a protocol violation to send a touch down in the same
        frame as a touch motion or touch up.
      </description>
      <arg name="touchid" type="uint32" summary="a unique touch id to identify this touch"/>
      <arg name="x" type="float" summary="touch x coordinate in logical pixels"/>
      <arg name="y" type="float" summary="touch y coordinate in logical pixels"/>
    </request>

    <request name="motion" since="1" context-type="sender">
      <description summary="touch motion request">
        Notifies the EIS implementation about an existing touch changing position to
        the given coordinates. The touchid is the unique id for this touch previously
        sent with ei_touchscreen.down.

        The x/y coordinates must be within the device's regions or the event is
        silently discarded.

        It is a protocol violation to send a touch motion in the same
        frame as a touch down or touch up.
      </description>
      <arg name="touchid" type="uint32" summary="a unique touch id to identify this touch"/>
      <arg name="x" type="float" summary="touch x coordinate in logical pixels"/>
      <arg name="y" type="float" summary="touch y coordinate in logical pixels"/>
    </request>

    <request name="up" since="1" context-type="sender">
      <description summary="touch up request">
        Notifies the EIS implementation about an existing touch being logically
        up. The touchid is the unique id for this touch previously
        sent with ei_touchscreen.down.

        The touchid may be re-used after this request.

        It is a protocol violation to send a touch up in the same
        frame as a touch motion or touch down.
      </description>
      <arg name="touchid" type="uint32" summary="a unique touch id to identify this touch"/>
    </request>

    <!-- ei_touchscreen events version 1 -->

    <event name="destroyed" type="destructor" since="1">
      <description summary="Touchscreen removal notification">
        This touch has been removed and a client should release all
        associated resources.

        This ei_touchscreen object will be destroyed by the EIS implementation immmediately after
        after this event is sent and as such the client must not attempt to use
        it after that point.
      </description>
      <arg name="serial" type="uint32" summary="this event's serial number"/>
    </event>

    <event name="down" since="1" context-type="receiver">
      <description summary="touch down request">
        See the ei_touchscreen.down request for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.

        It is a protocol violation to send a touch down in the same
        frame as a touch motion or touch up.
      </description>
      <arg name="touchid" type="uint32"/>
      <arg name="x" type="float"/>
      <arg name="y" type="float"/>
    </event>

    <event name="motion" since="1" context-type="receiver">
      <description summary="touch motion request">
        See the ei_touchscreen.motion request for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.

        It is a protocol violation to send a touch motion in the same
        frame as a touch down or touch up.
      </description>
      <arg name="touchid" type="uint32"/>
      <arg name="x" type="float"/>
      <arg name="y" type="float"/>
    </event>

    <event name="up" since="1" context-type="receiver">
      <description summary="touch motion request">
        See the ei_touchscreen.up request for details.

        It is a protocol violation to send this request for a client
        of an ei_handshake.context_type other than receiver.

        It is a protocol violation to send a touch up in the same
        frame as a touch motion or touch down.
      </description>
      <arg name="touchid" type="uint32"/>
    </event>
  </interface>
</protocol>
==============================================================================

==================================== 6/9 =====================================
test:         libei:nosigalrm / eierpecken-no-sigalrm
start time:   16:28:25
duration:     0.24s
result:       exit status 0
command:      UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MALLOC_PERTURB_=37 LD_LIBRARY_PATH=/var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/src:/var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/subprojects/munit MESON_TEST_ITERATION=1 /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/test/eierpecken --log-visible debug
----------------------------------- stdout -----------------------------------
Running test suite with seed 0x5e9e869d...
test_passive_ei_flush_frame          [ OK    ] [ 0.00091353 / 0.00090889 CPU ]
test_passive_ei_frame_timestamp      [ OK    ] [ 0.00091322 / 0.00090661 CPU ]
test_passive_ei_device_multitouch    [ OK    ] [ 0.00106054 / 0.00105531 CPU ]
test_passive_ei_device_touch         [ OK    ] [ 0.00188843 / 0.00188299 CPU ]
test_passive_ei_device_scroll_stop_cancel[ OK    ] [ 0.00115656 / 0.00115085 CPU ]
test_passive_ei_device_scroll_cancel [ OK    ] [ 0.00107590 / 0.00107205 CPU ]
test_passive_ei_device_scroll_stop   [ OK    ] [ 0.00108835 / 0.00108373 CPU ]
test_passive_ei_device_scroll_delta  [ OK    ] [ 0.00116171 / 0.00115595 CPU ]
test_passive_ei_device_pointer_abs   [ OK    ] [ 0.00133706 / 0.00133089 CPU ]
test_passive_ei_device_pointer_rel   [ OK    ] [ 0.00120576 / 0.00119537 CPU ]
test_passive_ei_device_keyboard_key  [ OK    ] [ 0.00100992 / 0.00100391 CPU ]
test_passive_ei_device_button_button [ OK    ] [ 0.00104681 / 0.00104289 CPU ]
test_passive_ei_device_stop_emulating_when_removing[ OK    ] [ 0.00103717 / 0.00103089 CPU ]
test_passive_ei_device_start_stop_emulating[ OK    ] [ 0.00095011 / 0.00094461 CPU ]
test_ei_device_remove_no_stop_emulating_event[ OK    ] [ 0.00094620 / 0.00093539 CPU ]
test_ei_flush_frame                  [ OK    ] [ 0.00082593 / 0.00082605 CPU ]
test_ei_buffered_frame               [ OK    ] [ 0.00111855 / 0.00111356 CPU ]
test_ei_no_empty_frames              [ OK    ] [ 0.00098511 / 0.00097496 CPU ]
test_ei_frame_timestamp              [ OK    ] [ 0.00087425 / 0.00087420 CPU ]
test_ei_keyboard_modifiers           [ OK    ] [ 0.00093769 / 0.00093231 CPU ]
test_ei_keymap_set                   [ OK    ] [ 0.00099685 / 0.00099153 CPU ]
test_ei_keymap_invalid               [ OK    ] [ 0.00064809 / 0.00064314 CPU ]
test_ei_device_multitouch            [ OK    ] [ 0.00100432 / 0.00100008 CPU ]
test_ei_device_touch                 [ OK    ] [ 0.00182653 / 0.00179969 CPU ]
test_ei_device_scroll_stop_cancel    [ OK    ] [ 0.00098802 / 0.00098395 CPU ]
test_ei_device_scroll_cancel         [ OK    ] [ 0.00128292 / 0.00127863 CPU ]
test_ei_device_scroll_stop           [ OK    ] [ 0.00104343 / 0.00103775 CPU ]
test_ei_device_scroll                [ OK    ] [ 0.00090918 / 0.00090333 CPU ]
test_ei_device_pointer_abs           [ OK    ] [ 0.00153339 / 0.00151427 CPU ]
test_ei_device_regions_late_add      [ OK    ] [ 0.00076536 / 0.00076204 CPU ]
test_ei_device_regions_ref_unref     [ OK    ] [ 0.00092310 / 0.00091953 CPU ]
test_ei_device_regions_touch         [ OK    ] [ 0.00103374 / 0.00102987 CPU ]
test_ei_device_regions_absmotion     [ OK    ] [ 0.00111261 / 0.00109711 CPU ]
test_ei_device_regions               [ OK    ] [ 0.00099020 / 0.00097170 CPU ]
test_ei_device_pointer_rel           [ OK    ] [ 0.00106184 / 0.00105729 CPU ]
test_ei_device_keyboard_key          [ OK    ] [ 0.00086130 / 0.00085442 CPU ]
test_ei_device_button_button         [ OK    ] [ 0.00116065 / 0.00114693 CPU ]
test_ei_device_close                 [ OK    ] [ 0.00128078 / 0.00127628 CPU ]
test_ei_device_add_remove            [ OK    ] [ 0.00081317 / 0.00081029 CPU ]
test_ei_device_never_added           [ OK    ] [ 0.00071738 / 0.00071716 CPU ]
test_ei_device_set_name_multiple_devices[ OK    ] [ 0.00094871 / 0.00092311 CPU ]
test_passive_ei_device_type          [ OK    ] [ 0.00084070 / 0.00083489 CPU ]
test_ei_device_basics                [ OK    ] [ 0.00088866 / 0.00088316 CPU ]
test_ei_seat_bind_unbind_immediately [ OK    ] [ 0.00113120 / 0.00112492 CPU ]
test_ei_seat_bind_unbind_noref       [ OK    ] [ 0.00102205 / 0.00101680 CPU ]
test_ei_seat_bind_unbind             [ OK    ] [ 0.00100386 / 0.00099900 CPU ]
test_ei_invalid_object_ids           [ OK    ] [ 0.00206120 / 0.00205291 CPU ]
test_ei_exceed_write_buffer_cleanup  [ OK    ] [ 0.03930827 / 0.03912088 CPU ]
test_ei_exceed_write_buffer          [ OK    ] [ 0.09638763 / 0.09608411 CPU ]
test_xdotool_rel_motion              [ OK    ] [ 0.00089247 / 0.00088582 CPU ]
test_client_is_receiver              [ OK    ] [ 0.00051708 / 0.00051228 CPU ]
test_client_is_sender                [ OK    ] [ 0.00053234 / 0.00052763 CPU ]
test_ei_disconnect_after_unbind_after_received[ OK    ] [ 0.00072329 / 0.00071967 CPU ]
test_ei_disconnect_after_unbind_before_received[ OK    ] [ 0.00075555 / 0.00075011 CPU ]
test_ei_disconnect_self_after_bind_after_received[ OK    ] [ 0.00064916 / 0.00064501 CPU ]
test_ei_disconnect_after_bind_after_received[ OK    ] [ 0.00074205 / 0.00073692 CPU ]
test_ei_disconnect_self_after_bind_before_received[ OK    ] [ 0.00064177 / 0.00063714 CPU ]
test_ei_disconnect_after_bind_before_received[ OK    ] [ 0.00079359 / 0.00077869 CPU ]
test_ei_disconnect_self_after_seat   [ OK    ] [ 0.00067811 / 0.00067827 CPU ]
test_ei_disconnect_after_seat        [ OK    ] [ 0.00068841 / 0.00068827 CPU ]
test_ei_disconnect_self_after_connect[ OK    ] [ 0.00066209 / 0.00066222 CPU ]
test_ei_disconnect_after_connect     [ OK    ] [ 0.00048599 / 0.00048574 CPU ]
test_ei_disconnect_self_immediately  [ OK    ] [ 0.00056129 / 0.00056096 CPU ]
test_ei_disconnect_immediately       [ OK    ] [ 0.00050544 / 0.00050523 CPU ]
test_ei_ref_unref                    [ OK    ] [ 0.00004132 / 0.00004101 CPU ]
eistest_regions                      [ OK    ] [ 0.00107915 / 0.00106602 CPU ]
eistest_device_ignore_paused_device  [ OK    ] [ 0.00157652 / 0.00157271 CPU ]
eistest_device_resume_pause_twice    [ OK    ] [ 0.00097631 / 0.00097041 CPU ]
eistest_cliend_bind_some_caps        [ OK    ] [ 0.00079598 / 0.00079007 CPU ]
eistest_cliend_bind_all_caps         [ OK    ] [ 0.00066863 / 0.00066358 CPU ]
eistest_name                         [ OK    ] [ 0.00057783 / 0.00057093 CPU ]
eistest_ref_unref                    [ OK    ] [ 0.00003643 / 0.00003625 CPU ]
72 of 72 (100%) tests successful, 0 (0%) test skipped.
==============================================================================

==================================== 7/9 =====================================
test:         libei:sigalrm / eierpecken
start time:   16:28:25
duration:     0.25s
result:       exit status 0
command:      UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MALLOC_PERTURB_=75 LD_LIBRARY_PATH=/var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/src:/var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/subprojects/munit MESON_TEST_ITERATION=1 /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/test/eierpecken --log-visible debug --enable-sigalarm
----------------------------------- stdout -----------------------------------
Running test suite with seed 0x112ed375...
test_passive_ei_flush_frame          [ OK    ] [ 0.00107277 / 0.00104660 CPU ]
test_passive_ei_frame_timestamp      [ OK    ] [ 0.00111854 / 0.00109014 CPU ]
test_passive_ei_device_multitouch    [ OK    ] [ 0.00127651 / 0.00124662 CPU ]
test_passive_ei_device_touch         [ OK    ] [ 0.00184531 / 0.00180322 CPU ]
test_passive_ei_device_scroll_stop_cancel[ OK    ] [ 0.00111933 / 0.00109166 CPU ]
test_passive_ei_device_scroll_cancel [ OK    ] [ 0.00123932 / 0.00121185 CPU ]
test_passive_ei_device_scroll_stop   [ OK    ] [ 0.00123859 / 0.00121321 CPU ]
test_passive_ei_device_scroll_delta  [ OK    ] [ 0.00106086 / 0.00103855 CPU ]
test_passive_ei_device_pointer_abs   [ OK    ] [ 0.00161419 / 0.00157879 CPU ]
test_passive_ei_device_pointer_rel   [ OK    ] [ 0.00120538 / 0.00117836 CPU ]
test_passive_ei_device_keyboard_key  [ OK    ] [ 0.00123660 / 0.00120470 CPU ]
test_passive_ei_device_button_button [ OK    ] [ 0.00107049 / 0.00104769 CPU ]
test_passive_ei_device_stop_emulating_when_removing[ OK    ] [ 0.00089747 / 0.00087792 CPU ]
test_passive_ei_device_start_stop_emulating[ OK    ] [ 0.00088733 / 0.00086869 CPU ]
test_ei_device_remove_no_stop_emulating_event[ OK    ] [ 0.00096981 / 0.00094964 CPU ]
test_ei_flush_frame                  [ OK    ] [ 0.00101745 / 0.00099579 CPU ]
test_ei_buffered_frame               [ OK    ] [ 0.00139825 / 0.00135928 CPU ]
test_ei_no_empty_frames              [ OK    ] [ 0.00100348 / 0.00097997 CPU ]
test_ei_frame_timestamp              [ OK    ] [ 0.00097514 / 0.00095362 CPU ]
test_ei_keyboard_modifiers           [ OK    ] [ 0.00088589 / 0.00086531 CPU ]
test_ei_keymap_set                   [ OK    ] [ 0.00099664 / 0.00097423 CPU ]
test_ei_keymap_invalid               [ OK    ] [ 0.00082788 / 0.00080576 CPU ]
test_ei_device_multitouch            [ OK    ] [ 0.00108821 / 0.00106632 CPU ]
test_ei_device_touch                 [ OK    ] [ 0.00194508 / 0.00189686 CPU ]
test_ei_device_scroll_stop_cancel    [ OK    ] [ 0.00106314 / 0.00103953 CPU ]
test_ei_device_scroll_cancel         [ OK    ] [ 0.00112027 / 0.00109280 CPU ]
test_ei_device_scroll_stop           [ OK    ] [ 0.00112957 / 0.00110585 CPU ]
test_ei_device_scroll                [ OK    ] [ 0.00097615 / 0.00095692 CPU ]
test_ei_device_pointer_abs           [ OK    ] [ 0.00144090 / 0.00140817 CPU ]
test_ei_device_regions_late_add      [ OK    ] [ 0.00079623 / 0.00077989 CPU ]
test_ei_device_regions_ref_unref     [ OK    ] [ 0.00099285 / 0.00097076 CPU ]
test_ei_device_regions_touch         [ OK    ] [ 0.00125869 / 0.00123169 CPU ]
test_ei_device_regions_absmotion     [ OK    ] [ 0.00109220 / 0.00106712 CPU ]
test_ei_device_regions               [ OK    ] [ 0.00083436 / 0.00081770 CPU ]
test_ei_device_pointer_rel           [ OK    ] [ 0.00109943 / 0.00107696 CPU ]
test_ei_device_keyboard_key          [ OK    ] [ 0.00092517 / 0.00090614 CPU ]
test_ei_device_button_button         [ OK    ] [ 0.00119569 / 0.00116899 CPU ]
test_ei_device_close                 [ OK    ] [ 0.00141293 / 0.00137727 CPU ]
test_ei_device_add_remove            [ OK    ] [ 0.00086417 / 0.00084587 CPU ]
test_ei_device_never_added           [ OK    ] [ 0.00074190 / 0.00072668 CPU ]
test_ei_device_set_name_multiple_devices[ OK    ] [ 0.00103881 / 0.00101883 CPU ]
test_passive_ei_device_type          [ OK    ] [ 0.00098448 / 0.00096223 CPU ]
test_ei_device_basics                [ OK    ] [ 0.00081476 / 0.00079060 CPU ]
test_ei_seat_bind_unbind_immediately [ OK    ] [ 0.00111112 / 0.00108789 CPU ]
test_ei_seat_bind_unbind_noref       [ OK    ] [ 0.00130441 / 0.00127420 CPU ]
test_ei_seat_bind_unbind             [ OK    ] [ 0.00136552 / 0.00132733 CPU ]
test_ei_invalid_object_ids           [ OK    ] [ 0.00213363 / 0.00208720 CPU ]
test_ei_exceed_write_buffer_cleanup  [ OK    ] [ 0.04221167 / 0.04127094 CPU ]
test_ei_exceed_write_buffer          [ OK    ] [ 0.10257390 / 0.10024336 CPU ]
test_xdotool_rel_motion              [ OK    ] [ 0.00094246 / 0.00092230 CPU ]
test_client_is_receiver              [ OK    ] [ 0.00057945 / 0.00056602 CPU ]
test_client_is_sender                [ OK    ] [ 0.00054846 / 0.00053558 CPU ]
test_ei_disconnect_after_unbind_after_received[ OK    ] [ 0.00090651 / 0.00087827 CPU ]
test_ei_disconnect_after_unbind_before_received[ OK    ] [ 0.00078368 / 0.00076728 CPU ]
test_ei_disconnect_self_after_bind_after_received[ OK    ] [ 0.00068081 / 0.00067007 CPU ]
test_ei_disconnect_after_bind_after_received[ OK    ] [ 0.00084052 / 0.00082035 CPU ]
test_ei_disconnect_self_after_bind_before_received[ OK    ] [ 0.00070346 / 0.00068666 CPU ]
test_ei_disconnect_after_bind_before_received[ OK    ] [ 0.00068021 / 0.00066525 CPU ]
test_ei_disconnect_self_after_seat   [ OK    ] [ 0.00086132 / 0.00083901 CPU ]
test_ei_disconnect_after_seat        [ OK    ] [ 0.00072249 / 0.00070641 CPU ]
test_ei_disconnect_self_after_connect[ OK    ] [ 0.00060245 / 0.00058878 CPU ]
test_ei_disconnect_after_connect     [ OK    ] [ 0.00049570 / 0.00047565 CPU ]
test_ei_disconnect_self_immediately  [ OK    ] [ 0.00073300 / 0.00071432 CPU ]
test_ei_disconnect_immediately       [ OK    ] [ 0.00054861 / 0.00053613 CPU ]
test_ei_ref_unref                    [ OK    ] [ 0.00004031 / 0.00004022 CPU ]
eistest_regions                      [ OK    ] [ 0.00095191 / 0.00093177 CPU ]
eistest_device_ignore_paused_device  [ OK    ] [ 0.00174782 / 0.00171124 CPU ]
eistest_device_resume_pause_twice    [ OK    ] [ 0.00099138 / 0.00097132 CPU ]
eistest_cliend_bind_some_caps        [ OK    ] [ 0.00075224 / 0.00073466 CPU ]
eistest_cliend_bind_all_caps         [ OK    ] [ 0.00071967 / 0.00070467 CPU ]
eistest_name                         [ OK    ] [ 0.00051195 / 0.00050052 CPU ]
eistest_ref_unref                    [ OK    ] [ 0.00004280 / 0.00004243 CPU ]
72 of 72 (100%) tests successful, 0 (0%) test skipped.
==============================================================================

==================================== 8/9 =====================================
test:         libei:python / scanner-pytest
start time:   16:28:25
duration:     0.63s
result:       exit status 1
command:      MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MESON_TEST_ITERATION=1 MALLOC_PERTURB_=181 UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 /usr/bin/pytest --verbose --log-level=DEBUG -k TestScanner
----------------------------------- stdout -----------------------------------
============================= test session starts ==============================
platform linux -- Python 3.12.5, pytest-8.3.2, pluggy-1.5.0 -- /usr/bin/python3.12
cachedir: .pytest_cache
rootdir: /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/test
collecting ... collected 37 items / 29 deselected / 8 selected

test_scanner.py::TestScanner::test_ei_names[eis] PASSED                  [ 12%]
test_scanner.py::TestScanner::test_ei_names[ei] PASSED                   [ 25%]
test_scanner.py::TestScanner::test_ei_names[brei] PASSED                 [ 37%]
test_scanner.py::TestScanner::test_interface_arg[ei] FAILED              [ 50%]
test_scanner.py::TestScanner::test_versione_arg[ei] PASSED               [ 62%]
test_scanner.py::TestScanner::test_cli_extra_data[yamlfile] PASSED       [ 75%]
test_scanner.py::TestScanner::test_cli_extra_data[jsonfile] PASSED       [ 87%]
test_scanner.py::TestScanner::test_cli_extra_data[string] PASSED         [100%]

=================================== FAILURES ===================================
______________________ TestScanner.test_interface_arg[ei] ______________________

self = <test_scanner.TestScanner object at 0x7ee70be56cc0>
protocol = Protocol(copyright='\nCopyright © 2008-2011 Kristian Høgsberg\nCopyright © 2010-2011 Intel Corporation\nCopyright © 20...to receive objects of this type, it must announce\nsupport for this interface in ei_handshake.interface_version.\n'))])

    @pytest.mark.parametrize("component", ("ei",))
    def test_interface_arg(self, protocol: Protocol):
        intf = next((i for i in protocol.interfaces if i.name == "ei_device"))
        event = next((e for e in intf.events if e.name == "interface"))
    
        obj, interface_name, version = event.arguments
>       assert obj.interface_arg == interface_name

test_scanner.py:54: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
<attrs generated eq eiscanner.Argument>:11: in __eq__
    self.interface_arg_for == other.interface_arg_for and
<attrs generated eq eiscanner.Argument>:10: in __eq__
    self.interface_arg == other.interface_arg and
<attrs generated eq eiscanner.Argument>:11: in __eq__
    self.interface_arg_for == other.interface_arg_for and
E   RecursionError: maximum recursion depth exceeded
!!! Recursion detected (same locals & position)
---------------------------- Captured stdout setup -----------------------------
protocol for component ei
=========================== short test summary info ============================
FAILED test_scanner.py::TestScanner::test_interface_arg[ei] - RecursionError:...
================== 1 failed, 7 passed, 29 deselected in 0.38s ==================
==============================================================================

==================================== 9/9 =====================================
test:         libei:python / oeffis-pytest
start time:   16:28:25
duration:     4.95s
result:       exit status 0
command:      UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 MALLOC_PERTURB_=207 MESON_TEST_ITERATION=1 LD_LIBRARY_PATH=/var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0-build/src /usr/bin/pytest --verbose --log-level=DEBUG
----------------------------------- stdout -----------------------------------
============================= test session starts ==============================
platform linux -- Python 3.12.5, pytest-8.3.2, pluggy-1.5.0 -- /usr/bin/python3.12
cachedir: .pytest_cache
rootdir: /var/tmp/portage/dev-libs/libei-1.3.0/work/libei-1.3.0/test
collecting ... collected 7 items / 2 skipped

test_oeffis.py::test_ref_unref PASSED                                    [ 14%]
test_oeffis.py::test_set_user_data PASSED                                [ 28%]
test_oeffis.py::test_ctx PASSED                                          [ 42%]
test_oeffis.py::test_error_out PASSED                                    [ 57%]
test_oeffis.py::TestOeffis::test_create_session PASSED                   [ 71%]
test_oeffis.py::TestOeffis::test_create_session_all_devices PASSED       [ 85%]
test_oeffis.py::test_version_compare PASSED                              [100%]

========================= 7 passed, 2 skipped in 4.71s =========================
==============================================================================


Summary of Failures:

8/9 libei:python / scanner-pytest           FAIL            0.63s   exit status 1

Ok:                 8   
Expected Fail:      0   
Fail:               1   
Unexpected Pass:    0   
Skipped:            0   
Timeout:            0