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 映射。

相關文章
相關標籤/搜索