Hack 28. Heat Up Your Keyboard with Hotkeys


keys on your keyboard.Hotkeys is a bit antique
these days, so it
doesn't support all the modern keyboards. But if you
are willing to put in some effort, you can get a decent experience
from Hotkeys, especially if your keyboard is supported. If your
keyboard is not supported, it might take more work than it is worth
to you, and you might want to skip ahead to the more modern LinEAK
[Hack #29] .First, you must install Hotkeys; you can use your distributions
package manager or download and compile it yourself. If your Linux
distribution doesn't have a package available, you
can find RPM packages for various distributions at http://rpm.pbone.net/index.php3?stat=3&search=hotkeys&srodzaj=3,
or you can search http://rpmfind.net. Just as an example, if
you use Debian, get the packages with this command (logged in as
root):
# apt-get install hotkeys xosd-binBy installing xosd-bin at the same time you can
take advantage of one of the better features of Hotkeys: the
attractive use of on-screen display (Figure 4-1).
If you compile hotkeys yourself, be sure to also install the XOSD and
XOSD development programs [Hack #26] to take advantage of this
feature.
Figure 4-1. The Hotkeys on-screen volume display

the default configuration to your personal configuration file. The
default configuration file is usually saved as
/etc/hotkeys.conf. You want to create a copy of
this file in your home directory, and personalize it to work with
your keyboard and perform the actions you want performed when you
press the special keys on your keyboard:
$ mkdir ~/.hotkeysNow look to see which keyboards are supported by default:
$ cp /etc/hotkeys.conf ~/.hotkeys
$ hotkeys -LThis isn't a terribly impressive list, but if your
Supported keyboards: (with corresponding options to --kbd-list or -l)
mx2500 - Memorex MX2500 Keyboard
kbp8993 - Chicony KBP-8993 keyboard
sk2500 - Fujitsu/Logitech/Trust SK2500 Keyboard / Liteon-ak2500
sk2505 - SK-2505 Keyboard
sk2800c - SK-2800C
ibook - iBook Internal Keyboard
mx1998 - Memorex MX1998 Keyboard
sk2501a - Silitek SK5210A Keyboard
msnatpro - Microsoft Natural Keyboard Pro
msnet - Microsoft Internet Keyboard
logitech-cfo - Logitech Cordless Freedom Optical Keyboard
polypix - Polypix Keyboard
sk7100 - Silitek SK7100 Keyboard
itouch - Logitech Cordless iTouch/Internet/Cordless Desktop
hp5181 - HP 5181 Internet Keyboard
msnetpro - Microsoft Internet Pro Keyboard
acerwl - Acer Wireless Keyboard
btc9000 - BTC 9000
orktekusb - ORKTEK USB Hub/keyboard
kb9930 - IBM Rapid Access II Keyboard
mck800 - Process MCK-800
kb9963 - Compaq KB-9963 keyboard
pb5140w - Packerd Bell Model 5140W
mx3000 - Memorex MX3000 Keyboard
sk9925 - Silitek SK-9925 USB Keyboard
keyboard is there, you're all set. If your keyboard
isn't listed, you can use one of the existing Hotkey
keyboard definitions as a template to create a new keyboard
definition. For example, to create a definition for the Logitech
Elite keyboard, log in as root and run these commands:
# cd /usr/share/hotkeysNow you need to find out what the keycodes are for the Logitech Elite
# cp itouch.def lelite.def
keyboard and adjust the definitions in the file. This is the hardest
part of the process. The best way to discover what keycodes your
special keys generate is to execute the following command within an X
terminal:
$ xevYou will see a small window appear with a box inside it. Click the
window to make sure it's active. Now press the
various special keys on your keyboard. As you press each key,
information about that key should appear in the terminal from which
you launched xev. If you press a special key and
nothing appears on the X terminal where you started
xev, you won't be able to
assign that key to an action. Also, if you see a result that looks
something like this, you probably won't be able to
assign that key to an action:
KeymapNotify event, serial 30, synthetic NO, window 0x0,However, if you see a result that looks something like the following,
keys: 4294967222 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0
ButtonRelease event, serial 30, synthetic NO, window 0x1400001,
root 0xb6, subw 0x1400002, time 2414137, (35,22), root:(1053,797),
state 0x200, button 2, same_screen YES
you're in luck:
KeyPress event, serial 27, synthetic NO, window 0x1400001,In this example, your keypress generated a keycode of 162. Jot down
root 0xb6, subw 0x1400002, time 31223, (44,18), root:(1085,771),
state 0x0, keycode 162 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x1400001,
root 0xb6, subw 0x1400002, time 31447, (44,18), root:(1085,771),
state 0x0, keycode 162 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
that keycode and make a note of which key generated it. In the case
of the Logitech Elite keyboard, the Play key generates keycode 162.Given all I could find out about the Logitech Elite keyboard, here is
an abbreviated version of the
/usr/share/hotkeys/lelite.def definition file I
re-created from the original itouch.def file:
<?xml version="1.0"?>Notice that some definitions begin with userdef.
<definition>
<config model="Logitech Elite Keyboard">
<Favorites keycode="230"/>
<Shopping keycode="148"/>
<PrevTrack keycode="144"/>
<Play keycode="162"/>
<Stop keycode="164"/>
<NextTrack keycode="153"/>
<VolUp keycode="176" adj="2"/>
<VolDown keycode="174" adj="2"/>
<Mute keycode="160"/>
<Email keycode="236"/>
<Search keycode="136"/>
<Sleep keycode="223"/>
<Go keycode="233"/>
<!-- Media keycode="129"/ -->
<userdef keycode="129" command="/usr/bin/eject">Eject</userdef>
<!-- My Home keycode="130 -->
<userdef keycode="130" command="/usr/bin/xfe">Home</userdef>
<!-- Go keycode="233" -->
<userdef keycode="233" command="/usr/bin/firefox -remote openURL( )"></userdef>
</config>
<contributor>
<name>nicholas petreley</name>
<email>nicholas at petreley dot com</email>
</contributor>
</definition>
Hotkeys is very strict about the names you define for the available
keys on the keyboard. Hotkeys simply refuses to recognize some key
names, and therefore you cannot associate those names with a keycode.
You can get around the problem by creating a user-defined key
definition. In the case of the Logitech Elite keyboard, there is a
Media key, a My Home key, and a Go key (among others undefined by
Hotkeys). I added these keys along with their functions to the
/usr/share/hotkeys/lelite.def file using the
Hotkeys userdef command:
<!-- Media keycode="129"/ -->Now you're ready to edit the
<userdef keycode="129" command="/usr/bin/eject">Eject</userdef>
<!-- My Home keycode="130 -->
<userdef keycode="130" command="/usr/bin/xfe">Home</userdef>
<!-- Go keycode="233" -->
<userdef keycode="233" command="/usr/bin/firefox -remote openURL( )"></userdef>
~/.hotkeys/hotkeys.conf file to define the
actions Hotkeys will take when you press certain special keys. Here
is a sample configuration:
### Specify the default keyboard (without the .def extension) so youSome of the actions are simple. The Email key starts the Thunderbird
### don't need to specify -t every time
Kbd=lelite
CDROM=/dev/cdroms/cdrom0
# PrevTrack=xmms --rew
# Play=xmms --play-pause
# Stop=xmms --stop
# Pause=xmms --pause
# NextTrack=xmms --fwd
# Rewind=
WebBrowser=firefox
Email=thunderbird
Calculator=xcalc
FileManager=gentoo
MyComputer=gentoo
MyDocuments=gentoo
Favorites=firefox
Shell=aterm
ScreenSaver=xscreensaver-command -activate
NewsReader=thunderbird -news
Communities=firefox -remote 'openURL(http://slashdot.org,new-tab)'
Search=firefox -remote 'openURL(http://www.google.com,new-tab)'
Idea=firefox -remote 'openURL(http://sourceforge.net,new-tab)'
Shopping=firefox -remote 'openURL(http://thinkgeek.com,new-tab)'
Go=firefox -remote 'openURL( )'
Print=lp
osd_font=-adobe-helvetica-bold-r-normal-*-*-240-*-*-p-*-*-*
osd_color=LawnGreen
osd_timeout=3
osd_position=bottom
osd_offset=25
program, so all you need in the file is the line
Email=thunderbird. Other definitions require more
complex actions, such as opening a new tab in a web browser (if one
is already running) and pointing it to a specific web page.The key definition is Kbd=lelite, which tells
Hotkeys which keyboard definition file to use. In this case, it
instructs Hotkeys to use
/usr/share/hotkeys/lelite.def.I confess that most of the keys listed in the configuration file do
not exist on the Logitech Elite keyboard, so the definitions are
useless. But it's sufficient for my tastes as it
enables my keyboard to control the volume, play audio CDs, launch
Firefox, and open Google in a browser tab. If you have a keyboard
that is officially supported, you can do a lot more.