| 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. | 
 |  |