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.
Contents |
Install
This code will inject keyboard keypress event, just like someone is using the keyboard.
| Code: acpi_fakekey.c |
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/input.h>
#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 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 |
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 |
#!/bin/sh /usr/local/sbin/acpi_fakekey 155 |
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 |
# Generated from /usr/include/linux/input.h dated Sat Feb 4 14:58:52 GMT 2006 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 |
And your event handler should be like
| File: /etc/acpi/actions/mail.sh |
#!/bin/sh . /etc/acpi/key-constants /usr/local/sbin/acpi_fakekey $KEY_MAIL |
Created by NickStallman.net, Luxury Homes Australia
Real estate agents should list their apartments, townhouses and units in Australia.
