You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libtdevnc/x11vnc/misc/uinput.pl

947 lines
27 KiB

#!/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 <runge@karlrunge.com>
#
# 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 <http://www.gnu.org/licenses/>.
#
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;
}