ACPI/Map events to keyboard shortcut

Some keys, shortcut on laptop and mouse trigger ACPI events instead of standard keypress. This would make assigning shortcut a challenging task since acpi usually run as root, and you would like to launch internet browser as current log-in user. Thanks to acpi_fakekey from acpi-support[1], ACPI events can now be mapped as a keyboard shortcut.

=Install=

This code will inject keyboard keypress event, just like someone is using the keyboard.


 * Code: acpi_fakekey.c


 * 1) include 
 * 2) include 
 * 3) include 
 * 4) include 
 * 5) include 


 * 1) define TestBit(bit, array) (array[(bit) / 8] & (1 << ((bit) % 8)))

int find_keyboard { int i, j;       int fd; char filename[32]; char key_bitmask[(KEY_MAX + 7) / 8];

for (i=0; i<32; i++) { snprintf(filename,sizeof(filename), "/dev/input/event%d", i);

fd = open(filename, O_RDWR); ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask);

/* We assume that anything that has an alphabetic key in the QWERTYUIOP range in it is the main keyboard. */               for (j = KEY_Q; j <= KEY_P; j++) { if (TestBit(j, key_bitmask)) return fd; }

close (fd); }       return 0; }

int main(int argc, char** argv) { int fd; int key; struct input_event event;

if (argc == 2) { key = atoi(argv[1]); } else { return 1; }

fd = find_keyboard;

if (!fd) { return 2; }

event.type = EV_KEY; event.code = key; event.value = 1; write(fd, &event, sizeof event);

event.type = EV_KEY; event.code = key; event.value = 0; write(fd, &event, sizeof event); close (fd); return 0; }


 * Compile
 * Compile the following code with gcc.
 * gcc -o acpi_fakekey acpi_fakekey.c
 * Copy acpi_fakekey and put it in /usr/local/sbin
 * cp acpi_fakekey /usr/local/sbin

=Configuration=


 * acpid Configuration

See what acpi event is triggered and copy the event id.


 * tail -f /var/log/message
 * Or, if you use metalog
 * tail -f /var/log/everything/current

Now, press the key that will trigger acpi event and you'll get the id.
 * Code: tail -f /var/log/everything/current

[logger] ACPI event unhandled: hotkey ATKD 0000005c 00000001


 * Tip: 0000005c is ACPI event id.
 * Tip: 00000001 is the count of how many this event have been triggered.

To handle this event to send scancode 155 (mail key), create the following files.
 * File: /etc/acpi/events/mail

event=hotkey ATKD 0000005c action=/etc/acpi/actions/mail.sh &


 * File: /etc/acpi/actions/mail.sh

/usr/local/sbin/acpi_fakekey 155
 * 1) !/bin/sh


 * Restart acpid service.


 * /etc/init.d/acpid restart

=GNOME Keyboard shortcuts=

Go to System -> Preferences -> Keyboard Shortcuts. Click on E-mail and press your new mail key. The shortcut should be assigned from now on. Repeat all the process to configure other key. Miscellaneous

It may be preferable to assign a commonly used keyboard scancode to human readable form. Use the following file to simplify your event handler.
 * File: /etc/acpi/key-constants

KEY_RESERVED=0 KEY_ESC=1 KEY_1=2 KEY_2=3 KEY_3=4 KEY_4=5 KEY_5=6 KEY_6=7 KEY_7=8 KEY_8=9 KEY_9=10 KEY_0=11 KEY_MINUS=12 KEY_EQUAL=13 KEY_BACKSPACE=14 KEY_TAB=15 KEY_Q=16 KEY_W=17 KEY_E=18 KEY_R=19 KEY_T=20 KEY_Y=21 KEY_U=22 KEY_I=23 KEY_O=24 KEY_P=25 KEY_LEFTBRACE=26 KEY_RIGHTBRACE=27 KEY_ENTER=28 KEY_LEFTCTRL=29 KEY_A=30 KEY_S=31 KEY_D=32 KEY_F=33 KEY_G=34 KEY_H=35 KEY_J=36 KEY_K=37 KEY_L=38 KEY_SEMICOLON=39 KEY_APOSTROPHE=40 KEY_GRAVE=41 KEY_LEFTSHIFT=42 KEY_BACKSLASH=43 KEY_Z=44 KEY_X=45 KEY_C=46 KEY_V=47 KEY_B=48 KEY_N=49 KEY_M=50 KEY_COMMA=51 KEY_DOT=52 KEY_SLASH=53 KEY_RIGHTSHIFT=54 KEY_KPASTERISK=55 KEY_LEFTALT=56 KEY_SPACE=57 KEY_CAPSLOCK=58 KEY_F1=59 KEY_F2=60 KEY_F3=61 KEY_F4=62 KEY_F5=63 KEY_F6=64 KEY_F7=65 KEY_F8=66 KEY_F9=67 KEY_F10=68 KEY_NUMLOCK=69 KEY_SCROLLLOCK=70 KEY_KP7=71 KEY_KP8=72 KEY_KP9=73 KEY_KPMINUS=74 KEY_KP4=75 KEY_KP5=76 KEY_KP6=77 KEY_KPPLUS=78 KEY_KP1=79 KEY_KP2=80 KEY_KP3=81 KEY_KP0=82 KEY_KPDOT=83 KEY_103RD=84 KEY_ZENKAKUHANKAKU=85 KEY_102ND=86 KEY_F11=87 KEY_F12=88 KEY_RO=89 KEY_KATAKANA=90 KEY_HIRAGANA=91 KEY_HENKAN=92 KEY_KATAKANAHIRAGANA=93 KEY_MUHENKAN=94 KEY_KPJPCOMMA=95 KEY_KPENTER=96 KEY_RIGHTCTRL=97 KEY_KPSLASH=98 KEY_SYSRQ=99 KEY_RIGHTALT=100 KEY_LINEFEED=101 KEY_HOME=102 KEY_UP=103 KEY_PAGEUP=104 KEY_LEFT=105 KEY_RIGHT=106 KEY_END=107 KEY_DOWN=108 KEY_PAGEDOWN=109 KEY_INSERT=110 KEY_DELETE=111 KEY_MACRO=112 KEY_MUTE=113 KEY_VOLUMEDOWN=114 KEY_VOLUMEUP=115 KEY_POWER=116 KEY_KPEQUAL=117 KEY_KPPLUSMINUS=118 KEY_PAUSE=119 KEY_KPCOMMA=121 KEY_HANGUEL=122 KEY_HANJA=123 KEY_YEN=124 KEY_LEFTMETA=125 KEY_RIGHTMETA=126 KEY_COMPOSE=127 KEY_STOP=128 KEY_AGAIN=129 KEY_PROPS=130 KEY_UNDO=131 KEY_FRONT=132 KEY_COPY=133 KEY_OPEN=134 KEY_PASTE=135 KEY_FIND=136 KEY_CUT=137 KEY_HELP=138 KEY_MENU=139 KEY_CALC=140 KEY_SETUP=141 KEY_SLEEP=142 KEY_WAKEUP=143 KEY_FILE=144 KEY_SENDFILE=145 KEY_DELETEFILE=146 KEY_XFER=147 KEY_PROG1=148 KEY_PROG2=149 KEY_WWW=150 KEY_MSDOS=151 KEY_COFFEE=152 KEY_DIRECTION=153 KEY_CYCLEWINDOWS=154 KEY_MAIL=155 KEY_BOOKMARKS=156 KEY_COMPUTER=157 KEY_BACK=158 KEY_FORWARD=159 KEY_CLOSECD=160 KEY_EJECTCD=161 KEY_EJECTCLOSECD=162 KEY_NEXTSONG=163 KEY_PLAYPAUSE=164 KEY_PREVIOUSSONG=165 KEY_STOPCD=166 KEY_RECORD=167 KEY_REWIND=168 KEY_PHONE=169 KEY_ISO=170 KEY_CONFIG=171 KEY_HOMEPAGE=172 KEY_REFRESH=173 KEY_EXIT=174 KEY_MOVE=175 KEY_EDIT=176 KEY_SCROLLUP=177 KEY_SCROLLDOWN=178 KEY_KPLEFTPAREN=179 KEY_KPRIGHTPAREN=180 KEY_F13=183 KEY_F14=184 KEY_F15=185 KEY_F16=186 KEY_F17=187 KEY_F18=188 KEY_F19=189 KEY_F20=190 KEY_F21=191 KEY_F22=192 KEY_F23=193 KEY_F24=194 KEY_PLAYCD=200 KEY_PAUSECD=201 KEY_PROG3=202 KEY_PROG4=203 KEY_SUSPEND=205 KEY_CLOSE=206 KEY_PLAY=207 KEY_FASTFORWARD=208 KEY_BASSBOOST=209 KEY_PRINT=210 KEY_HP=211 KEY_CAMERA=212 KEY_SOUND=213 KEY_QUESTION=214 KEY_EMAIL=215 KEY_CHAT=216 KEY_SEARCH=217 KEY_CONNECT=218 KEY_FINANCE=219 KEY_SPORT=220 KEY_SHOP=221 KEY_ALTERASE=222 KEY_CANCEL=223 KEY_BRIGHTNESSDOWN=224 KEY_BRIGHTNESSUP=225 KEY_MEDIA=226 KEY_VIDEOOUT=227 KEY_UNKNOWN=240 KEY_LOCK=$KEY_COFFEE KEY_LIGHT=$KEY_F19 KEY_ROTATESCREEN=$KEY_F21 KEY_VIDEOMODECYCLE=$KEY_F22 KEY_PRESENTATION=$KEY_F23 KEY_BATTERY=236
 * Generated from /usr/include/linux/input.h dated Sat Feb 4 14:58:52 GMT 2006

And your event handler should be like
 * File: /etc/acpi/actions/mail.sh

. /etc/acpi/key-constants /usr/local/sbin/acpi_fakekey $KEY_MAIL
 * 1) !/bin/sh


 * Retrieved from "http://www.gentoo-wiki.info/ACPI/Map_events_to_keyboard_shortcut"