1================= 2Keyboard notifier 3================= 4 5One can use register_keyboard_notifier to get called back on keyboard 6events (see kbd_keycode() function for details). The passed structure is 7keyboard_notifier_param (see <linux/keyboard.h>): 8 9- 'vc' always provide the VC for which the keyboard event applies; 10- 'down' is 1 for a key press event, 0 for a key release; 11- 'shift' is the current modifier state, mask bit indexes are KG_*; 12- 'ledstate' is the current LED state; 13- 'value' depends on the type of event. 14 15- KBD_KEYCODE events are always sent before other events, value is the keycode. 16- KBD_UNBOUND_KEYCODE events are sent if the keycode is not bound to a keysym. 17 value is the keycode. 18- KBD_UNICODE events are sent if the keycode -> keysym translation produced a 19 unicode character. value is the unicode value. 20- KBD_KEYSYM events are sent if the keycode -> keysym translation produced a 21 non-unicode character. value is the keysym. 22- KBD_POST_KEYSYM events are sent after the treatment of non-unicode keysyms. 23 That permits one to inspect the resulting LEDs for instance. 24 25For each kind of event but the last, the callback may return NOTIFY_STOP in 26order to "eat" the event: the notify loop is stopped and the keyboard event is 27dropped. 28 29In a rough C snippet, we have:: 30 31 kbd_keycode(keycode) { 32 ... 33 params.value = keycode; 34 if (notifier_call_chain(KBD_KEYCODE,¶ms) == NOTIFY_STOP) 35 || !bound) { 36 notifier_call_chain(KBD_UNBOUND_KEYCODE,¶ms); 37 return; 38 } 39 40 if (unicode) { 41 param.value = unicode; 42 if (notifier_call_chain(KBD_UNICODE,¶ms) == NOTIFY_STOP) 43 return; 44 emit unicode; 45 return; 46 } 47 48 params.value = keysym; 49 if (notifier_call_chain(KBD_KEYSYM,¶ms) == NOTIFY_STOP) 50 return; 51 apply keysym; 52 notifier_call_chain(KBD_POST_KEYSYM,¶ms); 53 } 54 55.. note:: This notifier is usually called from interrupt context. 56