1Barrier client protocol 2======================= 3 4QEMU's ``input-barrier`` device implements the client end of 5the KVM (Keyboard-Video-Mouse) software 6`Barrier <https://github.com/debauchee/barrier>`__. 7 8This document briefly describes the protocol as we implement it. 9 10Message format 11-------------- 12 13Message format between the server and client is in two parts: 14 15#. the payload length, a 32bit integer in network endianness 16#. the payload 17 18The payload starts with a 4byte string (without NUL) which is the 19command. The first command between the server and the client 20is the only command not encoded on 4 bytes ("Barrier"). 21The remaining part of the payload is decoded according to the command. 22 23Protocol Description 24-------------------- 25 26This comes from ``barrier/src/lib/barrier/protocol_types.h``. 27 28barrierCmdHello "Barrier" 29^^^^^^^^^^^^^^^^^^^^^^^^^^ 30 31Direction: 32 server -> client 33Parameters: 34 ``{ int16_t minor, int16_t major }`` 35Description: 36 Say hello to client 37 38 ``minor`` = protocol major version number supported by server 39 40 ``major`` = protocol minor version number supported by server 41 42barrierCmdHelloBack "Barrier" 43^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 44 45Direction: 46 client ->server 47Parameters: 48 ``{ int16_t minor, int16_t major, char *name}`` 49Description: 50 Respond to hello from server 51 52 ``minor`` = protocol major version number supported by client 53 54 ``major`` = protocol minor version number supported by client 55 56 ``name`` = client name 57 58barrierCmdDInfo "DINF" 59^^^^^^^^^^^^^^^^^^^^^^^ 60 61Direction: 62 client ->server 63Parameters: 64 ``{ int16_t x_origin, int16_t y_origin, int16_t width, int16_t height, int16_t x, int16_t y}`` 65Description: 66 The client screen must send this message in response to the 67 barrierCmdQInfo message. It must also send this message when the 68 screen's resolution changes. In this case, the client screen should 69 ignore any barrierCmdDMouseMove messages until it receives a 70 barrierCmdCInfoAck in order to prevent attempts to move the mouse off 71 the new screen area. 72 73barrierCmdCNoop "CNOP" 74^^^^^^^^^^^^^^^^^^^^^^^ 75 76Direction: 77 client -> server 78Parameters: 79 None 80Description: 81 No operation 82 83barrierCmdCClose "CBYE" 84^^^^^^^^^^^^^^^^^^^^^^^ 85 86Direction: 87 server -> client 88Parameters: 89 None 90Description: 91 Close connection 92 93barrierCmdCEnter "CINN" 94^^^^^^^^^^^^^^^^^^^^^^^ 95 96Direction: 97 server -> client 98Parameters: 99 ``{ int16_t x, int16_t y, int32_t seq, int16_t modifier }`` 100Description: 101 Enter screen. 102 103 ``x``, ``y`` = entering screen absolute coordinates 104 105 ``seq`` = sequence number, which is used to order messages between 106 screens. the secondary screen must return this number 107 with some messages 108 109 ``modifier`` = modifier key mask. this will have bits set for each 110 toggle modifier key that is activated on entry to the 111 screen. the secondary screen should adjust its toggle 112 modifiers to reflect that state. 113 114barrierCmdCLeave "COUT" 115^^^^^^^^^^^^^^^^^^^^^^^ 116 117Direction: 118 server -> client 119Parameters: 120 None 121Description: 122 Leaving screen. the secondary screen should send clipboard data in 123 response to this message for those clipboards that it has grabbed 124 (i.e. has sent a barrierCmdCClipboard for and has not received a 125 barrierCmdCClipboard for with a greater sequence number) and that 126 were grabbed or have changed since the last leave. 127 128barrierCmdCClipboard "CCLP" 129^^^^^^^^^^^^^^^^^^^^^^^^^^^ 130 131Direction: 132 server -> client 133Parameters: 134 ``{ int8_t id, int32_t seq }`` 135Description: 136 Grab clipboard. Sent by screen when some other app on that screen 137 grabs a clipboard. 138 139 ``id`` = the clipboard identifier 140 141 ``seq`` = sequence number. Client must use the sequence number passed in 142 the most recent barrierCmdCEnter. the server always sends 0. 143 144barrierCmdCScreenSaver "CSEC" 145^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 146 147Direction: 148 server -> client 149Parameters: 150 ``{ int8_t started }`` 151Description: 152 Screensaver change. 153 154 ``started`` = Screensaver on primary has started (1) or closed (0) 155 156barrierCmdCResetOptions "CROP" 157^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 158 159Direction: 160 server -> client 161Parameters: 162 None 163Description: 164 Reset options. Client should reset all of its options to their 165 defaults. 166 167barrierCmdCInfoAck "CIAK" 168^^^^^^^^^^^^^^^^^^^^^^^^^^^ 169 170Direction: 171 server -> client 172Parameters: 173 None 174Description: 175 Resolution change acknowledgment. Sent by server in response to a 176 client screen's barrierCmdDInfo. This is sent for every 177 barrierCmdDInfo, whether or not the server had sent a barrierCmdQInfo. 178 179barrierCmdCKeepAlive "CALV" 180^^^^^^^^^^^^^^^^^^^^^^^^^^^ 181 182Direction: 183 server -> client 184Parameters: 185 None 186Description: 187 Keep connection alive. Sent by the server periodically to verify 188 that connections are still up and running. clients must reply in 189 kind on receipt. if the server gets an error sending the message or 190 does not receive a reply within a reasonable time then the server 191 disconnects the client. if the client doesn't receive these (or any 192 message) periodically then it should disconnect from the server. the 193 appropriate interval is defined by an option. 194 195barrierCmdDKeyDown "DKDN" 196^^^^^^^^^^^^^^^^^^^^^^^^^^^ 197 198Direction: 199 server -> client 200Parameters: 201 ``{ int16_t keyid, int16_t modifier [,int16_t button] }`` 202Description: 203 Key pressed. 204 205 ``keyid`` = X11 key id 206 207 ``modified`` = modified mask 208 209 ``button`` = X11 Xkb keycode (optional) 210 211barrierCmdDKeyRepeat "DKRP" 212^^^^^^^^^^^^^^^^^^^^^^^^^^^ 213 214Direction: 215 server -> client 216Parameters: 217 ``{ int16_t keyid, int16_t modifier, int16_t repeat [,int16_t button] }`` 218Description: 219 Key auto-repeat. 220 221 ``keyid`` = X11 key id 222 223 ``modified`` = modified mask 224 225 ``repeat`` = number of repeats 226 227 ``button`` = X11 Xkb keycode (optional) 228 229barrierCmdDKeyUp "DKUP" 230^^^^^^^^^^^^^^^^^^^^^^^ 231 232Direction: 233 server -> client 234Parameters: 235 ``{ int16_t keyid, int16_t modifier [,int16_t button] }`` 236Description: 237 Key released. 238 239 ``keyid`` = X11 key id 240 241 ``modified`` = modified mask 242 243 ``button`` = X11 Xkb keycode (optional) 244 245barrierCmdDMouseDown "DMDN" 246^^^^^^^^^^^^^^^^^^^^^^^^^^^ 247 248Direction: 249 server -> client 250Parameters: 251 ``{ int8_t button }`` 252Description: 253 Mouse button pressed. 254 255 ``button`` = button id 256 257barrierCmdDMouseUp "DMUP" 258^^^^^^^^^^^^^^^^^^^^^^^^^^^ 259 260Direction: 261 server -> client 262Parameters: 263 ``{ int8_t button }`` 264Description: 265 Mouse button release. 266 267 ``button`` = button id 268 269barrierCmdDMouseMove "DMMV" 270^^^^^^^^^^^^^^^^^^^^^^^^^^^ 271 272Direction: 273 server -> client 274Parameters: 275 ``{ int16_t x, int16_t y }`` 276Description: 277 Absolute mouse moved. 278 279 ``x``, ``y`` = absolute screen coordinates 280 281barrierCmdDMouseRelMove "DMRM" 282^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 283 284Direction: 285 server -> client 286Parameters: 287 ``{ int16_t x, int16_t y }`` 288Description: 289 Relative mouse moved. 290 291 ``x``, ``y`` = r relative screen coordinates 292 293barrierCmdDMouseWheel "DMWM" 294^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 295 296Direction: 297 server -> client 298Parameters: 299 ``{ int16_t x , int16_t y }`` or ``{ int16_t y }`` 300Description: 301 Mouse scroll. The delta should be +120 for one tick forward (away 302 from the user) or right and -120 for one tick backward (toward the 303 user) or left. 304 305 ``x`` = x delta 306 307 ``y`` = y delta 308 309barrierCmdDClipboard "DCLP" 310^^^^^^^^^^^^^^^^^^^^^^^^^^^ 311 312Direction: 313 server -> client 314Parameters: 315 ``{ int8_t id, int32_t seq, int8_t mark, char *data }`` 316Description: 317 Clipboard data. 318 319 ``id`` = clipboard id 320 321 ``seq`` = sequence number. The sequence number is 0 when sent by the 322 server. Client screens should use the/ sequence number from 323 the most recent barrierCmdCEnter. 324 325barrierCmdDSetOptions "DSOP" 326^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 327 328Direction: 329 server -> client 330Parameters: 331 ``{ int32 t nb, { int32_t id, int32_t val }[] }`` 332Description: 333 Set options. Client should set the given option/value pairs. 334 335 ``nb`` = numbers of ``{ id, val }`` entries 336 337 ``id`` = option id 338 339 ``val`` = option new value 340 341barrierCmdDFileTransfer "DFTR" 342^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 343 344Direction: 345 server -> client 346Parameters: 347 ``{ int8_t mark, char *content }`` 348Description: 349 Transfer file data. 350 351 * ``mark`` = 0 means the content followed is the file size 352 * 1 means the content followed is the chunk data 353 * 2 means the file transfer is finished 354 355barrierCmdDDragInfo "DDRG" 356^^^^^^^^^^^^^^^^^^^^^^^^^^^ 357 358Direction: 359 server -> client 360Parameters: 361 ``{ int16_t nb, char *content }`` 362Description: 363 Drag information. 364 365 ``nb`` = number of dragging objects 366 367 ``content`` = object's directory 368 369barrierCmdQInfo "QINF" 370^^^^^^^^^^^^^^^^^^^^^^^ 371 372Direction: 373 server -> client 374Parameters: 375 None 376Description: 377 Query screen info 378 379 Client should reply with a barrierCmdDInfo 380 381barrierCmdEIncompatible "EICV" 382^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 383 384Direction: 385 server -> client 386Parameters: 387 ``{ int16_t nb, major *minor }`` 388Description: 389 Incompatible version. 390 391 ``major`` = major version 392 393 ``minor`` = minor version 394 395barrierCmdEBusy "EBSY" 396^^^^^^^^^^^^^^^^^^^^^^^ 397 398Direction: 399 server -> client 400Parameters: 401 None 402Description: 403 Name provided when connecting is already in use. 404 405barrierCmdEUnknown "EUNK" 406^^^^^^^^^^^^^^^^^^^^^^^^^^^ 407 408Direction: 409 server -> client 410Parameters: 411 None 412Description: 413 Unknown client. Name provided when connecting is not in primary's 414 screen configuration map. 415 416barrierCmdEBad "EBAD" 417^^^^^^^^^^^^^^^^^^^^^^^ 418 419Direction: 420 server -> client 421Parameters: 422 None 423Description: 424 Protocol violation. Server should disconnect after sending this 425 message. 426 427