xkb 第3章 虚拟 Modifiers

核心协议规定,当某些 keysyms 绑定到 modifiers,影响全部键的 keycode 到 keysym 解释的规则;好比,当 Num_Lock 绑定到一些 modifier,这个 modifier 被用于选择数字小键盘键的 shifted 或 unshifted 状态。 核心协议不提供方便的方式来肯定 modifier bits 到 keysyms 的映射(特别是 Mod1 到 Mod5),好比 Num_Lock 和 Mode_switch。clients 必须获取和搜索 modifier mapping 来肯定 keycodes 绑定到的每一个 modifier,而后获取和搜索 keyboard mapping 来决定 keycodes 绑定到的 keysysms。每当 modifier mapping 的任何部分修改了,它们必须对全部 modifiers 重复这个过程。数据结构

XKB提供了一组16个命名的虚拟 modifiers,每一个 modifiers 能够绑定到 8个“真实” modifiers (键盘 state 中的被报告的 Shift, Lock, Control和Mod1 - Mod5)中的任何一组。这使得应用程序和键盘布局设计者更容易指定 modifier 键或数据结构应该知足的功能, 不用担忧哪一个 modifier 被绑定到特定的 keysym。app

使用单个 server 驱动机制来报告全部数据结构的改变,使得 clients 更容易保持同步。好比,核心协议为绑定到 Num_Lock 键的 modifier 指定特殊的解释。当任何键或 modifiers 被从新绑定,每一个应用程序必须检查 keyboard mapping 以保证对 Num_Lock 的绑定没有改变。若是当 XKB 被使用时 Num_lock 被从新绑定,则键盘描述自动更新以反应新的绑定,若是须要考虑更改,clients 都被当即且明确地通知。布局

功能与物理 modifier 绑定的分离也使得更容易更明确地指定绑定的意图。X servers 并不都以相同的方式分配modifiers —— 好比,Num_Lock 可能在一个供应商被绑定到 Mod2,而在另外一个供应商绑定到 Mod4。 这使得在没有关于键盘布局和绑定的某种先验知识的状况下自动将键盘从新映射到指望的配置变得麻烦。 使用 XKB,应用程序只需使用虚拟 modifier 来指定所需的行为,而无需考虑实际的实际物理绑定。设计

XKB 将键盘的大部分方面置于用户或程序控制之下,所以按功能清晰统一地引用 modifiers 更为重要。code

modifier 定义

使用 XKB modifier 定义指定的 modifiers 受任何 XKB control 或数据结构影响。一个XKB modifier 定义由一组真实 modifiers,一组虚拟 modifiers 和一个有效 mask 组成。mask 是从真实和虚拟 modifiers 派生出的,没法显式更改 —— 它包含定义中指定的全部真实 modifiers 加上任何被绑定到定义中指定的虚拟 modifiers 的真实 modifiers。 好比,这个 modifier 定义表示数字锁定 modifier 若是 Num_Lock keysym 没有被绑定到任何真实 modifier:server

{ real_mods= None, virtual_mods= NumLock, mask= None }

若是咱们分配真实 modifier Mod2 到 Num_Lock keysysm,定义修改成(mask 自动变了):同步

{ real_mods= None, virtual_mods= NumLock, mask= Mod2 }

使用这种 modifier 定义能够轻松指定所需的行为,使 XKB 能够自动更新组成键盘映射的全部数据结构 ,以反映用户或应用程序在键盘映射的任意一个方面指定的更改。it

modifier 定义的使用还能够明确指定修饰符感兴趣的缘由。 在 Alt 和 Meta keysyms 绑定到同一modifier(真实 modifier Mod1)的系统上,如下定义的行为相同:io

{ real_mods= None, virtual_mods= Alt, mask= Mod1 }
{ real_mods= None, virtual_mods= Meta, mask= Mod1 }

若是咱们从新绑定其中一个modifier (Meta 绑定到真实 modifier Mod4),则 modifier 定义会自动反映更改:cli

{ real_mods= None, virtual_mods= Alt, mask= Mod1 }
{ real_mods= None, virtual_mods= Meta, mask= Mod4 }

若是没有虚拟 modifiers 映射和 modifier 定义提供的间接级别,咱们就没法分辨这两个定义中哪一个与 Alt 有关,哪一个与 Meta 有关。

不活跃 modifier 定义

一些 XKB 结构忽略 modifier 定义,其中虚拟modifiers 未被绑定。考虑以下例子:

if ( state matches { Shift } ) Do OneThing;
if ( state matches { Shift+NumLock } ) Do Another;

若是 NumLock 虚拟 modifier 未被绑定到任何真实 modifier,则这两种状况的有效 mask是相同的(即它们只包含Shift)。 当有必要区别 OneThing 和 Another 时,XKB 仅考虑全部虚拟 modifier 都被绑定的 modifier 定义。

虚拟 modifier 映射

XKB 维护虚拟 modifier 映射,该映射列出与每一个键相关的虚拟modifiers。被绑定到一个虚拟 modifier $VmodA 的真实 modifiers 老是包括全部被绑定到某些键的 modifiers。这些键在其虚拟 modifier 映射中映射到虚拟 modifier $VmodA。

好比,若是 Mod3 经过核心协议 modifier 映射被绑定到 Num_Lock 键,而且 NumLock 虚拟 modifier 经过虚拟 modifier 映射被绑定到 Num_Lock 键,则 Mod3 被增长到和 NumLock 虚拟 modifier 关联的 modifiers 组中。

真实 modifier Mod3 ---core modifier 映射--> Num_Lock keysym
真实 modifier Mod4 ---core modifier 映射--> Num_Lock keysym
NumLock 虚拟modifier ---xkb 虚拟modifier映射--> Num_Lock keysym

==>

NumLock 虚拟modifier === [Mod3,Mod4, ...]

每当将 actions 分配给键时,虚拟 modifier 映射是被自动正常更新,而且不多有应用程序须要显式地修改虚拟 modifier 映射。

相关文章
相关标签/搜索