Extra keyboard keys

From ArchWiki
Revision as of 00:51, 10 January 2010 by Abijr (Talk | contribs)

Jump to: navigation, search

Template:I18n links start Template:I18n entry Template:I18n entry Template:I18n links end


Many keyboards include some "special keys" (also called hotkeys), 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's why we need to map the keys to actions. There are two ways of doing that:

  • The universal way using HAL and Xorg utilities (and eventually your desktop environment tools)
  • The quicker way using a third-party program to do everything in GUI

Contrary to what you may think the first method is preferred as HAL and Xorg are more universal than any third-party program could ever claim to be.

If you don't have time and just want the keys to work there are 2 cases:

  • You use Gnome:

Everything can be done from the Control Center.

  • You use KDE or an other environment that doesn't support kernel-level extra keys detection:

Use a third-party program, preferably keytouch.

The Arch way


Before starting you need to learn some vocabulary ...

A scancode is the lowest identification number for a key. If a key doesn't have a scancode then we can't do anything because it means that the kernel doesn't 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: Map scancodes

If you use HAL the most part of your keys should already have a keycode. If not, think about helping the community by expanding the database.

The diagnosis

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+F1.

$ showkey

and try to push your hotkeys. If a keycode appears the key is mapped, if not it can mean either that the kernel doesn't see the key or that the key is not mapped.

Using xev

Another way to get the keycodes of your keys is to use the graphical X program "xev" (without having to switch to a console environment). 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 doesn't see that key or that it is not mapped.


If all your keys have a keycode you can go directly to the second step.

If not keep reading below:

Know if a key has a scancode

If a key doesn't 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 doesn't have a scancode which means that it is not recognized by the kernel so it cannot be used.

Map scancodes to keycodes

See the detailed article: Map scancodes to keycodes.

Step 2: Map keycodes

In Console

When we are in console, we can use our hotkeys to print a certain character. Moreover we can also print a sequence of characters and some escape sequences. Thus, if we print the sequence of characters constituting a command and afterwards an escape character for a new line, that command will be executed!

See the detailed article: Extra Keyboard Keys in Console.

In Xorg

When we are in a graphical environment we may want a key to print a special character or execute a command. There are many ways of doing that and they are covered in a dedicated article: Extra Keyboard Keys in Xorg.

The quick way

In Gnome

If you use Gnome everything can be done from the Control Center. However if you decide to change for another Desktop Environment you'll have to re-configure your keys.

In Xmonad

If you use Xmonad as a stand alone window manager, you can edit the xmonad.hs to add unbinded keyboard keys. You just need to find the Xf86 name of the key (such as XF86PowerDown) and look it up in /usr/include/X11/XF86keysym.h it will give you a keycode like 0x1008FF2A. than using that keycode you can just add a line like the following in the keybindings section of your xmonad.hs

((0,               0x1008FF2A), spawn "sudo pm-suspend")

In other desktops environments

In desktop environments that can't read scancodes and/or keycodes you can use one of the following third-party softwares:


KeyTouch is a program which allows you to easily configure the extra function keys of your keyboard. This means that you can define, for every individual function key, what to do if it is pressed.

See the detailed article: keytouch.


Template:Box Note Lineak is a utility designed to enable the use and configuration of internet, easy access and multimedia keys.


Asus M series

I think it'll be work in another series with Asus product of laptops. How to make work multimedia keys on Arch? And disable light sensor? It's very simple, login as root, edit:

$ /etc/rc.local

add only one line:

$ echo 0 > /sys/devices/platform/asus-laptop/ls_switch

It's all, regads. See the detailed article: lineak.