Extra keyboard keys

From ArchWiki
Revision as of 16:12, 2 October 2013 by Lahwaacz (Talk | contribs) (generalized introduction)

Jump to: navigation, search

zh-CN:Extra Keyboard Keys Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end Many keyboards include some special keys (also called hotkeys or multimedia keys), which are supposed to execute an application or print special characters (not included in the standard national keymaps). udev contains a large database of mappings specific to individual keyboards, so common keyboards usually work out of the box. If you have very recent or uncommon piece of hardware, you may need to adjust the mapping manually.

Prerequisite for modifying the key mapping is knowing how the keys are identified on the system. There are multiple levels:

  • A scancode is the lowest identification number for a key, it is the value that a keyboard sends to a computer.
  • A keycode is the second level of identification for a key, a keycode corresponds to a function.
  • A keysym is the third level of identification for a key, it corresponds to a symbol. It may depend on whether the Shift key or another modifier key was also pressed.

Scancodes are mapped to keycodes, which are then mapped to keysyms depending on used keyboard layout. Most of your keys should already have a keycode, or at least a scancode. Keys without a scancode are not recognized by the kernel.

Note: Some keysyms (e.g. XF86AudioPlay, XF86AudioRaiseVolume etc.) can be mapped to actions like launching an external application. There are multiple ways to do 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 (e.g. Xbindkeys) and eventually your desktop environment or window manager tools.
  • The quicker way using a third-party program to do everything in GUI, such as the Gnome Control Center or Keytouch.

Identifying key codes


Using showkey

The universal way to get a scancode is to use the showkey utility. showkey waits for a key to be pressed and if none is during 10 seconds it quits, which is the only way to exit the program. To execute showkey you need to be in a virtual console, not in a graphical environment. Run the following command

# showkey --scancodes

and try to push your hotkeys, you should see scancodes being printed to the output.

Using dmesg

Note: This method does not provide scancodes for all keys, it only identifies the unknown keys.

You can get the scancode of a key by pressing the desired key and looking the output of dmesg command. For example, if you get:

Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0

then the scancode you need is 0xa0.


Using xev

Use the graphical X program "xev" (without having to switch to a console environment). Install xorg-xev.

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.

Using showkey

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+F2 (Ctrl+Alt+F1 returns to the graphical environment).

# showkey

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.

2.6 kernels

Tango-view-refresh-red.pngThis article or section is out of date.Tango-view-refresh-red.png

Reason: Now we have 3.x kernel, is it still relevant? (Discuss in Talk:Extra keyboard keys#)

According to the keymap man page:

Note: In 2.6 kernels raw mode, or scancode mode, is not very raw at all. Scan codes are first translated to key codes, and when scancodes are desired the key codes are translated back...there is no guarantee at all that the final result corresponds to what the keyboard hardware did send. To change behavior back to the old raw mode, add the parameter atkbd.softraw=0 to your kernel while booting. This can be removed for later boots when the old raw functionality is not required.

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).

Mapping scancodes to keycodes

See the main article: Map scancodes to keycodes.

Mapping keycodes to keysyms

In console

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.

In Xorg

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
Note: This may work also for other Asus notebook models.

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