Initial Connection Handshake
The initial connection is a two-step process:
An ei_handshake object with the special ID 0 is guaranteed to
exists. The client must send the appropriate requests to set up
its connection, followed by the ei_handshake.finish
request. The EIS
implementation replies by creating the ei_connection object with the
client-requested version (or any lower version) that is the connection for the
remainder of this client (see version negotiation.
Immediately after connecting, the EIS implementation must send the
ei_handshake.handshake_version
event. The client replies with the
ei_handshake.handshake_version
request to negotiate the version
of the ei_handshake
object.
Version negotiation for other interfaces is also handled in the ei_handshake
object. The client announces which interfaces it supports and their
respective version, the EIS implementation should subsequently notify
the client about the interface version it supports.
Any object created by either the client or the EIS implementation must use the lower of client and EIS implementation supported version.
The last message sent on the ei_handshake
object is the ei_handshake.connection
event.
This event carries the object ID and version for the newly created ei_connection
object.
This object remains for the lifetime of the client is only destroyed when the client disconnects.
A full example sequence from socket connection to the first event sent by the client is below:
sequenceDiagram participant client participant EIS client->>EIS: connect to socket Note over client, EIS: ei_handshake object 0 EIS-->>client: ei_handshake.handshake_version(N) client->>EIS: ei_handshake.handshake_version(M) client->>EIS: ei_handshake.context_type(sender) client->>EIS: ei_handshake.name(some client) client->>EIS: ei_handshake.interface_version(ei_connection) client->>EIS: ei_handshake.interface_version(ei_callback) client->>EIS: ei_handshake.interface_version(ei_seat) client->>EIS: ei_handshake.interface_version(ei_device) client->>EIS: ei_handshake.interface_version(ei_pointer) client->>EIS: ei_handshake.interface_version(ei_keyboard) client->>EIS: ei_handshake.finish() EIS-->>client: ei_handshake.interface_version(ei_callback) EIS-->>client: ei_handshake.connection(new_id, version) Note over client, EIS: ei_handshake object is destroyed EIS-->>client: ei_connection.seat(new_id, version) EIS-->>client: ei_seat.name(some seat) EIS-->>client: ei_seat.capabilities() EIS-->>client: ei_seat.done() client->>EIS: ei_seat.bind() EIS-->>client: ei_seat.device(new_id, version) EIS-->>client: ei_device.name(some name) EIS-->>client: ei_device.device_type() EIS-->>client: ei_device.capabilities(some name) EIS-->>client: ei_device.interface(new_id, "ei_pointer", version) EIS-->>client: ei_device.interface(new_id, "ei_keyboard", version) EIS-->>client: ei_seat.device(new_id, version) EIS-->>client: ei_device.name(some name) EIS-->>client: ei_device.device_type() EIS-->>client: ei_device.capabilities(some name) EIS-->>client: ei_device.region() EIS-->>client: ei_device.interface(new_id, "ei_touchscreen", version) EIS-->>client: ei_device.resume() EIS-->>client: ei_device.resume() Note over client, EIS: client may emulate now client->>EIS: ei_pointer.start_emulating() client->>EIS: ei_pointer.motion() client->>EIS: ei_pointer.frame()