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 退出時從新打開音鈴。