mikshaw
Group: Members
Posts: 4856
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: http://homepages.cwi.nl/~aeb/linux/kbd/scancodes.html 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?)
-------------- http://www.tldp.org/LDP/intro-linux/html/index.html
|