Extra keyboard keys
|Summary help replacing me|
|A general overview of how to assign actions to extra keyboard keys.|
|Extra Keyboard Keys in Xorg|
|Extra Keyboard Keys in Console|
Many keyboards include some "special keys" (also called hotkeys, such as HP Quickplay), which are supposed to execute an application or print special characters (not included in the standard national keymaps). The lack of specification for these extra keys makes it impossible for the kernel to know what to do with them and that is why we need to map the keys to actions. There are 3 ways of doing that:
- The most portable way using low level tools, such as acpid. Not all keys are supported, but configuration in uniform way is possible for keyboard keys, power adapter connection and even headphone jack (un)plugging events.
- The universal way using Xorg utilities (and eventually your desktop environment tools)
- The quicker way using a third-party program to do everything in GUI, such as the Gnome Control Center or Keytouch
Before starting you need to learn some vocabulary.
A scancode is the lowest identification number for a key. If a key does not have a scancode then we cannot do anything because it means that the kernel does not see it.
A keycode is the second level of identification for a key, a keycode corresponds to a function.
A symbol is the third level of identification for a key, it is the way Xorg refers to keys.
Step 1: Check for keycodes
Most of your keys should already have a keycode, or at least a scancode. Keys without a scancode are not recognized by the kernel.
Use the graphical X program "xev" (without having to switch to a console environment). Install .
With the following line you can start xev and directly grep the important parts:
$ xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'
In the example below I pressed the "a", "r", "c" and "h" keys and two of the media keys on my Dell keyboard. This gives me the following output:
38 a 27 r 54 c 43 h 153 NoSymbol 144 NoSymbol
This means that the "a", "r", "c" and "h" keys have the keycodes 38, 27, 54 and 43 and are properly bound while the media keys with the keycodes 153 and 144 have no function yet, which is indicated by "NoSymbol". If you press a key and nothing appears in the terminal, this means that the kernel does not see that key or that it is not mapped.
The universal way to know if a key has a keycode is to use the kernel
showkey program. showkey waits for a key to be pressed and if none is during 10 seconds it quits, note that this is the only way to exit the program. To execute showkey you need to be in a real console, it means not in a graphical environment so switch using
Ctrl+Alt+F1 returns to the graphical environment).
and try to push your hotkeys. If a keycode appears the key is mapped, if not it can mean either that the kernel does not see the key or that the key is not mapped.
According to the keymap man page:
This is relevant if the keymaps obtained from showkey and the ones set by setkeycodes differ from the ones obtained by xev in X. Keep this in mind when translating the keymaps into keysyms using xmodmap (See Extra Keyboard Keys in Xorg).
If all your keys have a keycode you can go directly to the second step. If not keep reading below:
Check for scancodes
If a key does not have a keycode you can know if it has a scancode by looking at the kernel log using the dmesg command:
$ dmesg|tail -5
If when you press the key something like that appears:
atkbd.c: Unknown key pressed (translated set 2, code 0xf1 on isa0060/serio0). atkbd.c: Use 'setkeycodes e071 <keycode>' to make it known.
then your key has a scancode which can be mapped to a keycode. See Map scancodes to keycodes.
If nothing new appears in dmesg then your key does not have a scancode, which means that it is not recognized by the kernel and cannot be used.
Step 2: map keycodes
See the dedicated article: Extra Keyboard Keys in Console.
When in console, hotkeys can be used to print sequences of characters, including escape sequences. Thus, printing the sequence of characters constituting a command followed by the escape sequence for a new will execute the command.
See the dedicated article: Extra Keyboard Keys in Xorg.
Asus M series
In order to have control over the light sensor and the multimedia keys on your Asus machine, you should use the following command:
# echo 0 > /sys/devices/platform/asus-laptop
To have it run on boot create a Systemd tmpfile:
w /sys/devices/platform/asus-laptop/ls_switch - - - - 0
Asus N56VJ (or possibly others)
if most of your special keys don't work, try loading the asus-nb-wmi kernel module with
# modprobe asus-nb-wmi
then check xev again. if you combine this with the acpi_osi="!Windows 2012" boot option, you may get weird results in xev, so try not using it. If this did fix things, make sure to make the module load at boot with methods described here