XKB 支持许多全局的按键控制,将会影响 XKB 总体处理键盘的方式。布局
核心协议仅容许控制整个键盘或单个按键是否应在按下时自动重复。 RepeatKeys control 经过添加对直到开始重复的延迟和重复速率的控制来扩展此功能。RepeatKeys 也和核心协议的 autorepeat control 合做,更改一个老是反映到另外一个。指针
RepeatKeys control 有两个参数。autorepeat delay 指定初始按下自动重复键和第一个生成的重复事件之间的延迟(以毫秒为单位)。autorepeat interval 指定全部后续生成的重复事件之间的延迟(以毫秒为单位)。code
当 RepeatKeys control 被启用时,PerKeyRepeat Control 指定在持续按住单个键时是否应该自动重复。XKB 为了方便起见提供了 PerKeyRepeat,而且它老是与核心协议 GetKeyboardControl 请求的 auto-repeats 字段 相对应 —— 更改一个老是反映到另外一个。server
每当按下自动重复键时,X server 一般会生成 press 和 release 事件。若是 XKB-aware client 启用了 DetectableAutorepeat per-client选项,则 server 仅在键被物理地释放时才发送 key release 事件。好比,按住某个键可生成三个字符而不会检测到自动重复产生:blog
Press -> Release -> Press -> Release -> Press -> Release事件
若是启用了可检测的自动重复,client 收到不一样的事件序列:io
Press-> Press -> Press -> Releasetable
请注意,只有请求可检测自动重复的 client 才会受到影响; 其余 client 继续收到重复按键的 press 和 release 事件。另请注意,对可检测的自动重复的支持是可选的; server 不须要支持可检测的自动重复,但它们必须正确报告是否支持它。cli
一些用户常常在移动他们的手或者按向他们想要的键时意外地碰撞键。一般,意外碰撞的键仅在很短的时间段内被按下。SlowKeys control 经过告知 server 在传递键事件前等待指定的时间段(被称为 SlowKeys acceptance delay)帮助过滤掉这些意外碰撞。若是在此时间段过去以前释放键,则没有键事件被生成。用户能够在到达想要的键的路径上撞到任意数量的键而不会产生不须要的字符。 一旦他们到达他们想要键时,他们就能够保持足够长的时间让 SlowKeys 接受它。扩展
SlowKeys control 有一个参数;slow keys delay 指定在接受键以前必须按住键的时间段长度(以毫秒为单位)。
当 SlowKeys 被启用时,XKB 会使用 AccessXNotify 事件向感兴趣的 client 报告任何键的初始按下、接受、拒绝或释放。
有些有运动障碍的人在按下按键时会意外地“蹦蹦跳跳”。也就是说,他们按下一次,而后当即意外地松开再次按下它。BounceKeys control 在按下后暂时禁用一个键,有效地去抖动。
BounceKeys control 有一个参数。BounceKeys delay 指定按下键后禁用键的时间段(以毫秒为单位)。
当 BounceKeys 被启用时,server 经过发送 AccessXNotify 事件向感兴趣的客户端报告任何键的接受或拒绝。
有些人发现很难或不可能同时按下两个键。 StickyKeys Control 经过更改 modifier 键的行为使其更容易键入。当启用StickyKeys时,当用户仅按下一次 modifier 时,modifier 被暂锁(latched)了,所以用户能够先按下一个 modifier 键,再释放它,而后按下另外一个键。好比,要在 PC 式键盘上获得一个感叹号(!),用户能够先按下 Shift 键,再释放它,而后按下 1 键。
默认状况下,StickyKeys 还容许用户锁定 modifier 键,而无需特殊的锁定键。用户能够连续两次按下 modifier 键来锁定它,而后再次按下它来解锁它。
当用户按下非 modifier 键时,modifier 将自动解除暂锁。例如,要输入快捷键序列 Shift + Ctrl + Z,用户能够先按下再释放 Shift 键以锁定 Shift modifier,而后先按下再释放 Ctrl 键以锁定 Control modifier —— Ctrl键是 modifier 键,所以按它不会解锁 Shift modifier,而是将 Shift 和 Control modifier 同时暂锁。 当用户按下 Z 键时,就好像用户同时按下 Shift + Ctrl + Z。Z 键不是 modifier 键,所以在生成事件后,Shift 和 Control modifier 都将解除暂锁。
锁定的 modifier 保持有效,直到用户解锁它。要在具备典型 US/ASCII 布局的 PC 型键盘上输入序列(“XKB”),用户能够连续两次按下再释放 Shift 键以锁定 Shift modifier。 而后,当用户按依次按下9, ',x,k,b,' 和 0 键时,它将产生(“XKB”)。 要解锁 Shift modifier,用户能够先按下再释放 Shift 键。
两个选项 flags 修改 StickyKeys control 的行为:
若是设置了 XkbAX_TwoKeys flag,若是用户一次按下两个或更多键,XKB将自动关闭 StickyKeys。这用于在不须要粘滞键的用户正在使用键盘时自动禁用 StickyKeys。
XkbAX_LatchToLock 控制 StickyKeys 的锁定行为; 若是设置了 XkbAX_LatchToLock flag,StickyKeys control 仅锁定modifier,如上所述。
MouseKeys control 容许用户经过键盘控制全部鼠标功能。 启用 MouseKeys 后,全部绑定了 MouseKeys actions 的键都会生成核心指针事件,而不是正常的 key press 和 release 事件。
MouseKeys control 有一个参数,mouse keys default button 用于指定未明确指定 button 的鼠标键操做使用的核心指针 button。
若是启用了 MouseKeysAccel control,则在按住键时,指针运动的效果会发生变化。mouse keys delay 指定初始按键和第一次重复运动事件之间的时间量。mouse keys interval 指定重复鼠标键事件之间的时间量。 steps to maximum acceleration 指定指针以最大速度移动以前的事件总数。maximum acceleration 指定最大加速。curve 控制用于达到最大加速的斜坡。
当启用 MouseKeys 时,而且激活 SA_MovePtr 键 action,将当即生成指针运动事件。 若是启用了 MouseKeysAccel 而且对问题讨论的键启用了加速, 在 mouse keys delay 毫秒后会生成第二个事件,而且只要按住该键,每隔 mouse keys interval 毫秒将生成更多的事件。
若是 SA_MovePtr action 指定相对运动,则生成事件以下:初始事件始终将鼠标指针移动到操做中指定的距离;在生成了 steps to maximum acceleration 个事件以后,全部后续事件都将鼠标指针移动 action 中指定的距离× maximum acceleration。在第一次加速以后但最大加速以前的事件的移动距离遵循公式:
其中 action_delta 是 mouse keys action 指定的偏移量,max_accel 和 steps_to_max 是 MouseKeysAccel control 的参数,curveFactor 是使用 MouseKeysAccel 的 curve 参数计算的,以下所示:
curve 为 0 会使移动的距离从 action_delta 线性增长到 max_accel×action_delta,最小有效的 curve 为 -1000,致使全部的移动距离都为 action_delta×max_accel。负的 curve 致使加速度的初始急剧增长逐渐减少,而正的 curve 产生加速度的初始增长较慢,随后随着 action 产生的事件的数量接近 steps_to_max 而急剧增长。
若是 SA_MovePtr action 指定了一个坐标的绝对位置但仍容许加速,则全部重复事件都包含 action 中指定的那个绝对坐标。
若是启用了 AccessXKeys,则能够经过输入如下标准键序列从键盘打开或关闭许多 controls:
在共享计算机的环境中,诸如 SlowKeys 之类的功能会出现问题:若是启用了 SlowKeys,键盘可能看起来没有响应,由于除非将键按住一段时间,不然按键无效。 为了帮助解决此问题,XKB 提供了一个 AccessXTimeout control,以便键盘在指定的时间段内空闲后自动更改任何 global controls 或 AccessX options 的值。
AccessXTimeout control 具备许多参数,这些参数会影响 timeout 的持续时间以及 timeout 到期时更改的功能。
AccessX Timeout 字段指定在修改 global control 和 AccessX options 以前键盘必须处于空闲状态的秒数。 AccessX Options Mask 字段指定要更改 AccessX Options 字段中的哪些值, AccessX Options Values 字段指定这些 options 的新值。 AccessX Controls Mask 字段指定要在 global enabled controls 中更改哪些 controls, AccessX Controls Values 字段指定这些 controls 的新值。
若是启用了AccessXFeedback,则用特殊的蜂鸣声代码(beep codes)表示键盘 controls 的更改(或者当 SlowKeys 或 StickyKeys 处于活动状态时的某些键事件)。 许多 beep codes 听起来像多个音调,但 XKB 以单个 XkbBellNotify 事件报告整个音调序列。
全部反馈音均由 AudibleBell control 控制。可使用 accessX options mask 显式启用或禁用单个反馈音,或者使用 accessX timeout options mask 在空闲时间段后将其设置为禁用。
键盘 overlay 容许键盘的某些子集在当 overlay 启用时报告备用 keycodes。例如,当 overlay 被启用时,经过为某些键生成备用的 keycodes,键盘 overlay 可用于模拟键盘上的数字或编辑小键盘 (实际上它们在键盘上不存在)。这种技术在便携式计算机和带有小键盘的嵌入式系统上很是广泛。
XKB 包括使用 Overlay1 和 Overlay2 controls 直接支持两个键盘overlays。当 Overlay1 被启用,全部做为第一个键盘 overlay 的成员的键都生成备用 keycode。当 Overlay2 被启用时,全部做为第二个键盘 overlay 的成员的键都生成备用keycode。
要指定键所属的 overlay 和当启用该 overlay 时应该生成的备用 keycode,请为此键分配 KB_Overlay1 或 KB_Overlay2 key behaviors.
上文描述的全部 controls 以及 AudibleBell Control 和 IgnoreGroupLock control 包含 boolean controls。除了各个 control 的描述中列出的若干参数以外,还能够经过更改 EnabledControls control 的值来单独启用或禁用 boolean control。
如下非 boolean control 始终处于启用状态,没法使用 EnabledControls control 进行更改,也没法在任何仅接受 boolean control 的上下文中指定: GroupsWrap, EnabledControls, InternalMods, IgnoreLockMods 和 PerKeyRepeat。
auto-reset controls 是每一个 client 的值,由两个值组成,能够包含任意 boolean controls。每当 client 因任何缘由退出时,任何在 auto-reset mask 中指定的 boolean controls 都将设置为 auto-reset values 中的相应值。这使得 client 能够自动“自行清理”,即便异常终止也是如此。
例如,用一些其余声音提示替换键盘铃的 client 可能但愿禁用 AudibleBell control 以防止 server 也生成声音,从而避免杂音。若是 client 在不重置 AudibleBell control 的状况下退出,则用户将彻底没有任何反馈。在 auto-reset mask 和 auto-reset values 中都设置 AudibleBell control 可确保在 client 退出时从新打开音铃。