Barrier 客户端协议

QEMU 的 input-barrier 设备实现键盘、视频、鼠标共享软件 Barrier 的客户端。

本文简述当前实现的协议。

消息格式

服务器与客户端的消息包含两部分:

  1. 载荷长度,网络字节序的 32 位整数

  2. 载荷

载荷以不含 NUL 的 4 字节命令字符串开始。双方首个命令 Barrier 是唯一不采用 4 字节编码的命令。其余载荷按命令类型解码。

协议说明

定义来自 barrier/src/lib/barrier/protocol_types.h。

barrierCmdHello "Barrier"

方向:

服务器到客户端

参数:

{ int16_t minor, int16_t major }

说明:

向客户端问候。

minor = 服务器支持的协议主版本号

major = 服务器支持的协议次版本号

barrierCmdHelloBack "Barrier"

方向:

客户端到服务器

参数:

{ int16_t minor, int16_t major, char *name}

说明:

回应服务器问候。

minor = 客户端支持的协议主版本号

major = 客户端支持的协议次版本号

name = 客户端名称

barrierCmdDInfo "DINF"

方向:

客户端到服务器

参数:

{ int16_t x_origin, int16_t y_origin, int16_t width, int16_t height, int16_t x, int16_t y}

说明:

客户端屏幕必须用此消息回复 barrierCmdQInfo,分辨率变化时也必须发送。 此时收到 barrierCmdCInfoAck 前,应忽略 barrierCmdDMouseMove, 避免鼠标移动到新屏幕范围之外。

barrierCmdCNoop "CNOP"

方向:

客户端到服务器

参数:

无。

说明:

无操作。

barrierCmdCClose "CBYE"

方向:

服务器到客户端

参数:

无。

说明:

关闭连接。

barrierCmdCEnter "CINN"

方向:

服务器到客户端

参数:

{ int16_t x, int16_t y, int32_t seq, int16_t modifier }

说明:

进入屏幕。

x, y = 进入屏幕的绝对坐标

seq = 序列号,用于排列屏幕间消息。副屏必须在部分消息中返回此编号

modifier = 修饰键掩码,进入屏幕时激活的每个切换修饰键都设置相应位。 副屏应调整自身切换状态以匹配

barrierCmdCLeave "COUT"

方向:

服务器到客户端

参数:

无。

说明:

离开屏幕。副屏应发送它已获取、且自上次离开以来新获取或已改变的剪贴板数据。 已获取指曾发送 barrierCmdCClipboard,且未收到更大序列号的同类消息。

barrierCmdCClipboard "CCLP"

方向:

服务器到客户端

参数:

{ int8_t id, int32_t seq }

说明:

获取剪贴板。屏幕上的其他应用取得剪贴板时,由该屏幕发送。

id = 剪贴板标识

seq = 序列号。客户端使用最近 barrierCmdCEnter 传入的值,服务器始终发送 0。

barrierCmdCScreenSaver "CSEC"

方向:

服务器到客户端

参数:

{ int8_t started }

说明:

屏幕保护状态变化。

started = 主屏屏保已启动(1)或关闭(0)

barrierCmdCResetOptions "CROP"

方向:

服务器到客户端

参数:

无。

说明:

重置选项,客户端应恢复所有默认值。

barrierCmdCInfoAck "CIAK"

方向:

服务器到客户端

参数:

无。

说明:

确认分辨率变化。服务器回复客户端的 barrierCmdDInfo。 每条 DInfo 都必须回复,无论此前是否发送过 barrierCmdQInfo。

barrierCmdCKeepAlive "CALV"

方向:

服务器到客户端

参数:

无。

说明:

连接保活。服务器定期发送以确认连接仍有效,客户端必须同样回复。 发送错误或合理时间内未收到回复时,服务器断开客户端。 客户端若不再定期收到此消息或任何消息,也应断开。间隔由选项定义。

barrierCmdDKeyDown "DKDN"

方向:

服务器到客户端

参数:

{ int16_t keyid, int16_t modifier [,int16_t button] }

说明:

按键按下。

keyid = X11 键 ID

modified = 修饰键掩码

button = X11 Xkb 键码,可选

barrierCmdDKeyRepeat "DKRP"

方向:

服务器到客户端

参数:

{ int16_t keyid, int16_t modifier, int16_t repeat [,int16_t button] }

说明:

按键自动重复。

keyid = X11 键 ID

modified = 修饰键掩码

repeat = 重复次数

button = X11 Xkb 键码,可选

barrierCmdDKeyUp "DKUP"

方向:

服务器到客户端

参数:

{ int16_t keyid, int16_t modifier [,int16_t button] }

说明:

按键释放。

keyid = X11 键 ID

modified = 修饰键掩码

button = X11 Xkb 键码,可选

barrierCmdDMouseDown "DMDN"

方向:

服务器到客户端

参数:

{ int8_t button }

说明:

鼠标按钮按下。

button = 按钮 ID

barrierCmdDMouseUp "DMUP"

方向:

服务器到客户端

参数:

{ int8_t button }

说明:

鼠标按钮释放。

button = 按钮 ID

barrierCmdDMouseMove "DMMV"

方向:

服务器到客户端

参数:

{ int16_t x, int16_t y }

说明:

鼠标绝对移动。

x, y = 屏幕绝对坐标

barrierCmdDMouseRelMove "DMRM"

方向:

服务器到客户端

参数:

{ int16_t x, int16_t y }

说明:

鼠标相对移动。

x, y = 屏幕相对坐标

barrierCmdDMouseWheel "DMWM"

方向:

服务器到客户端

参数:

{ int16_t x , int16_t y } 或 { int16_t y }

说明:

鼠标滚动。向前(远离用户)或向右一格为 +120,向后(朝向用户)或向左为 -120。

x = x 增量

y = y 增量

barrierCmdDClipboard "DCLP"

方向:

服务器到客户端

参数:

{ int8_t id, int32_t seq, int8_t mark, char *data }

说明:

剪贴板数据。

id = 剪贴板 ID

seq = 序列号。服务器发送时为 0;客户端使用最近 barrierCmdCEnter 的序列号。

barrierCmdDSetOptions "DSOP"

方向:

服务器到客户端

参数:

{ int32 t nb, { int32_t id, int32_t val }[] }

说明:

设置选项,客户端应应用给定的选项/值。

nb = { id, val } 条目数

id = 选项 ID

val = 选项新值

barrierCmdDFileTransfer "DFTR"

方向:

服务器到客户端

参数:

{ int8_t mark, char *content }

说明:

传输文件数据。

  • mark = 0 表示后续内容为文件大小

  • 1 表示后续内容为分块数据

  • 2 表示传输结束

barrierCmdDDragInfo "DDRG"

方向:

服务器到客户端

参数:

{ int16_t nb, char *content }

说明:

拖动信息。

nb = 拖动对象数

content = 对象目录

barrierCmdQInfo "QINF"

方向:

服务器到客户端

参数:

无。

说明:

查询屏幕信息。

客户端应回复 barrierCmdDInfo。

barrierCmdEIncompatible "EICV"

方向:

服务器到客户端

参数:

{ int16_t nb, major *minor }

说明:

版本不兼容。

major = 主版本

minor = 次版本

barrierCmdEBusy "EBSY"

方向:

服务器到客户端

参数:

无。

说明:

连接时提供的名称已被使用。

barrierCmdEUnknown "EUNK"

方向:

服务器到客户端

参数:

无。

说明:

未知客户端,连接时提供的名称不在主屏配置映射中。

barrierCmdEBad "EBAD"

方向:

服务器到客户端

参数:

无。

说明:

违反协议,服务器发送此消息后应断开。