| Barrier client protocol | |
| ======================= | |
| QEMU's ``input-barrier`` device implements the client end of | |
| the KVM (Keyboard-Video-Mouse) software | |
| `Barrier <https://github.com/debauchee/barrier>`__. | |
| This document briefly describes the protocol as we implement it. | |
| Message format | |
| -------------- | |
| Message format between the server and client is in two parts: | |
| #. the payload length, a 32bit integer in network endianness | |
| #. the payload | |
| The payload starts with a 4byte string (without NUL) which is the | |
| command. The first command between the server and the client | |
| is the only command not encoded on 4 bytes ("Barrier"). | |
| The remaining part of the payload is decoded according to the command. | |
| Protocol Description | |
| -------------------- | |
| This comes from ``barrier/src/lib/barrier/protocol_types.h``. | |
| barrierCmdHello "Barrier" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t minor, int16_t major }`` | |
| Description: | |
| Say hello to client | |
| ``minor`` = protocol major version number supported by server | |
| ``major`` = protocol minor version number supported by server | |
| barrierCmdHelloBack "Barrier" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| client ->server | |
| Parameters: | |
| ``{ int16_t minor, int16_t major, char *name}`` | |
| Description: | |
| Respond to hello from server | |
| ``minor`` = protocol major version number supported by client | |
| ``major`` = protocol minor version number supported by client | |
| ``name`` = client name | |
| barrierCmdDInfo "DINF" | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| client ->server | |
| Parameters: | |
| ``{ int16_t x_origin, int16_t y_origin, int16_t width, int16_t height, int16_t x, int16_t y}`` | |
| Description: | |
| The client screen must send this message in response to the | |
| barrierCmdQInfo message. It must also send this message when the | |
| screen's resolution changes. In this case, the client screen should | |
| ignore any barrierCmdDMouseMove messages until it receives a | |
| barrierCmdCInfoAck in order to prevent attempts to move the mouse off | |
| the new screen area. | |
| barrierCmdCNoop "CNOP" | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| client -> server | |
| Parameters: | |
| None | |
| Description: | |
| No operation | |
| barrierCmdCClose "CBYE" | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| None | |
| Description: | |
| Close connection | |
| barrierCmdCEnter "CINN" | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t x, int16_t y, int32_t seq, int16_t modifier }`` | |
| Description: | |
| Enter screen. | |
| ``x``, ``y`` = entering screen absolute coordinates | |
| ``seq`` = sequence number, which is used to order messages between | |
| screens. the secondary screen must return this number | |
| with some messages | |
| ``modifier`` = modifier key mask. this will have bits set for each | |
| toggle modifier key that is activated on entry to the | |
| screen. the secondary screen should adjust its toggle | |
| modifiers to reflect that state. | |
| barrierCmdCLeave "COUT" | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| None | |
| Description: | |
| Leaving screen. the secondary screen should send clipboard data in | |
| response to this message for those clipboards that it has grabbed | |
| (i.e. has sent a barrierCmdCClipboard for and has not received a | |
| barrierCmdCClipboard for with a greater sequence number) and that | |
| were grabbed or have changed since the last leave. | |
| barrierCmdCClipboard "CCLP" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int8_t id, int32_t seq }`` | |
| Description: | |
| Grab clipboard. Sent by screen when some other app on that screen | |
| grabs a clipboard. | |
| ``id`` = the clipboard identifier | |
| ``seq`` = sequence number. Client must use the sequence number passed in | |
| the most recent barrierCmdCEnter. the server always sends 0. | |
| barrierCmdCScreenSaver "CSEC" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int8_t started }`` | |
| Description: | |
| Screensaver change. | |
| ``started`` = Screensaver on primary has started (1) or closed (0) | |
| barrierCmdCResetOptions "CROP" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| None | |
| Description: | |
| Reset options. Client should reset all of its options to their | |
| defaults. | |
| barrierCmdCInfoAck "CIAK" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| None | |
| Description: | |
| Resolution change acknowledgment. Sent by server in response to a | |
| client screen's barrierCmdDInfo. This is sent for every | |
| barrierCmdDInfo, whether or not the server had sent a barrierCmdQInfo. | |
| barrierCmdCKeepAlive "CALV" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| None | |
| Description: | |
| Keep connection alive. Sent by the server periodically to verify | |
| that connections are still up and running. clients must reply in | |
| kind on receipt. if the server gets an error sending the message or | |
| does not receive a reply within a reasonable time then the server | |
| disconnects the client. if the client doesn't receive these (or any | |
| message) periodically then it should disconnect from the server. the | |
| appropriate interval is defined by an option. | |
| barrierCmdDKeyDown "DKDN" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t keyid, int16_t modifier [,int16_t button] }`` | |
| Description: | |
| Key pressed. | |
| ``keyid`` = X11 key id | |
| ``modified`` = modified mask | |
| ``button`` = X11 Xkb keycode (optional) | |
| barrierCmdDKeyRepeat "DKRP" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t keyid, int16_t modifier, int16_t repeat [,int16_t button] }`` | |
| Description: | |
| Key auto-repeat. | |
| ``keyid`` = X11 key id | |
| ``modified`` = modified mask | |
| ``repeat`` = number of repeats | |
| ``button`` = X11 Xkb keycode (optional) | |
| barrierCmdDKeyUp "DKUP" | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t keyid, int16_t modifier [,int16_t button] }`` | |
| Description: | |
| Key released. | |
| ``keyid`` = X11 key id | |
| ``modified`` = modified mask | |
| ``button`` = X11 Xkb keycode (optional) | |
| barrierCmdDMouseDown "DMDN" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int8_t button }`` | |
| Description: | |
| Mouse button pressed. | |
| ``button`` = button id | |
| barrierCmdDMouseUp "DMUP" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int8_t button }`` | |
| Description: | |
| Mouse button release. | |
| ``button`` = button id | |
| barrierCmdDMouseMove "DMMV" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t x, int16_t y }`` | |
| Description: | |
| Absolute mouse moved. | |
| ``x``, ``y`` = absolute screen coordinates | |
| barrierCmdDMouseRelMove "DMRM" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t x, int16_t y }`` | |
| Description: | |
| Relative mouse moved. | |
| ``x``, ``y`` = r relative screen coordinates | |
| barrierCmdDMouseWheel "DMWM" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t x , int16_t y }`` or ``{ int16_t y }`` | |
| Description: | |
| Mouse scroll. The delta should be +120 for one tick forward (away | |
| from the user) or right and -120 for one tick backward (toward the | |
| user) or left. | |
| ``x`` = x delta | |
| ``y`` = y delta | |
| barrierCmdDClipboard "DCLP" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int8_t id, int32_t seq, int8_t mark, char *data }`` | |
| Description: | |
| Clipboard data. | |
| ``id`` = clipboard id | |
| ``seq`` = sequence number. The sequence number is 0 when sent by the | |
| server. Client screens should use the/ sequence number from | |
| the most recent barrierCmdCEnter. | |
| barrierCmdDSetOptions "DSOP" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int32 t nb, { int32_t id, int32_t val }[] }`` | |
| Description: | |
| Set options. Client should set the given option/value pairs. | |
| ``nb`` = numbers of ``{ id, val }`` entries | |
| ``id`` = option id | |
| ``val`` = option new value | |
| barrierCmdDFileTransfer "DFTR" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int8_t mark, char *content }`` | |
| Description: | |
| Transfer file data. | |
| * ``mark`` = 0 means the content followed is the file size | |
| * 1 means the content followed is the chunk data | |
| * 2 means the file transfer is finished | |
| barrierCmdDDragInfo "DDRG" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t nb, char *content }`` | |
| Description: | |
| Drag information. | |
| ``nb`` = number of dragging objects | |
| ``content`` = object's directory | |
| barrierCmdQInfo "QINF" | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| None | |
| Description: | |
| Query screen info | |
| Client should reply with a barrierCmdDInfo | |
| barrierCmdEIncompatible "EICV" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| ``{ int16_t nb, major *minor }`` | |
| Description: | |
| Incompatible version. | |
| ``major`` = major version | |
| ``minor`` = minor version | |
| barrierCmdEBusy "EBSY" | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| None | |
| Description: | |
| Name provided when connecting is already in use. | |
| barrierCmdEUnknown "EUNK" | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| None | |
| Description: | |
| Unknown client. Name provided when connecting is not in primary's | |
| screen configuration map. | |
| barrierCmdEBad "EBAD" | |
| ^^^^^^^^^^^^^^^^^^^^^^^ | |
| Direction: | |
| server -> client | |
| Parameters: | |
| None | |
| Description: | |
| Protocol violation. Server should disconnect after sending this | |
| message. | |