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,&params) == NOTIFY_STOP)
        || !bound) {
            notifier_call_chain(KBD_UNBOUND_KEYCODE,&params);
            return;
    }

    if (unicode) {
            param.value = unicode;
            if (notifier_call_chain(KBD_UNICODE,&params) == NOTIFY_STOP)
                    return;
            emit unicode;
            return;
    }

    params.value = keysym;
    if (notifier_call_chain(KBD_KEYSYM,&params) == NOTIFY_STOP)
            return;
    apply keysym;
    notifier_call_chain(KBD_POST_KEYSYM,&params);
}

注意

此通知器通常從中斷上下文呼叫。