在基于 Web 的 VNC 应用程序中支持多种键盘布局(2)
- UID
- 1066743
|
在基于 Web 的 VNC 应用程序中支持多种键盘布局(2)
RFB 协议、QEMU/KVM 虚拟化和 VNC (远程帧缓冲区)是 VNC 用于远程访问 GUI 的协议。在该协议及其扩展协议中定义的多种 RFB 客户端到服务器消息类型中,本文关注的是 KeyEvent,也就是在按下或释放一个键时从 RFB 客户端发送到服务器的消息。图 2 显示了该消息格式。
图 2. RFB KeyEvent 客户端消息的格式- message-type 指定消息类型。KeyEvent 消息为类型 4。
- down-flag 指定键的状态。如果按下该键,该值为 1;如果释放,该值为 0。
- padding 是一个填充了 0 的 2 字节字段。
- keysym 是按下或释放的键的键符。
当收到 KeyEvent 消息时,依据 down-flag 的值,RFB 服务器将按下或释放键时的键符复制到远程桌面中。在此消息中使用键符,是早期 QEMU 版本在用于虚拟化的 VNC 客户端/服务器上遇到设计问题的根源。
首次尝试QEMU 项目首次尝试引入 keymap 选项,以告诉 QEMU 生成键符的 VNC 客户端中使用了哪个键盘布局图。有了此信息,QEMU 就可以尝试从键符转换回键码;如果未指定键盘布局图,它会使用默认的美国布局。此方法不足以解决非美国键盘的 QEMU 问题。QEMU 需要能够支持 VNC 客户端使用的任何键盘布局(针对 100 多种语言的布局),而且从上一节中我们已经知道,不同的组合键可能生成相同的键符。
QEMU 是一个硬件模拟器。当您连接到在 QEMU 虚拟机中运行的 VNC 服务器时,服务器不会单纯地接收和显示击键;它会模拟它们,就像有人在虚拟机中的一个真实键盘上按键一样。结果,在收到 RFB KeyEvent 消息时,QEMU 会尝试着将已发送的键转换为生成该键的 XT 扫描码。但是,KeyEvent 消息发送的是键符。QEMU 曾经面临着如何根据键符利用已按下或已释放的键来获取实际 XT 扫描码的挑战。
在 QEMU 最初尝试解决此问题失败后(参见 “首次尝试” 边栏), 和 QEMU 社区合作创建了 RFB 协议的一个官方扩展,该扩展添加了一条新的 KeyEvent 消息,其中不仅包含键符,还包含在 VNC 客户端中按下的键码。图 3 显示了该消息格式。
图 3. QEMU 扩展 KeyEvent RFB 消息的格式- message-type 指定消息类型。扩展的 QEMU KeyEvent 消息为类型 255。
- submessage-type 有一个一字节的默认值 0。
- down-flag 指定键的状态。如果按下该键,该值为 1;如果释放,该值为 0。
- keysym 是已按下或释放的键的键符。
- keycode 是生成该键符的键码。
借助额外的 keycode 信息,QEMU 可将键码转换回扫描码并进行模拟。此能力还使 VNC 服务器不知道 VNC 客户端使用了哪个键盘布局图。只要客户端的键盘布局图与来宾操作系统(在虚拟机中运行的操作系统)中配置的键盘布局图相同,键盘就会按预期工作。 |
|
|
|
|
|