3. 鍵盤通知器¶
可以使用 register_keyboard_notifier 註冊鍵盤事件的回撥函式(詳情參見 kbd_keycode() 函式)。 傳遞的結構是 keyboard_notifier_param(參見 <linux/keyboard.h>)
‘vc’ 始終提供鍵盤事件適用的 VC;
‘down’ 對於按鍵事件為 1,對於釋放事件為 0;
‘shift’ 是當前的修飾符狀態,掩碼位索引為 KG_*;
‘ledstate’ 是當前的 LED 狀態;
‘value’ 取決於事件的型別。
KBD_KEYCODE 事件總是在其他事件之前傳送,value 是鍵碼。
如果鍵碼未繫結到鍵符,則傳送 KBD_UNBOUND_KEYCODE 事件。 value 是鍵碼。
如果鍵碼 -> 鍵符轉換產生 Unicode 字元,則傳送 KBD_UNICODE 事件。 value 是 Unicode 值。
如果鍵碼 -> 鍵符轉換產生非 Unicode 字元,則傳送 KBD_KEYSYM 事件。 value 是鍵符。
KBD_POST_KEYSYM 事件在處理非 Unicode 鍵符之後傳送。 這允許檢查生成的 LED,例如。
對於每種事件(除了最後一種),回撥可以返回 NOTIFY_STOP 以“吃掉”事件:通知迴圈停止,鍵盤事件被丟棄。
在一個粗略的 C 程式碼片段中,我們有
kbd_keycode(keycode) {
...
params.value = keycode;
if (notifier_call_chain(KBD_KEYCODE,¶ms) == NOTIFY_STOP)
|| !bound) {
notifier_call_chain(KBD_UNBOUND_KEYCODE,¶ms);
return;
}
if (unicode) {
param.value = unicode;
if (notifier_call_chain(KBD_UNICODE,¶ms) == NOTIFY_STOP)
return;
emit unicode;
return;
}
params.value = keysym;
if (notifier_call_chain(KBD_KEYSYM,¶ms) == NOTIFY_STOP)
return;
apply keysym;
notifier_call_chain(KBD_POST_KEYSYM,¶ms);
}
注意
此通知器通常從中斷上下文呼叫。