xkb 第4章 全局键盘 controls

XKB 支持许多全局的按键控制,将会影响 XKB 整体处理键盘的方式。

RepeatKeys control

核心协议仅允许控制整个键盘或单个按键是否应在按下时自动重复。 RepeatKeys control 通过添加对直到开始重复的延迟和重复速率的控制来扩展此功能。RepeatKeys 也和核心协议的 autorepeat control 合作,更改一个总是反映到另一个。

RepeatKeys control 有两个参数。autorepeat delay 指定初始按下自动重复键和第一个生成的重复事件之间的延迟(以毫秒为单位)。autorepeat interval 指定所有后续生成的重复事件之间的延迟(以毫秒为单位)。

PerKeyRepeat Control

当 RepeatKeys control 被启用时,PerKeyRepeat Control 指定在持续按住单个键时是否应该自动重复。XKB 为了方便起见提供了 PerKeyRepeat,并且它总是与核心协议 GetKeyboardControl 请求的 auto-repeats 字段 相对应 —— 更改一个总是反映到另一个。

可检测的自动重复 DetectableAutorepeat PerClientFlag

每当按下自动重复键时,X server 通常会生成 press 和 release 事件。如果 XKB-aware client 启用了 DetectableAutorepeat per-client选项,则 server 仅在键被物理地释放时才发送 key release 事件。比如,按住某个键可生成三个字符而不会检测到自动重复产生:

Press -> Release -> Press -> Release -> Press -> Release

如果启用了可检测的自动重复,client 收到不同的事件序列:

Press-> Press -> Press -> Release

请注意,只有请求可检测自动重复的 client 才会受到影响; 其他 client 继续收到重复按键的 press 和 release 事件。另请注意,对可检测的自动重复的支持是可选的; server 不需要支持可检测的自动重复,但它们必须正确报告是否支持它。

SlowKeys Control

一些用户经常在移动他们的手或者按向他们想要的键时意外地碰撞键。通常,意外碰撞的键仅在很短的时间段内被按下。SlowKeys control 通过告知 server 在传递键事件前等待指定的时间段(被称为 SlowKeys acceptance delay)帮助过滤掉这些意外碰撞。如果在此时间段过去之前释放键,则没有键事件被生成。用户可以在到达想要的键的路径上撞到任意数量的键而不会产生不需要的字符。 一旦他们到达他们想要键时,他们就可以保持足够长的时间让 SlowKeys 接受它。

SlowKeys control 有一个参数;slow keys delay 指定在接受键之前必须按住键的时间段长度(以毫秒为单位)。

当 SlowKeys 被启用时,XKB 会使用 AccessXNotify 事件向感兴趣的 client 报告任何键的初始按下、接受、拒绝或释放。

BounceKeys Control

有些有运动障碍的人在按下按键时会意外地“蹦蹦跳跳”。也就是说,他们按下一次,然后立即意外地松开再次按下它。BounceKeys control 在按下后暂时禁用一个键,有效地去抖动。

BounceKeys control 有一个参数。BounceKeys delay 指定按下键后禁用键的时间段(以毫秒为单位)。

当 BounceKeys 被启用时,server 通过发送 AccessXNotify 事件向感兴趣的客户端报告任何键的接受或拒绝。

StickyKeys Control

有些人发现很难或不可能同时按下两个键。 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 control 允许用户通过键盘控制所有鼠标功能。 启用 MouseKeys 后,所有绑定了 MouseKeys actions 的键都会生成核心指针事件,而不是正常的 key press 和 release 事件。

MouseKeys control 有一个参数,mouse keys default button 用于指定未明确指定 button 的鼠标键操作使用的核心指针 button。

MouseKeysAccel Control

如果启用了 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_accelsteps_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 Control

如果启用了 AccessXKeys,则可以通过输入以下标准键序列从键盘打开或关闭许多 controls:

  • 单独按住 shift 键 8 秒可以切换 SlowKeys control 的状态。
  • 连续按下和释放 shift 键 5 次,没有按其他键,连续按下之间的延迟小于30秒,切换 StickyKeys control 的状态。
  • 同时操作两个或更多个 modifier 键可以关闭 StickyKeys control。

AccessXTimeout Control

在共享计算机的环境中,诸如 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 Control

如果启用了AccessXFeedback,则用特殊的蜂鸣声代码(beep codes)表示键盘 controls 的更改(或者当 SlowKeys 或 StickyKeys 处于活动状态时的某些键事件)。 许多 beep codes 听起来像多个音调,但 XKB 以单个 XkbBellNotify 事件报告整个音调序列。

所有反馈音均由 AudibleBell control 控制。可以使用 accessX options mask 显式启用或禁用单个反馈音,或者使用 accessX timeout options mask 在空闲时间段后将其设置为禁用。

Overlay1 和 Overlay2 Controls

键盘 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.

"Boolean" Controls 和 EnabledControls Control

上文描述的所有 controls 以及 AudibleBell Control 和 IgnoreGroupLock control 包含 boolean controls。除了各个 control 的描述中列出的若干参数之外,还可以通过更改 EnabledControls control 的值来单独启用或禁用 boolean control。

以下非 boolean control 始终处于启用状态,无法使用 EnabledControls control 进行更改,也无法在任何仅接受 boolean control 的上下文中指定: GroupsWrap, EnabledControls, InternalMods, IgnoreLockMods 和 PerKeyRepeat。

Boolean Controls 的自动重置

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 退出时重新打开音铃。

转载于:https://my.oschina.net/u/1248114/blog/3007551

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值