Gentoo Wiki ArchivesGentoo Wiki

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
 


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
 
#!/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
  
Retrieved from "http://www.gentoo-wiki.info/ACPI/Map_events_to_keyboard_shortcut"

Last modified: Thu, 28 Aug 2008 13:44:00 +1000 Hits: 6,904

Created by NickStallman.net, Luxury Homes Australia
Real estate agents should list their apartments, townhouses and units in Australia.