#!/usr/bin/perl # This is a test injection script for Linux uinput. # It can be handy working out / troubleshooting Linux uinput injection on a new device. # # Copyright (c) 2010 by Karl J. Runge # # uinput.pl is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or (at # your option) any later version. # # uinput.pl is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with uinput.pl; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA # or see . # set_constants(); # options for what injection to handle: $rel = 1; $abs = 1; $touch = 1; $allkeys = 1; # these can be set via env: $WIDTH = $ENV{WIDTH}; $WIDTH = 480 unless $WIDTH; $HEIGHT = $ENV{HEIGHT}; $HEIGHT = 640 unless $HEIGHT; $DEV = $ENV{DEV}; $DEV = "/dev/input/uinput" unless $DEV; # this fills in name and input type part of uinput_user_dev struct: $udev = "uinput.pl"; $n = 80 - length($udev); $udev .= "\0" x $n; $udev .= "\0" x 2; # bus $udev .= "\0" x 2; # vendor $udev .= "\0" x 2; # product $udev .= "\0" x 2; # version $udev .= "\0" x 4; # ff_effects_max # this fills in the abs arrays: # foreach $type (qw(absmax absmin absfuzz absflat)) { $n = $ABS_MAX + 1; for ($j = 0; $j < $n; $j++) { if ($abs && $type eq 'absmax' && $j == $ABS_X) { $udev .= pack("i", $WIDTH-1); } elsif ($abs && $type eq 'absmax' && $j == $ABS_Y) { $udev .= pack("i", $HEIGHT-1); } else { $udev .= "\0" x 4; } } } print "udev: ", length($udev) . " '$udev'\n"; $modes = $O_RDWR; $modes = $O_WRONLY | $O_NDELAY; printf("open modes: 0x%x\n", $modes); sysopen(FD, $DEV, $modes) || die "$DEV: $!"; if ($rel) { io_ctl($UI_SET_EVBIT, $EV_REL); io_ctl($UI_SET_RELBIT, $REL_X); io_ctl($UI_SET_RELBIT, $REL_Y); } io_ctl($UI_SET_EVBIT, $EV_KEY); io_ctl($UI_SET_EVBIT, $EV_SYN); for ($i=0; $i < 256; $i++) { last unless $allkeys; io_ctl($UI_SET_KEYBIT, $i); } io_ctl($UI_SET_KEYBIT, $BTN_MOUSE); io_ctl($UI_SET_KEYBIT, $BTN_LEFT); io_ctl($UI_SET_KEYBIT, $BTN_MIDDLE); io_ctl($UI_SET_KEYBIT, $BTN_RIGHT); io_ctl($UI_SET_KEYBIT, $BTN_FORWARD); io_ctl($UI_SET_KEYBIT, $BTN_BACK); if ($abs) { io_ctl($UI_SET_KEYBIT, $BTN_TOUCH) if $touch; io_ctl($UI_SET_EVBIT, $EV_ABS); io_ctl($UI_SET_ABSBIT, $ABS_X); io_ctl($UI_SET_ABSBIT, $ABS_Y); } $ret = syswrite(FD, $udev, length($udev)); print "syswrite: $ret\n"; io_ctl($UI_DEV_CREATE); fsleep(0.25); # this should show our new virtual device: # system("cat /proc/bus/input/devices 1>&2"); print STDERR "\n"; ################################################# # put in your various test injection events here: #do_key($KEY_A, 1, 0.1); #do_key($KEY_A, 0, 0.1); #do_key($KEY_POWER, 1, 0.1); #do_key($KEY_POWER, 0, 0.1); do_abs(118, 452, 0, 0.1); do_abs(110, 572, 1, 0.1); do_btn($BTN_TOUCH, 1, 0.1); do_btn($BTN_TOUCH, 0, 0.1); do_btn($BTN_MOUSE, 1, 0.1); do_btn($BTN_MOUSE, 0, 0.1); ################################################# fsleep(0.25); io_ctl($UI_DEV_DESTROY); close(FD); exit(0); sub io_ctl { my ($cmd, $val) = @_; if (defined $val) { my $ret = syscall($linux_ioctl_syscall, fileno(FD), $cmd, $val); my $err = $!; $err = '' if $ret == 0; print STDERR "io_ctl(FD, $cmd, $val) = $ret $err\n"; } else { my $ret = syscall($linux_ioctl_syscall, fileno(FD), $cmd); my $err = $!; $err = '' if $ret == 0; print STDERR "io_ctl(FD, $cmd) = $ret $err\n"; } } sub do_syn { my $ev = gtod(); $ev .= pack("S", $EV_SYN); $ev .= pack("S", $SYN_REPORT); $ev .= pack("i", 0); print STDERR "do_syn EV_SYN\n"; my $ret = syswrite(FD, $ev, length($ev)); if (!defined $ret) { print STDERR "do_syn: $!\n"; } } sub do_key { my ($key, $down, $sleep) = @_; my $ev = gtod(); $ev .= pack("S", $EV_KEY); $ev .= pack("S", $key); $ev .= pack("i", $down); print STDERR "do_key $key $down\n"; my $ret = syswrite(FD, $ev, length($ev)); if (!defined $ret) { print STDERR "do_key: $!\n"; } do_syn(); fsleep($sleep); print STDERR "\n"; } sub do_btn { my ($button, $down, $sleep) = @_; my $ev = gtod(); $ev .= pack("S", $EV_KEY); $ev .= pack("S", $button); $ev .= pack("i", $down); print STDERR "do_btn $button $down\n"; my $ret = syswrite(FD, $ev, length($ev)); if (!defined $ret) { print STDERR "do_btn: $!\n"; } do_syn(); fsleep($sleep); print STDERR "\n"; } sub do_abs { my ($x, $y, $p, $sleep) = @_; my $ev = gtod(); $ev .= pack("S", $EV_ABS); $ev .= pack("S", $ABS_Y); $ev .= pack("i", $y); print STDERR "do_abs y=$y\n"; my $ret = syswrite(FD, $ev, length($ev)); if (!defined $ret) { print STDERR "do_abs: $!\n"; } $ev = gtod(); $ev .= pack("S", $EV_ABS); $ev .= pack("S", $ABS_X); $ev .= pack("i", $x); print STDERR "do_abs x=$x\n"; $ret = syswrite(FD, $ev, length($ev)); if (!defined $ret) { print STDERR "do_abs: $!\n"; } $ev = gtod(); $ev .= pack("S", $EV_ABS); $ev .= pack("S", $ABS_PRESSURE); $ev .= pack("i", $p); print STDERR "do_abs p=$p\n"; $ret = syswrite(FD, $ev, length($ev)); if (!defined $ret) { print STDERR "do_abs: $!\n"; } do_syn(); fsleep($sleep); print STDERR "\n"; } sub do_rel { my ($dx, $dy, $sleep) = @_; my $ev = gtod(); $ev .= pack("S", $EV_REL); $ev .= pack("S", $REL_Y); $ev .= pack("i", $dy); print STDERR "do_rel dy=$dy\n"; my $ret = syswrite(FD, $ev, length($ev)); if (!defined $ret) { print STDERR "do_rel: $!\n"; } $ev = gtod(); $ev .= pack("S", $EV_REL); $ev .= pack("S", $REL_X); $ev .= pack("i", $dx); print STDERR "do_rel dx=$dx\n"; $ret = syswrite(FD, $ev, length($ev)); if (!defined $ret) { print STDERR "do_rel: $!\n"; } do_syn(); fsleep($sleep); print STDERR "\n"; } sub gtod { $tv = ("\0" x 4) x 2; # assumes long is 4 bytes. FIXME: use pack. $tz = ("\0" x 4) x 2; syscall($linux_gettimeofday_syscall, $tv, $tz); return $tv; } sub fsleep { my ($time) = @_; select(undef, undef, undef, $time) if $time; } sub set_constants { # from /usr/include/linux/uinput.h /usr/include/linux/input.h and x11vnc. # #define ABS_MAX 0x3f = 63 # # #define UINPUT_MAX_NAME_SIZE 80 # # struct input_id { # __u16 bustype; # __u16 vendor; # __u16 product; # __u16 version; # }; # # struct uinput_user_dev { # char name[UINPUT_MAX_NAME_SIZE]; # struct input_id id; # int ff_effects_max; # int absmax[ABS_MAX + 1]; # int absmin[ABS_MAX + 1]; # int absfuzz[ABS_MAX + 1]; # int absflat[ABS_MAX + 1]; # }; # #endif /* __UINPUT_H_ */ $EV_SYN = 0x00; $EV_KEY = 0x01; $EV_REL = 0x02; $EV_ABS = 0x03; $EV_MSC = 0x04; $EV_SW = 0x05; $EV_LED = 0x11; $EV_SND = 0x12; $EV_REP = 0x14; $EV_FF = 0x15; $EV_PWR = 0x16; $EV_FF_STATUS = 0x17; $EV_MAX = 0x1f; $ID_BUS = 0; $ID_VENDOR = 1; $ID_PRODUCT = 2; $ID_VERSION = 3; $BUS_PCI = 0x01; $BUS_ISAPNP = 0x02; $BUS_USB = 0x03; $BUS_HIL = 0x04; $BUS_BLUETOOTH = 0x05; $BUS_VIRTUAL = 0x06; $BUS_ISA = 0x10; $BUS_I8042 = 0x11; $BUS_XTKBD = 0x12; $BUS_RS232 = 0x13; $BUS_GAMEPORT = 0x14; $BUS_PARPORT = 0x15; $BUS_AMIGA = 0x16; $BUS_ADB = 0x17; $BUS_I2C = 0x18; $BUS_HOST = 0x19; $BUS_GSC = 0x1A; $BUS_ATARI = 0x1B; $REL_X = 0x00; $REL_Y = 0x01; $REL_Z = 0x02; $REL_RX = 0x03; $REL_RY = 0x04; $REL_RZ = 0x05; $REL_HWHEEL = 0x06; $REL_DIAL = 0x07; $REL_WHEEL = 0x08; $REL_MISC = 0x09; $ABS_X = 0x00; $ABS_Y = 0x01; $ABS_Z = 0x02; $ABS_RX = 0x03; $ABS_RY = 0x04; $ABS_RZ = 0x05; $ABS_THROTTLE = 0x06; $ABS_RUDDER = 0x07; $ABS_WHEEL = 0x08; $ABS_GAS = 0x09; $ABS_BRAKE = 0x0a; $ABS_HAT0X = 0x10; $ABS_HAT0Y = 0x11; $ABS_HAT1X = 0x12; $ABS_HAT1Y = 0x13; $ABS_HAT2X = 0x14; $ABS_HAT2Y = 0x15; $ABS_HAT3X = 0x16; $ABS_HAT3Y = 0x17; $ABS_PRESSURE = 0x18; $ABS_DISTANCE = 0x19; $ABS_TILT_X = 0x1a; $ABS_TILT_Y = 0x1b; $ABS_TOOL_WIDTH = 0x1c; $ABS_VOLUME = 0x20; $ABS_MISC = 0x28; $ABS_MT_TOUCH_MAJOR = 0x30; $ABS_MT_TOUCH_MINOR = 0x31; $ABS_MT_WIDTH_MAJOR = 0x32; $ABS_MT_WIDTH_MINOR = 0x33; $ABS_MT_ORIENTATION = 0x34; $ABS_MT_POSITION_X = 0x35; $ABS_MT_POSITION_Y = 0x36; $ABS_MT_TOOL_TYPE = 0x37; $ABS_MT_BLOB_ID = 0x38; $ABS_MT_TRACKING_ID = 0x39; #$ABS_MAX = 0x3f; $BTN_MISC = 0x100; $BTN_0 = 0x100; $BTN_1 = 0x101; $BTN_2 = 0x102; $BTN_3 = 0x103; $BTN_4 = 0x104; $BTN_5 = 0x105; $BTN_6 = 0x106; $BTN_7 = 0x107; $BTN_8 = 0x108; $BTN_9 = 0x109; $BTN_MOUSE = 0x110; $BTN_LEFT = 0x110; $BTN_RIGHT = 0x111; $BTN_MIDDLE = 0x112; $BTN_SIDE = 0x113; $BTN_EXTRA = 0x114; $BTN_FORWARD = 0x115; $BTN_BACK = 0x116; $BTN_TASK = 0x117; $BTN_JOYSTICK = 0x120; $BTN_TRIGGER = 0x120; $BTN_THUMB = 0x121; $BTN_THUMB2 = 0x122; $BTN_TOP = 0x123; $BTN_TOP2 = 0x124; $BTN_PINKIE = 0x125; $BTN_BASE = 0x126; $BTN_BASE2 = 0x127; $BTN_BASE3 = 0x128; $BTN_BASE4 = 0x129; $BTN_BASE5 = 0x12a; $BTN_BASE6 = 0x12b; $BTN_DEAD = 0x12f; $BTN_GAMEPAD = 0x130; $BTN_A = 0x130; $BTN_B = 0x131; $BTN_C = 0x132; $BTN_X = 0x133; $BTN_Y = 0x134; $BTN_Z = 0x135; $BTN_TL = 0x136; $BTN_TR = 0x137; $BTN_TL2 = 0x138; $BTN_TR2 = 0x139; $BTN_SELECT = 0x13a; $BTN_START = 0x13b; $BTN_MODE = 0x13c; $BTN_THUMBL = 0x13d; $BTN_THUMBR = 0x13e; $BTN_DIGI = 0x140; $BTN_TOOL_PEN = 0x140; $BTN_TOOL_RUBBER = 0x141; $BTN_TOOL_BRUSH = 0x142; $BTN_TOOL_PENCIL = 0x143; $BTN_TOOL_AIRBRUSH = 0x144; $BTN_TOOL_FINGER = 0x145; $BTN_TOOL_MOUSE = 0x146; $BTN_TOOL_LENS = 0x147; $BTN_TOUCH = 0x14a; $BTN_STYLUS = 0x14b; $BTN_STYLUS2 = 0x14c; $BTN_TOOL_DOUBLETAP = 0x14d; $BTN_TOOL_TRIPLETAP = 0x14e; $BTN_WHEEL = 0x150; $BTN_GEAR_DOWN = 0x150; $BTN_GEAR_UP = 0x151; $SYN_REPORT = 0; $SYN_CONFIG = 1; $SYN_MT_REPORT = 2; $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_F13 = 85; $KEY_102ND = 86; $KEY_F11 = 87; $KEY_F12 = 88; $KEY_F14 = 89; $KEY_F15 = 90; $KEY_F16 = 91; $KEY_F17 = 92; $KEY_F18 = 93; $KEY_F19 = 94; $KEY_F20 = 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_F21 = 120; $KEY_F22 = 121; $KEY_F23 = 122; $KEY_F24 = 123; $KEY_KPCOMMA = 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_INTL1 = 181; $KEY_INTL2 = 182; $KEY_INTL3 = 183; $KEY_INTL4 = 184; $KEY_INTL5 = 185; $KEY_INTL6 = 186; $KEY_INTL7 = 187; $KEY_INTL8 = 188; $KEY_INTL9 = 189; $KEY_LANG1 = 190; $KEY_LANG2 = 191; $KEY_LANG3 = 192; $KEY_LANG4 = 193; $KEY_LANG5 = 194; $KEY_LANG6 = 195; $KEY_LANG7 = 196; $KEY_LANG8 = 197; $KEY_LANG9 = 198; $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_UNKNOWN = 240; $KEY_OK = 0x160; $KEY_SELECT = 0x161; $KEY_GOTO = 0x162; $KEY_CLEAR = 0x163; $KEY_POWER2 = 0x164; $KEY_OPTION = 0x165; $KEY_INFO = 0x166; $KEY_TIME = 0x167; $KEY_VENDOR = 0x168; $KEY_ARCHIVE = 0x169; $KEY_PROGRAM = 0x16a; $KEY_CHANNEL = 0x16b; $KEY_FAVORITES = 0x16c; $KEY_EPG = 0x16d; $KEY_PVR = 0x16e; $KEY_MHP = 0x16f; $KEY_LANGUAGE = 0x170; $KEY_TITLE = 0x171; $KEY_SUBTITLE = 0x172; $KEY_ANGLE = 0x173; $KEY_ZOOM = 0x174; $KEY_MODE = 0x175; $KEY_KEYBOARD = 0x176; $KEY_SCREEN = 0x177; $KEY_PC = 0x178; $KEY_TV = 0x179; $KEY_TV2 = 0x17a; $KEY_VCR = 0x17b; $KEY_VCR2 = 0x17c; $KEY_SAT = 0x17d; $KEY_SAT2 = 0x17e; $KEY_CD = 0x17f; $KEY_TAPE = 0x180; $KEY_RADIO = 0x181; $KEY_TUNER = 0x182; $KEY_PLAYER = 0x183; $KEY_TEXT = 0x184; $KEY_DVD = 0x185; $KEY_AUX = 0x186; $KEY_MP3 = 0x187; $KEY_AUDIO = 0x188; $KEY_VIDEO = 0x189; $KEY_DIRECTORY = 0x18a; $KEY_LIST = 0x18b; $KEY_MEMO = 0x18c; $KEY_CALENDAR = 0x18d; $KEY_RED = 0x18e; $KEY_GREEN = 0x18f; $KEY_YELLOW = 0x190; $KEY_BLUE = 0x191; $KEY_CHANNELUP = 0x192; $KEY_CHANNELDOWN = 0x193; $KEY_FIRST = 0x194; $KEY_LAST = 0x195; $KEY_AB = 0x196; $KEY_NEXT = 0x197; $KEY_RESTART = 0x198; $KEY_SLOW = 0x199; $KEY_SHUFFLE = 0x19a; $KEY_BREAK = 0x19b; $KEY_PREVIOUS = 0x19c; $KEY_DIGITS = 0x19d; $KEY_TEEN = 0x19e; $KEY_TWEN = 0x19f; $KEY_DEL_EOL = 0x1c0; $KEY_DEL_EOS = 0x1c1; $KEY_INS_LINE = 0x1c2; $KEY_DEL_LINE = 0x1c3; $KEY_MAX = 0x1ff; $key_lookup{XK_Escape} = $KEY_ESC; $key_lookup{XK_1} = $KEY_1; $key_lookup{XK_2} = $KEY_2; $key_lookup{XK_3} = $KEY_3; $key_lookup{XK_4} = $KEY_4; $key_lookup{XK_5} = $KEY_5; $key_lookup{XK_6} = $KEY_6; $key_lookup{XK_7} = $KEY_7; $key_lookup{XK_8} = $KEY_8; $key_lookup{XK_9} = $KEY_9; $key_lookup{XK_0} = $KEY_0; $key_lookup{XK_exclam} = $KEY_1; $key_lookup{XK_at} = $KEY_2; $key_lookup{XK_numbersign} = $KEY_3; $key_lookup{XK_dollar} = $KEY_4; $key_lookup{XK_percent} = $KEY_5; $key_lookup{XK_asciicircum} = $KEY_6; $key_lookup{XK_ampersand} = $KEY_7; $key_lookup{XK_asterisk} = $KEY_8; $key_lookup{XK_parenleft} = $KEY_9; $key_lookup{XK_parenright} = $KEY_0; $key_lookup{XK_minus} = $KEY_MINUS; $key_lookup{XK_underscore} = $KEY_MINUS; $key_lookup{XK_equal} = $KEY_EQUAL; $key_lookup{XK_plus} = $KEY_EQUAL; $key_lookup{XK_BackSpace} = $KEY_BACKSPACE; $key_lookup{XK_Tab} = $KEY_TAB; $key_lookup{XK_q} = $KEY_Q; $key_lookup{XK_Q} = $KEY_Q; $key_lookup{XK_w} = $KEY_W; $key_lookup{XK_W} = $KEY_W; $key_lookup{XK_e} = $KEY_E; $key_lookup{XK_E} = $KEY_E; $key_lookup{XK_r} = $KEY_R; $key_lookup{XK_R} = $KEY_R; $key_lookup{XK_t} = $KEY_T; $key_lookup{XK_T} = $KEY_T; $key_lookup{XK_y} = $KEY_Y; $key_lookup{XK_Y} = $KEY_Y; $key_lookup{XK_u} = $KEY_U; $key_lookup{XK_U} = $KEY_U; $key_lookup{XK_i} = $KEY_I; $key_lookup{XK_I} = $KEY_I; $key_lookup{XK_o} = $KEY_O; $key_lookup{XK_O} = $KEY_O; $key_lookup{XK_p} = $KEY_P; $key_lookup{XK_P} = $KEY_P; $key_lookup{XK_braceleft} = $KEY_LEFTBRACE; $key_lookup{XK_braceright} = $KEY_RIGHTBRACE; $key_lookup{XK_bracketleft} = $KEY_LEFTBRACE; $key_lookup{XK_bracketright} = $KEY_RIGHTBRACE; $key_lookup{XK_Return} = $KEY_ENTER; $key_lookup{XK_Control_L} = $KEY_LEFTCTRL; $key_lookup{XK_a} = $KEY_A; $key_lookup{XK_A} = $KEY_A; $key_lookup{XK_s} = $KEY_S; $key_lookup{XK_S} = $KEY_S; $key_lookup{XK_d} = $KEY_D; $key_lookup{XK_D} = $KEY_D; $key_lookup{XK_f} = $KEY_F; $key_lookup{XK_F} = $KEY_F; $key_lookup{XK_g} = $KEY_G; $key_lookup{XK_G} = $KEY_G; $key_lookup{XK_h} = $KEY_H; $key_lookup{XK_H} = $KEY_H; $key_lookup{XK_j} = $KEY_J; $key_lookup{XK_J} = $KEY_J; $key_lookup{XK_k} = $KEY_K; $key_lookup{XK_K} = $KEY_K; $key_lookup{XK_l} = $KEY_L; $key_lookup{XK_L} = $KEY_L; $key_lookup{XK_semicolon} = $KEY_SEMICOLON; $key_lookup{XK_colon} = $KEY_SEMICOLON; $key_lookup{XK_apostrophe} = $KEY_APOSTROPHE; $key_lookup{XK_quotedbl} = $KEY_APOSTROPHE; $key_lookup{XK_grave} = $KEY_GRAVE; $key_lookup{XK_asciitilde} = $KEY_GRAVE; $key_lookup{XK_Shift_L} = $KEY_LEFTSHIFT; $key_lookup{XK_backslash} = $KEY_BACKSLASH; $key_lookup{XK_bar} = $KEY_BACKSLASH; $key_lookup{XK_z} = $KEY_Z; $key_lookup{XK_Z} = $KEY_Z; $key_lookup{XK_x} = $KEY_X; $key_lookup{XK_X} = $KEY_X; $key_lookup{XK_c} = $KEY_C; $key_lookup{XK_C} = $KEY_C; $key_lookup{XK_v} = $KEY_V; $key_lookup{XK_V} = $KEY_V; $key_lookup{XK_b} = $KEY_B; $key_lookup{XK_B} = $KEY_B; $key_lookup{XK_n} = $KEY_N; $key_lookup{XK_N} = $KEY_N; $key_lookup{XK_m} = $KEY_M; $key_lookup{XK_M} = $KEY_M; $key_lookup{XK_comma} = $KEY_COMMA; $key_lookup{XK_less} = $KEY_COMMA; $key_lookup{XK_period} = $KEY_DOT; $key_lookup{XK_greater} = $KEY_DOT; $key_lookup{XK_slash} = $KEY_SLASH; $key_lookup{XK_question} = $KEY_SLASH; $key_lookup{XK_Shift_R} = $KEY_RIGHTSHIFT; $key_lookup{XK_KP_Multiply} = $KEY_KPASTERISK; $key_lookup{XK_Alt_L} = $KEY_LEFTALT; $key_lookup{XK_space} = $KEY_SPACE; $key_lookup{XK_Caps_Lock} = $KEY_CAPSLOCK; $key_lookup{XK_F1} = $KEY_F1; $key_lookup{XK_F2} = $KEY_F2; $key_lookup{XK_F3} = $KEY_F3; $key_lookup{XK_F4} = $KEY_F4; $key_lookup{XK_F5} = $KEY_F5; $key_lookup{XK_F6} = $KEY_F6; $key_lookup{XK_F7} = $KEY_F7; $key_lookup{XK_F8} = $KEY_F8; $key_lookup{XK_F9} = $KEY_F9; $key_lookup{XK_F10} = $KEY_F10; $key_lookup{XK_Num_Lock} = $KEY_NUMLOCK; $key_lookup{XK_Scroll_Lock} = $KEY_SCROLLLOCK; $key_lookup{XK_KP_7} = $KEY_KP7; $key_lookup{XK_KP_8} = $KEY_KP8; $key_lookup{XK_KP_9} = $KEY_KP9; $key_lookup{XK_KP_Subtract} = $KEY_KPMINUS; $key_lookup{XK_KP_4} = $KEY_KP4; $key_lookup{XK_KP_5} = $KEY_KP5; $key_lookup{XK_KP_6} = $KEY_KP6; $key_lookup{XK_KP_Add} = $KEY_KPPLUS; $key_lookup{XK_KP_1} = $KEY_KP1; $key_lookup{XK_KP_2} = $KEY_KP2; $key_lookup{XK_KP_3} = $KEY_KP3; $key_lookup{XK_KP_0} = $KEY_KP0; $key_lookup{XK_KP_Decimal} = $KEY_KPDOT; $key_lookup{XK_F13} = $KEY_F13; $key_lookup{XK_F11} = $KEY_F11; $key_lookup{XK_F12} = $KEY_F12; $key_lookup{XK_F14} = $KEY_F14; $key_lookup{XK_F15} = $KEY_F15; $key_lookup{XK_F16} = $KEY_F16; $key_lookup{XK_F17} = $KEY_F17; $key_lookup{XK_F18} = $KEY_F18; $key_lookup{XK_F19} = $KEY_F19; $key_lookup{XK_F20} = $KEY_F20; $key_lookup{XK_KP_Enter} = $KEY_KPENTER; $key_lookup{XK_Control_R} = $KEY_RIGHTCTRL; $key_lookup{XK_KP_Divide} = $KEY_KPSLASH; $key_lookup{XK_Sys_Req} = $KEY_SYSRQ; $key_lookup{XK_Alt_R} = $KEY_RIGHTALT; $key_lookup{XK_Linefeed} = $KEY_LINEFEED; $key_lookup{XK_Home} = $KEY_HOME; $key_lookup{XK_Up} = $KEY_UP; $key_lookup{XK_Page_Up} = $KEY_PAGEUP; $key_lookup{XK_Left} = $KEY_LEFT; $key_lookup{XK_Right} = $KEY_RIGHT; $key_lookup{XK_End} = $KEY_END; $key_lookup{XK_Down} = $KEY_DOWN; $key_lookup{XK_Page_Down} = $KEY_PAGEDOWN; $key_lookup{XK_Insert} = $KEY_INSERT; $key_lookup{XK_Delete} = $KEY_DELETE; $key_lookup{XK_KP_Equal} = $KEY_KPEQUAL; $key_lookup{XK_Pause} = $KEY_PAUSE; $key_lookup{XK_F21} = $KEY_F21; $key_lookup{XK_F22} = $KEY_F22; $key_lookup{XK_F23} = $KEY_F23; $key_lookup{XK_F24} = $KEY_F24; $key_lookup{XK_KP_Separator} = $KEY_KPCOMMA; $key_lookup{XK_Meta_L} = $KEY_LEFTMETA; $key_lookup{XK_Meta_R} = $KEY_RIGHTMETA; $key_lookup{XK_Multi_key} = $KEY_COMPOSE; $ABS_MAX = 63; $UI_DEV_CREATE = 0x5501; $UI_DEV_DESTROY = 0x5502; $UI_SET_EVBIT = 0x40045564; $UI_SET_KEYBIT = 0x40045565; $UI_SET_RELBIT = 0x40045566; $UI_SET_ABSBIT = 0x40045567; # FIXME: time hires, etc. $linux_gettimeofday_syscall = 78; $O_RDONLY = 00; $O_WRONLY = 01; $O_RDWR = 02; $O_NDELAY = 04000; }