xkb 第6章 server 中的鍵事件處理

本章節介紹在存在 XKB 擴展的 server 中處理鍵事件所涉及的步驟。鍵盤活動能夠生成鍵事件,並經過 DDX 層傳遞給 XKB,或者能夠經過其餘擴展(例如 XTEST)合成。app

應用全局 controls

當 XKB 收到鍵事件時,它首先檢查全局 controls 以決定是否當即處理或者不處理事件。按照優先級由高到低可能影響事件的全局 controls 有:測試

  • 若是在啓用 BounceKeys control 時按下某個鍵,則僅當該鍵處於活動狀態時,XKB 纔會生成該事件。當釋放按鍵時,server 將取消激活該鍵,而且以 debounce delay 指定的時間間隔啓動一個 bounce keys 計時器。編碼

    若是 bounce keys 計時器到期或者在計時器到期以前按下某個其餘鍵,則 server 從新激活相應的鍵(以前取消激活的鍵)並停用計時器。bounce keys timer 的到期或停用都不會致使事件。lua

  • 若是啓用了 SlowKeys control,則不當即處理鍵事件,而是以 slow keys delay 指定的時間間隔設置 slow keys 計時器。相應的鍵釋放將停用此計時器。指針

    若是 slow keys 計時器到期,則 server 生成對應的鍵事件,發送 XkbAccessXNotify並停用計時器。code

  • XKB 正常處理鍵事件,無論 RepeatKeys control 是否啓用,但若是啓用了 RepeatKeys 而且該事件中的鍵啓用了 per-key autorepeat,則 XKB 正常處理鍵事件,但它也以 autorepeat delay 指定的時間段初始化 autorepeat 計時器,相應的鍵釋放將停用計時器。server

    若是 autorepeat 計時器到期,則 server 爲相應的鍵生成 release 和 press 事件,而且根據 autorepeat interval 從新安排計時器。blog

鍵事件由每一個全局 control 依次處理:若是 BounceKeys control 接受鍵事件,則 SlowKeys control 會考慮它。一旦 SlowKeys control 容許或合成事件,RepeatKeys control 就會對其進行操做。索引

鍵 Behavior

一旦事件被全部 controls 接受或由計時器生成,server 就會檢查相應鍵的 pre-key behavior。此擴展目前定義了以下鍵 behaviors:事件

  • KB_Default —— press 和 release 事件被正常處理

  • KB_Lock —— 若是鍵是邏輯上的 up(即core key map 相應 bit 被清除),當它被按下再釋放,press 被正常處理,但忽略相應的 release。若是鍵是邏輯上的 down,當它被按下再釋放,press 被忽略但相應的 release 被正常處理。

  • KB_RadioGroup(flags: CARD8,index: CARD8) —— 若是 index 指定的 radio group 的另外一個成員是邏輯上的 down,當鍵被按下,server 爲那個邏輯上 down 的成員合成 key release 事件,而後正常處理鍵的 press 事件。

    若是鍵它本身是邏輯上的 down,當鍵被按下,press 事件被忽略,但根據 flags 中 RGAllowNone bit 的值處理相應鍵的釋放 。 若是它設置了,則 release 被正常處理;不然 release 被忽略。

    全部其餘鍵 release 事件被忽略。

  • KB_Overlay1(key: KEYCODE) —— 若是 Overlay1 control 被啓用,報告來自此鍵的事件,就好像它們來自 key 參數指定的鍵同樣,不然,正常處理 press 和 release 事件。

  • KB_Overlay2(key: KEYCODE) —— 若是 Overlay2 control 被啓用,報告來自此鍵的事件,就好像它們來自 key 參數指定的鍵同樣,不然,正常處理 press 和 release 事件。

X server 使用鍵 behavior 來肯定是處理仍是過濾掉任何給定的鍵事件;鍵 behavior 是獨立於鍵盤 modifier 和 group state 的(每一個鍵只能有一個behavior)。

鍵 behavior 能夠用於模擬任何這些類型的鍵或去指示鍵的不可修改的物理、電器或軟件驅動特徵。一個可選的 permanent flag 能夠修改任何支持的 behaviors 並指示此 behavior 描述了鍵盤的不可更改的物理、電器或軟件方面。permanent behaviors 不能被 XkbSetMap 請求修改和設置。permanent flag 表示 XKB 不能影響的底層系統的特徵,所以 XKB 將全部 permanent behaviors 視爲 KB_Default 而且不過濾上表中描述的鍵事件。

我通過測試後,發現沒法經過 GetMap 請求獲取鍵 behaviors 了,回覆中 totalKeyBehaviors 始終爲 0。

鍵 Actions

一旦 server 應用了全局 controls 和 pre-key behaviors 並決定去處理鍵事件,它應用鍵 action 來肯定該鍵對 server 內部 state 的影響。鍵 action 由操做符和一些可選數據組成。XKB 支持如下 actions:

  • 修改 modifier 或 group 的 基本、暫鎖、鎖定 state
  • 移動核心指針或模擬核心指針按鈕事件
  • 改變鍵盤 behavior 的大多數方面
  • 終止或掛起(suspend)server
  • 給感興趣的 clients 發送消息
  • 模擬其餘鍵的事件

每一個鍵都有一個可選的 actions 列表。若是存在,則該列表與鍵相關的符號平行(即與鍵相關的每一個符號有一個 action)。對於鍵 press 事件,server 使用和事件中的鍵相關的 key symbol mapping 從列表查找要被應用的 action,就像 client 查找符號同樣;若是事件中的鍵沒有任何 actions,則 server 使用 SA_NoAction, 而無論 modifier 或 group 的 state 如何。

鍵 action 實際上分爲兩半;當鍵被按下對 server 的效果和當鍵被釋放的效果。被應用於鍵 press 事件的 action 決定進一步的actions,若是有,這些 action 被應用於相應鍵的 release 事件或當鍵持續按下時的事件。當鍵是 down 時 client 能夠改變與鍵相關的 actions,且不修改下次鍵釋放被應用的 action;後續的 press-release pairs 將會使用新綁定的鍵action。

大多數對鍵盤 modifier state 有影響的 actions 的參數有名爲 mods 的 modifier 定義和名爲 useModMap 的 boolean flag。這兩個字段組合在一塊兒指定受 action 影響的 modifiers: 若是 useModMap 是 True,則 action 設置經過 modifier mapping 綁定到初始化該 action 的鍵的任何 modifiers;不然, action 設置由參數 mods 指定的 modifiers。爲簡潔起見,咱們將 userModMap 和 mods 的這種組合稱爲「action modifiers」。

XKB 支持以下 actions:

  • SA_NoAction —— 無直接影響,儘管 SA_NoAction 可能會改變其餘 server actions 的影響(見下文)。

  • SA_SetMods(mods: MOD_DEF,useModMap: BOOL,clearLocks: BOOL) ——

    • 鍵 press 增長任何 action modifiers 到鍵盤的基本 modifiers。
    • 鍵 release 清除在鍵盤基本 modifiers 中的任何 action modifiers。
    • 若是沒有和此鍵同時操做其餘鍵,而且設置了 clearLocks ,release 解鎖任何 action modifiers。
  • SA_LatchMods(mods: MOD_DEF,useModMap: BOOL,clearLocks: BOOL,latchToLock: BOOL) ——

    • 鍵 press 和 release 事件與 SA_SetMods 具備相同效果;若是沒有和正在暫鎖 modifier 的鍵同時操做其餘鍵,鍵 release 事件有以下附加效果:
    • 由 clearLocks 而被解鎖的 modifiers 沒有進一步效果。
    • 若是設置了 latchToLock,則鍵 release 會鎖定而後解除暫鎖已經被暫鎖的任何剩餘的 action modifiers。
    • 最後,鍵 release 會暫鎖任何未被 clearLocks 或 latchToLock flags 使用過的 action modifiers。
  • SA_LockMods (mods: MOD_DEF, useModMap: BOOL, noLock: BOOL, noUnlock: BOOL) ——

    • 鍵 press 設置任何 action modifiers 的基本和可能的鎖定 state。若是 noLock 是 True,則僅基本 state 被改變。
    • 對於鍵 release 事件,清除鍵盤基本 modifiers 中的任何 action modifiers,前提是沒有其餘影響相同 modifiers 的鍵是 down。若是 noUnlock 是 False 且在相應鍵按下以前任何 action modifiers 被鎖定,鍵 release 解鎖它們。
  • SA_SetGroup(group: INT8,groupAbsolute: BOOL,clearLocks: BOOL) ——

    • 若是設置了 groupAbsolute,則鍵 press 事件改變鍵盤基本 group 爲參數 group;不然,把參數 group 增長到鍵盤基本 group。則任何一種狀況下,生成的鍵盤有效 group 根據鍵盤的 GroupsWrap control 的值被帶到範圍內。
    • 若是在按住此鍵的同時按下有SA_ISOLock action 的鍵,鍵 release 無效果,不然它取消 press 的效果。
    • 若是沒有和此鍵同時操做其餘鍵,而且設置了 clearLocks ,鍵 release 也設置鍵盤鎖定 group 爲 Group1。
  • SA_LatchGroup(group: INT8,groupAbsolute: BOOL,clearLocks: BOOL,latchToLock: BOOL)——

    • 鍵 press 和 release 事件和 SA_SetGroup action 有相同效果;若是沒有和正在暫鎖 group 的鍵同時操做其餘鍵而且 clearLocks flag 沒有設置或沒有效果,鍵 release 有以下效果:
    • 若是設置了 latchToLock 且鍵盤暫鎖 group 不是 0,鍵 release 增長應用到相應鍵 press 的 delta 到鍵盤鎖定 group,並從鍵盤暫鎖 group 減去它。鍵盤鎖定和有效 group 根據鍵盤的 GroupsWrap control 的值被帶到範圍內。
    • 不然,鍵 release 增長鍵 press delta 到鍵盤暫鎖 group。

    注:這裏的 delta 不太明確。

  • SA_LockGroup(group: INT8,groupAbsolute: BOOL) ——

    • 若是設置了 groupAbsolute,鍵 press 設置鍵盤鎖定 group 爲參數 group。不然,鍵 press 把參數 group 增長到鍵盤鎖定 group。在任何一種狀況下,生成的鍵盤鎖定和有效 group 根據鍵盤的 GroupsWrap control 的值被帶到範圍內。
    • 鍵 release 沒有效果。
  • SA_MovePtr(x, y: INT16,noAccel: BOOL,absoluteX: BOOL,absoluteY: BOOL)——

    • 若是未啓用 MouseKeys control,則此 action 行爲相似於 SA_NoAction,不然此 action 取消任何此鍵即將觸發的 repeat key timers,並具備如下附加效果。
    • 鍵 press 生成核心指針 MotionNotify 事件而不是一般的 KeyPress 事件。若是 absoluteX 爲 True,參數 x 指定新的指針 X 座標,不然參數 x 被增長到指針當前的X 座標; absoluteY 和參數 y 以相同的方式指定新的 Y 座標。
    • 若是 noAccel 爲 False,而且啓用了 MouseKeysAccel control,鍵 press 也爲此鍵初始化 mouse keys 計時器;每次該計時器到期時,光標再次移動。光標在這些後續事件中移動的距離由鼠標鍵加速決定,如 MouseKeysAccel Control 中所述。
    • 鍵 release 除了停用 mosue keys 計時器(若是它被相應鍵 press 初始化了),就沒有其餘效果並被忽略(不會生成任何類型的事件)。
  • SA_PtrBtn(button: CARD8,count: CARD8,useDfltBtn: BOOL) ——

    • 若是未啓用 MouseKeys control,則此 action 的行爲相似於 SA_NoAction。
    • 若是設置了useDfltBtn,則會爲當前的默認核心按鈕生成事件。不然,將爲參數 button 指定的按鈕生成事件。
    • 若是此 action 的參數 button 指定的按鈕是邏輯上 down,則鍵 press 和相應的 release 被忽略且無效。
    • 不然,鍵 press 致使一個或多個核心指針按鈕事件,而非一般的鍵 press 事件。若是 count 爲 0,則鍵 press 會生成一個 ButtonPress 事件; 若是 count 大於 0,則鍵 press 會生成 count 對的 ButtonPress 和 ButtonRelease 事件。
    • 若是 count 爲 0,則鍵 relase 生成一個核心指針 ButtonRelease 事件,它與相應的鍵 press 生成的事件相匹配;若是 count 大於 0,則鍵 release 不會致使 ButtonRelease 事件。鍵 release 永遠不會致使鍵 release 事件。
  • SA_LockPtrBtn(button: BUTTON,noLock: BOOL,noUnlock: BOOL,useDfltBtn: BOOL) ——

    • 若是未啓用 MouseKeys control,則此 action 的行爲相似於 SA_NoAction。
    • 不然,若是由參數 useDfltBtn 和 button 指定的按鈕未被鎖定,鍵 press 致使一個 ButtonPress 事件而非鍵 press 事件且鎖定此按鈕。若是此按鈕已經被鎖定或若是 noLock 是 True,鍵 press 被忽略且無效。
    • 若是相應的鍵 press 被忽略,而且 noUnlock 爲 False, 鍵 release 生成一個 ButtonRelease 事件而非鍵 release 事件且解鎖指定的按鈕。若是相應的鍵 press 鎖定一個按鈕,鍵 release 被忽略且無效。
  • SA_SetPtrDflt(affect: CARD8,value: CARD8,dfltBtnAbs: BOOL)——

    • 若是未啓用 MouseKeys control,則此 action 的行爲相似於 SA_NoAction。
    • 不然,鍵 press 和 release 都被忽略,除了鍵 press 修改指針由參數 affect 指定的指針值爲參數 value,以下所示:
    • 若是 affect 設置了 SA_AffectDfltBtn,參數 value 和 dfltBtnAbs 指定了被用於各類指針 action 的默認指針按鈕,以下所示: 若是 dfltBtnAbs 是 True,參數 value 指定要被使用的按鈕,不然,參數 value 指定要被增長到當前默認按鈕的數量。 在任何一種狀況下,非法的按鈕選擇都會被 wrap 回到範圍內。
  • SA_ISOLock(dfltIsGroup: False,mods: MOD_DEF,useModMap: BOOL,noLock: BOOL,noUnlock: BOOL,noAffectMods: BOOL,noAffectGrp: BOOL,noAffectPtr: BOOL,noAffectCtrls: BOOL) 或 (dfltIsGroup: True,group: INT8,groupAbsolute: BOOL,noAffectMods: BOOL,noAffectGrp: BOOL,noAffectPtr: BOOL,noAffectCtrls: BOOL)——

    • 若是 dfltIsGroup 爲 True,則鍵 press 設置由參數 groupAbsolute 和 group 指定的基本 group, 不然,鍵 press 設置 action modifier 到鍵盤的基本 modifiers。
    • 鍵 release 清除由鍵 press 設置的基本 modifiers 或 group;若是沒有其餘適當的 action 與 SA_ISOLock action 同時發生,它可能會產生額外的影響。
    • 若是noAffectMods 爲 False,則與此 action 同時發生的 SA_SetMods 或 SA_LatchMods action 將被視爲 SA_LockMods action。
    • 若是 noAffectGrp 爲 False,則與此 action 同時發生的 SA_SetGroup 或 SA_LatchGroup action 將被視爲SA_LockGroup action。
    • 若是 noAffectPtr 爲 False,則與此 action 同時發生的 SA_PtrBtn action 被視爲 SA_LockPtrBtn action。
    • 若是 noAffectCtrls 爲 False,則與此 action 同時發生的 SA_SetControls action 將被視爲 SA_LockControls action。
    • 若是 SA_ISOLock action 未轉換其餘 action,則鍵 release 將鎖定由 action 參數指定的 group 或 modifiers。
  • SA_TerminateServer ——

    • 鍵 press 終止 server, 鍵 release 被忽略。
    • 此 action 是可選的;servers 能夠自由忽略它,若是被忽略,它的行爲相似於 SA_NoAction。
  • SA_SwitchScreen(num: INT8,switchApp: BOOL,screenAbs: BOOL) ——

    • 若是 server 支持此 action 和多個 screens 或 displays (虛擬或真實),則此 action 將 num 和 screnAbs 指定的 screen 改成活動 screen。 若是 screenAbs 爲 True, num 指定新 screen 的索引;不然,num 指定從當前活動 screen 到新 screen 的偏移量。
    • 若是 switchApp 是 False,則應切換到同一個 server 的另外一個 screen 上。不然,應切換到另外一個共享相同物理 display 的 X server 或應用程序。
    • 此 action 是可選的; server 若是不支持請求的行爲能夠自由忽略它或它的任何 flags。若是 action 被忽略,它的行爲相似於 SA_NoAction,不然鍵 press 或 release 都不會生成事件。
  • SA_SetControls(controls: KB_BOOLCTRLMASK) ——

    • 鍵 press 啓用 control 中指定的任何在鍵按下時還沒有啓用的 boolean controls,鍵 release 禁用相應鍵 press 啓用的任何 controls。 此 action 可致使 XkbControlsNotify 事件。
  • SA_LockControls(controls: KB_BOOLCTRLMASK,noLock: BOOL,noUnlock: BOOL )——

    • 若是 noLock 爲 False,則鍵 press 鎖定和啓用參數 controls 中指定的且在鍵按下時還沒有被鎖定的任何 controls。若是 noUnlock 爲 False,鍵 release 解鎖和禁用任何在參數 controls 中指定且相應鍵按下時還沒有被啓用的任何 controls。
  • SA_ActionMessage(pressMsg: BOOL,releaseMsg: BOOL,genEvent: BOOL,message: STRING)——

    • 若是 pressMsg 爲 True,則鍵 press 生成 XkbActionMessage 事件,該事件報告 keycode,event type 和 message 的內容。
    • 若是 releaseMsg 爲 True, 則鍵 release 生成 XkbActionMessage 事件,該事件報告 keycode,event type 和 message 的內容。
    • 若是 genEvent爲True,則鍵 press 和 release 都會生成 key press 和 key release 事件,不管它們是否也致使XkbActionMessage 事件。
  • SA_RedirectKey(newKey: KEYCODE,modsMask: KEYMASK,mods: KEYMASK,vmodsMask: CARD16,vmods: CARD16) ——

    • 鍵 press 致使參數 newKey 指定的鍵的 key press 事件,而非實際的鍵。事件中報告的 state 字段的當前有效 modifier 修改以下:任何在 modsMask 中指定的真實 modifiers 都被設置爲 mods 中的相應值。任何被綁定到 vmodsMask 中指定的虛擬 modifiers 的真實 modifier 都被設置或清除, 具體取決於 vmods 中的相應值。若是真實和虛擬 modifier 定義給單個 modifier 指定了衝突的值,真實 modifier 定義優先。
    • 鍵 release 致使參數 newKey 指定的鍵的 key release 事件;對事件的 state 字段中的鍵盤的有效 modifiers 進行更改如上所述。
    • 此 action 一般會重定向到同一設備的另外一個的鍵,好像此鍵或按鈕致使了此事件,除非該設備不屬於 input 擴展 KEYCLASS,這種狀況下,此 action 會致使核心鍵盤設備上的事件。
  • SA_DeviceBtn(count: CARD8,button: BUTTON,device: CARD8) ——

    • device 字段指定擴展設備的 ID;button 字段指定該設備上的按鈕的索引。若是此 action 指定的按鈕是邏輯上 down,則鍵 press 和相應的 release 被忽略且無效。若是此 action 指定的設備或按鈕無效,則此 action 的行爲相似於 SA_NoAction。
    • 不然,鍵 press 會致使一個或多個 input 擴展設備按鈕事件,而非一般的 key press 事件。若是 count 爲 0,鍵 press 生成單個 DeviceButtonPress 事件;若是 count 大於 0,鍵 press 生成 count 對 DeviceButtonPress 和 DeviceButtonRelease 事件。
    • 若是 count 爲 0,鍵 release 生成一個 input 擴展 DeviceButtonRelease 事件,它匹配相應鍵 press 生成的事件;若是 count 大於 0,鍵 release 不致使 DeviceButtonRelease 事件。鍵 release 永遠不會致使 key release 事件。
  • SA_LockDeviceBtn(button: BUTTON,device: CARD8,noLock: BOOL,noUnlock: BOOL ——

    • device 字段指定擴展設備的 ID;button 字段指定該設備上的按鈕的索引。若是此 action 指定的按鈕是邏輯上 down,則鍵 press 和相應的 release 被忽略且無效。若是此 action 指定的設備或按鈕無效,則此 action 的行爲相似於 SA_NoAction。
    • 不然,若是指定的按鈕未鎖定且 noLock 爲 False,則鍵 press 會致使 input 擴展 DeviceButtonPress 事件而不是 key press 事件,並鎖定按鈕。若是該按鈕已被鎖定或者若是 noLock 爲 True,則鍵 press 被忽略而且無效。
    • 若是相應的鍵 press 被忽略了,而且 noUnlock 爲 False,鍵 release 會生成 input 擴展 DeviceButtonRelease 事件,而不是核心協議或 input 擴展的鍵 release 事件,並解鎖指定的按鈕。若是相應的鍵 press 鎖定按鈕,則鍵 release 被忽略而且無效。
  • SA_DeviceValuator (device : CARD8,val1What : SA_DVOP,val1 : CARD8,val1Value : INT8,val1Scale : 0...7,val2What : SA_DVOP,val2 : CARD8,val2Value : INT8,val2Scale : 0...7)——

    • device 字段指定擴展設備的 ID; val1 和 val2 指定該設備上的 valuators。若是 device 是無效的,或者 val1 和 val2 都沒有指定有效的 valuator,則此 action 的行爲相似於 SA_NoAction。
    • 若是 valn 指定了有效的 valuator,而且 valnWhat 不是 SA_IgnoreVal,則按照 valnWhat 指定的方式調整指定的值:
    • 若是 valnWhat 是 SA_SetValMin,則 valn 被設置爲它的最小有效值。
    • 若是 valnWhat 是 SA_SetValCenter,則 valn 被居中(爲 (max-min)/2)。
    • 若是 valnWhat 是 SA_SetValMax,則 valn 被設置爲它的最大有效值。
    • 若是 valnWhat 是 SA_SetValRelative,則 被增長到 valn。
    • 若是 valnWhat 是 SA_SetValAbsolute,則 valn 被設置爲
    • SA_SetValRelative 或 SA_SetValAbsolute 致使的無效值被限制在範圍內。

若是啓用了 StickyKeys,則全部 SA_SetMods 和 SA_SetGroup actions 分別像 SA_LatchMods 和 SA_LatchGroup。若是設置了 LatchToLock AccessX option,則任一 action 都表現爲設置了 SA_ClearLocks 和 SA_LatchToLock flags。

致使事件來自另外一個鍵或來自另外一個設備的按鈕的 actions 當即生成指定的事件。這些 actions 不考慮綁定到事件重定向到的鍵或按鈕的 behavior 或 actions(若是有)。

server actions 生成的核心事件包含在鍵事件發生時生效的鍵盤 state;報告的 state 不會反映因爲致使它們的、綁定到鍵事件的 actions 而致使的 state 中的任何改變。

發送到未發出 XkbUseExtension 請求的 clients 的事件包含兼容 state,而不是實際的 XKB 鍵盤 state。有關此兼容性映射的說明,請參閱 XKB 對核心協議事件的影響。

傳遞鍵或按鈕事件到 client

接收核心協議和 input 擴展的鍵或按鈕事件的窗口和 client 使用由核心協議和 input 擴展指定的焦點策略、窗口層次結構和被動 grabs 來肯定,並進行如下更改:

  • 若是 grab 中指定的 modifier state 與兼容性 grab state (在鍵盤 state 的兼容性組件中描述)匹配,則會觸發被動 grab。 經過設置 GrabsUseXKBState per-client flag,clients 能夠選擇使用 XKB grab state。此 flag 影響全部由設置了它的 client 請求的全部被動 grabs,但不會影響其餘 client 設置的被動 grabs。
  • 致使了被動 grab 的事件的 state 字段報告在 grab 被觸發時有效的 XKB 或兼容性 grab state;當鍵或按鈕被釋放,相應 release 事件的 state 字段報告相應的有效的 grab state。
  • 若是設置了 LookupStateWhenGrabbed per-client flag,則在鍵盤或指針 grab 激活時發生的全部鍵或按鈕事件包含 XKB 或兼容性 lookup state,具體取決於 GrabsUseXKBState per-client flag 的值。若是未設置 LookupStateWhenGrabbed,則它們包括 XKB 或兼容性 grab state
  • 另外,不觸發被動 grab 報告的事件的 state 字段是從 XKB 有效 modifiers 和 group 派生的,如從 XKB State 計算 State 字段中所述。
  • 若是鍵 release 事件是自動重複鍵正在被按下的結果,且要接收事件的 client 請求了可檢測的自動重複,則事件不會傳遞到此 client。

如下部分說明了 XKB 與核心協議 grabs 的交互的意圖和須要 pre-client flags 的緣由。

XKB 與核心協議 grabs 的交互

XKB 提供單獨的 lookup 和 grab state,以幫助解決核心協議指定被動 grabs 方式的一些困難。不幸的是,許多 client 以不一樣的方式解決這些問題,而XKB處理 grabs 和報告鍵盤 state 的方式有時會以意外和不愉快的方式與這些 client 的變通方法進行交互。

爲了給知道 XKB 的 clients 提供更合理的行爲,而不會致使不知道 XKB 的 clients 出現問題,XKB 提供兩個 per-client flags (GrabsUseXKBState 和 LookupStateWhenGrabbed),用於指定 XKB 與核心協議應該如何交互。

  • 最大的問題來自於 XKB State 字段在 bits 13-14 編碼顯式的鍵盤 group,而 pre-XKB clients 使用 8 個 modifiers 來選擇哪一個鍵盤 group。爲了使現有 client 行爲合理,XKB 一般使用兼容性 grab state 而非 XKB grab state 來肯定是否觸發被動 grabs。XKB-aware clients 能夠設置 GrabsUseXKBState per-client flag,以指示它們使用 XKB state 指定被動 grabs。

  • 當觸發被動 grab 時,一些 toolkits 會開始主動 grab,以便更好地控制 grab 終止的條件。不幸的是,XKB 在 觸發或終止 grabs 事件報告不一樣 state 意味着此 grab 模擬在某些狀況下沒法終止 grab。要解決此問題,XKB 在 grab 激活時在全部事件中報告 grab state。不使用此類主動 grabs 的 clients 能夠設置 LookupStateWhenGrabbed per-client flag,以便不管 grab 是否激活,收到相同的 state 組件。

    GrabsUseXKBState per-client flag 也適用於在 grab 激活時發送的事件的 state。若是設置了,grab 期間的事件包含 XKB lookup 或 grab state;默認狀況下,grab 期間的事件包含兼容性 lookup 或 grab state。

用於觸發被動 grab 的 state 由 grab 註冊時的 GrabsUseXKBState per-client flag 設置控制。修改此 flag 不會影響現有的被動 grabs。

相關文章
相關標籤/搜索