Joined: July 2004
||Posted: Aug. 17 2006,18:32
Using Multimedia Keys In DSL (in X)
DISCLAIMER: I can't say that this will work completely, or at all, for the
random user. I can say only that this worked for me using the default 'us'
keymap with a Logitech® Access™ keyboard.
INTRODUCTION: My keyboard has multimedia keys, which I've used in other distros
without much trouble due to the fact that scancodes for these keys had already
been implemented, so the xev program sees the keycodes which can then be used
by xmodmap. In DSL xev registers nothing when I press these keys, so apparently
the kernel does not assign keycodes to them. If you receive no events from xev
when attempting to get the keycodes for your multimedia keys, this tutorial may
help (or at the very least point you in a useful direction).
STEP 1: Find out what codes are sent by your keyboard's "special" keys.
Fortunately, for many people, this task has been made very easy by a
kind soul (Andries Brouwer) who posted his efforts online:
If your keyboard is not listed, you can get the scancodes yourself.
First, exit the X server. This next command won't run in X.
Use the command 'showkey -s' to display the scancodes you'll need for
creating keycodes. You will be asked to press one or more keys, after
which the scancodes for the pressed key(s) will be displayed. Showkey
will print 2 pairs of numbers. The first number in each pair is an
escape (0xe0), and the second are the press and release sequences sent
by the keyboard. Depending on how quickly you release, you may get two
lines beginning with 0xe0, or it may be split onto two lines.
For example, if showkey prints "0xe0 0x12 0xe0 0x92" the number for a
press event is 0xe0 0x12, which is shortened to e012 for the next step.
STEP 2: Use the command 'setkeycodes <scancode> <keycode>' to create a keycode.
The scancode is the 4-char code mentioned above (e012) and the keycode is
a number between 1-127 (in DSL). You can see which keycodes are unused
by running the command 'dumpkeys | grep =$'. You may find that you have
more keys to map than are listed by this command. At this time I'm not
sure what issues there are in setting a keycode that is already in use,
but that will hopefully be discovered and included here later.
One thing to keep in mind is that X and the kernel do not use the same
keycodes. Assigning the code with setkeycodes allows the kernel to see
the key, and it is then available to X, but you will still need to find
out what keycode is being used by X before using the keys in fluxbox or
other application that relies on keysyms.
STEP 3: Now you can return to X. As I mentioned above, X sees a different code
than the console does, so you'll need to find out what that X code is.
For that we use the xev program. Open an X terminal and run 'xev'. When
xev has focus (you may need to click the xev window), all X events will
be read and information about the events will be printed to the xterm.
Near the bottom of the info, xev shows the keycode and if there is an
associated keysym it will display that as well. Since we are working
with new keys, there will not be a keysym listed (shows "NoSymbol").
This is what we want to create so the keys can be mapped in Fluxbox.
STEP 4: Now that we know what keycode X is seeing, we can use xmodmap to assign
a keysym to that keycode. The syntax is
xmodmap -e "keycode <keycode> = <keysym>"
You can get a list of useable keysyms by running the command
grep ^XF86 /usr/X11R6/lib/X11/XKeysymDB
At this point, xev should list a keysym which can be added to your
~/.fluxbox/keys file. The next step is making it persistent.
STEP 5: In order for this to happen automatically when you boot, the commands
should be added to your startup scripts. The setkeycodes commands are
run by root, so they should be added to /opt/bootlocal.sh, one command
for each scancode. You could instead put them in ~/.bash_profile, with
"sudo" before each command. The xmodmap commands can be put in a file,
such as ~/.Xmodmap (leave out the "xmodmap -e" in this case), and then
run from ~/.xinitrc with the command 'xmodmap $HOME/.Xmodmap'.
Now you should be done. To make this task easier it might be useful to
keep a list of your keyboard's scancodes, as well as the keycodes and
keysyms that you set, so you won't need to refer to several files and
applications if this needs to be repeated in the future.
EDITS: Added URL of a useful page listing keyboard-specific scan codes.
Cleared up a little bit of the setkeycodes confusion.
TODO: Add some info on using these keys in the linux console (loadkeys?)