How to get special keys to work

From ThinkWiki
Revision as of 13:25, 26 May 2006 by Hmh (Talk | contribs) (ibm-acpi events: Add native ACPI events for fn+f4. Still missing those for fn+f12 (T43 2687 doesn't generate them))
Jump to: navigation, search

Overview

key standard function tools supporting key1 configurability2 remarks
Fn - xmodmap, tpb full on release without completed key combination
FnF1 - ibm-acpi full
FnF2 lock screen ibm-acpi full in models from T/X/Z 60 onwards
FnF3 blank screen ibm-acpi, thinkpad-acpi full
FnF4 suspend to ram ibm-acpi, thinkpad-acpi full may generate ACPI event when not enabled in the ibm-acpi hotkey mask
FnF5 switch bluetooth ibm-acpi, thinkpad-acpi full in models starting from 2002
FnF6 - ibm-acpi full
FnF7 switch display ibm-acpi, thinkpad-acpi, tpb additional actions
FnF8 toggle display expansion ibm-acpi, thinkpad-acpi, tpb additional actions
FnF9 eject from dock ibm-acpi, thinkpad-acpi full
FnF10 - ibm-acpi full
FnF11 - ibm-acpi full
FnF12 hibernate ibm-acpi, thinkpad-acpi full may generate ACPI event when not enabled in the ibm-acpi hotkey mask
FnPos1 brightness up ibm-acpi, tpb additional actions
FnEnd brightness down tpb additional actions
FnPageUp toggle thinklight tpb additional actions
FnSpace toggle zoom tpb full
FnIns - ibm-acpi full
FnDel - ibm-acpi full
FnBackspace - ibm-acpi full
NumLock - xmodmap make working
Windows - xmodmap remapping
Access IBM or ThinkPad help application tpb full
Home open web browser xmodmap, tpb full only A30, A30p, A31, A31p and ext. keyboards
Search open search application xmodmap, tpb full only A30, A30p, A31, A31p and ext. keyboards
Mail open mail application xmodmap, tpb full only A30, A30p, A31, A31p and ext. keyboards
Favorites open favorites xmodmap, tpb full only A30, A30p, A31, A31p and ext. keyboards
Reload reload web page xmodmap, tpb full only A30, A30p, A31, A31p and ext. keyboards
Abort abort loading page xmodmap, tpb full only A30, A30p, A31, A31p and ext. keyboards
Backward previous page xmodmap, tpb full ext. keyboards and ThinkPads starting from 2002
Forward next page xmodmap, tpb full ext. keyboards and ThinkPads starting from 2002
Volume up volume up tpb additional actions
Volume down volume down tpb additional actions
Volume mute mute volume tpb additional actions
Power shutdown ibm-acpi full triggered on pressing 3secs, but notebook goes off on 5sec press
Display lid blank screen ibm-acpi full
Ultrabay lid announce ultrabay change ibm-acpi full
Dock eject eject from dock ibm-acpi full
Tablet power shutdown ibm-acpi full triggered on pressing 3secs, but notebook goes off on 5sec press
Tablet orientation rotates screen setkeycodes full
Tablet shortcut shortcut menu setkeycodes full
Tablet Esc esc key setkeycodes full
Tablet Enter enter key setkeycodes full
Tablet Up up key setkeycodes full
Tablet Down down key setkeycodes full
Tablet (unlabeled) down key setkeycodes full

Triggering key events

ibm-acpi events

Some of the following events require a # echo enable,0xffff >/proc/acpi/ibm/hotkey in order to make acpi able to get information on them. These events can be used to configure acpid.

events triggered by ibm-acpi for /etc/acpi/events files.
key event
FnF1 ibm/hotkey HKEY 00000080 00001001
FnF2 ibm/hotkey HKEY 00000080 00001002
FnF3 ibm/hotkey HKEY 00000080 00001003
FnF4 ibm/hotkey HKEY 00000080 00001004
FnF5 ibm/hotkey HKEY 00000080 00001005
FnF6 ibm/hotkey HKEY 00000080 00001006
FnF7 ibm/hotkey HKEY 00000080 00001007
FnF8 ibm/hotkey HKEY 00000080 00001008
FnF9 ibm/hotkey HKEY 00000080 00001009
FnF10 ibm/hotkey HKEY 00000080 0000100a
FnF11 ibm/hotkey HKEY 00000080 0000100b
FnF12 ibm/hotkey HKEY 00000080 0000100c
FnBackspace ibm/hotkey HKEY 00000080 0000100d
FnIns ibm/hotkey HKEY 00000080 0000100e
FnDel ibm/hotkey HKEY 00000080 0000100f
FnPos1 ibm/hotkey HKEY 00000080 00001010
Power button/power PWRF 00000080 xxxxxxxx
Display lid button/lid LID 00000080 xxxxxxxx
Ultrabay eject ibm/bay MSTR 00000003 00000000
Ultrabay inserted ibm/bay MSTR 00000001 00000000
Dock eject ibm/dock GDCK 00000003 00000001

Pure ACPI events

A few keys can generate ACPI events of their own on certain ThinkPads, as long as they are masked off in the ibm-acpi hotkey's mask (or the hotkey feature is disabled in ibm-acpi).

If you want the ThinkPad's BIOS and ACPI methods to know about these keys being pressed, you probably want to leave them masked out from ibm-acpi, and use their non-HKEY events listed below, instead.

events triggered by ACPI when hotkey is masked out or disabled.
key event
FnF4 button/sleep SLPB 00000080 00000001
FnF12
FIXME
unknown

tpb configuration

configuration keywords for tpb (to put in /etc/tpbrc)
key config keyword
Access IBM or ThinkPad THINKPAD
Home HOME
Search SEARCH
Mail MAIL
Favorites FAVORITES
Reload RELOAD
Abort ABORT
Backward BACKWARD
Forward FORWARD
Fn FN
FnSpace CALLBACK (zoom on/off)
FnPageUp CALLBACK (thinklight on/off)
FnF7 CALLBACK (display lcd/crt/both)
FnF8 CALLBACK (expand on/off)
FnHome CALLBACK (brightness <percent>)
FnEnd CALLBACK (brightness <percent>)
Volume up CALLBACK (volume <percent>)
Volume down CALLBACK (volume <percent>)
Volume mute CALLBACK (mute on/off)

To all parameter keywords should be assigned the full path to the executables supposed to be started on key press. The exectable provided for the CALLBACK keyword should take the parameters given in parentheses and act according to them. If you want to use xmodmap for the HOME, SEARCH, MAIL, FAVORITES, RELOAD, ABORT, BACKWARD, FORWARD and FN keys you should provide a XEVENTS=off in your /etc/tpbrc.

For Debian users, tpb is started from /etc/X11/Xsession.d/90tpb.

xmodmap configuration

xmodmap enables you to edit the modifier map and keymap tables that are used to translate keycodes into keysyms. Understood? Well, basically it allows you to give the X server a dictionary for the translation of keycodes like "97" into more human readable synonyms like "Home". This way xmodmap allows you to make the special keys of your keyboard known to X applications.

To discover the keycode that a certain keypress produces, use the tool $ xev

Usually you should write your keycode-keysym associations into the file ~/.Xmodmap. This file is usually read by the X session startup scripts of your system, so that the mappings automatically get included everytime you run the X server.

The ~/.Xmodmap lines for our purpose are in the form of

keycode <keycode> = <keysym>

Load the assocation using the command

$ xmodmap ~/.Xmodmap

(some configurations do this automatically upon X startup).

The following table shows the keycodes generated by the ThinkPad special keys and sensible keysyms to assign them to.

keycodes and recommended keysyms
key keycode keysym
Backward 234 XF86Back or F19
Forward 233 XF86Forward or F20
Home 178 XF86HomePage
Search 229 XF86Search
Mail 236 XF86Mail
Favorites 230 XF86AddFavorite or XF86Favorites
Reload 231 XF86Reload
Abort 232 XF86Stop
Fn 227 F35


Note: if you are running tpb you might need to add the line XEVENTS=off into your tpbrc to stop it from grabbing the key events and allow them to get through to X instead.

Note: XF86Forward and XF86Back do not work correctly in Firefox. You may want to map them to F19 and F20 instead if you use Firefox.

Using Caps Lock as Super L (Windows key)

You can easily use Caps Lock as Win key by adding the following in your ~/.Xmodmap:

       ! No Caps Lock
       clear lock
       ! Caps Lock as Win key
       add mod4 = Caps_Lock
NumLock

On the ThinkPad X21, T21, T30, X31, T43, R51 and possibly other models, X does not recognize the keycode for NumLk = Shift+ScrLk. To fix this, add the following to ~/.Xmodmap or /etc/X11/Xmodmap and run xmodmap as described before:

keycode 77 = Num_Lock

Mapping keys with setkeycodes

You can use the setkeycodes command to remap certain keys. I.e. you can use # setkeycodes 6e 109 6d 104 69 28 6b 1 to map the Tablets Up and Down keys to the standard PageUp and PageDown keys and Tablet Escape and Enter to their respective keys.

The following table shows the keycodes generated by the ThinkPad keys.

keycodes
key keycode
Tablet orientation 0x6d
Tablet Shortcut 0x6e
Tablet Esc 0x6b
Tablet Enter 0x69
Tablet Up 0x68
Tablet Down 0x6c
Tablet (unlabeled) 0x67

Example Applications

Web Browsers

Firefox

To have firefox make use of the browser keys you need to modify one of its files3. To do this you will first need to extract it from the browser.jar archive. Do...

# cd <firefox-directory>/chrome
# unzip browser.jar

The file of interest is content/browser/browser.xul. Edit it...

# vi content/browser/browser.xul

Look for the <keyset id="mainKeyset"> section and add the following lines within...

<key id="goBackKb" keycode="VK_F19" command="Browser:Back" />
<key id="goForwardKb" keycode="VK_F20" command="Browser:Forward" />

Now save the file and repackage the browser.jar archive...

# zip -rD0 browser.jar content/browser/

That's it.

Hint:
Another interesting Page on Firefox is http://dqd.com/~mayoff/notes/thinkpad/dqdnavkeys/ It uses different key mappings (F19 resp. F20) but a ready .xpi is provided which is pretty comfortable. However, this xpi file does not install on Firefox 1.5.
Hint:
You can also use the keyconfig extension to configure custom keys. This extension works with Firefox 1.5.

Konqueror

KDE allows you set key mappings for KDE applications (Go to KMenu > System > Control Center > Regional & Accessibility > Keyboard Shortcuts). By default (at least in KDE 3.5), XF86Back and XF86Forward are set as alternatives to Alt-Left and Alt-Right, and are mapped to KDE Back and Forward navigation actions.

If you use Konqueror as your only browser, you only need to set up ~/.Xmodmap as described above to assign ThinkPad back/forward keys to the symbols XF86Back/XF86Forward. This also make these keys work for other KDE applications such as Quanta Plus, KPackage and so on (not all KDE applications honor this setting, e.g. KDE help system doesn't).

If you want to use Firefox, however, the above settings do not work. You will have to map ThinkPad back/forward keys to F19/F20 as described above, and change KDE navigation key settings to use F19/F20 instead of the default.

Opera

However this isn't a simple configration file, you can set your browser manually.
Go to Tool > Settings > Mouse and keyboard > Keyboard settings > Edit > Browser Window. There add F19 - Back and F20 - Forward. Now you can surf using your TP keys ;-)

Window Managers

fvwm

To get the Forward and Backward keys to cycle through pages in the virtual desktop, add this to your ~/.fvwmrc:

Key    XF86Back     A      A   Scroll     -100000   0
Key    XF86Forward  A      A   Scroll     +100000   0

If you use multiple virtual desktops, you could instead use the keys to flip between them by using GotoDesk.

fluxbox

To get the keys to cycle through pages in the virtual desktop, add this to your ~/.fluxbox/keys:

None F19 :PrevWorkspace
None F20 :NextWorkspace

pekwm configuration

You can make the two browser keys switch workspaces in pekwm, by adding the following two lines to the ~/.pekwm/keys file:

KeyPress = "Mod1 XF86Back" { Actions = "GoToWorkspace prev" }
KeyPress = "Mod1 XF86Forward" { Actions = "GoToWorkspace next" }

pwm

Another example how to use these two keys to switch between pwm tabs. These two lines should be added to ~/.pwm/keys-default.conf or /etc/pwm/keys-default.conf:

kbind "Back", "switch_rot", -1
kbind "Forward", "switch_rot", 1

icewm

Some applications use CtrlLeft and CtrlRight to set the cursor to the beginning of the previous / next word. In icewm, though, they're bound to previous / next workspace. Change these two options in ~/.icewm/preferences to bind those to Forward and Backward: (Provided you assigned keysyms F19 and F20 with xmodmap)

# "Previous workspace" shortcut
KeySysWorkspacePrev="F19"
# "Next workspace" shortcut
KeySysWorkspaceNext="F20"

Other Uses

Console tools configuraton

To make the Forward and Backward keys useful in console, add this to your keymap (/etc/console/boottime.kmap.gz in Debian):

keycode 158 = Decr_Console
keycode 159 = Incr_Console

External Sources


FOOTNOTES [Δ]
  1. if there are more than one tool listed, one is sufficient
  2. 'full' means you can completely reassign any action to be triggered by the key, 'additional actions' means you can trigger actions in addition to the standard function of the key, which can not be changed.
  3. Thanks go to Ryan Barrett for writing the little howto on his blog.