bradfitz / android-misc
- Source
- Commits
- Network (1)
- Issues (0)
- Downloads (0)
- Wiki (1)
- Graphs
-
Branch:
master
Brad Fitzpatrick (author)
Mon Dec 15 07:30:50 -0800 2008
android-misc / type.pl
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 1 | #!/usr/bin/perl | |
| f969642e » | Brad Fitzpatrick | 2008-12-14 | 2 | # Author: Brad Fitzpatrick <brad@danga.com>, 2008-12-14 | |
| 3 | # License: whatever. | ||||
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 4 | ||
| 5 | use strict; | ||||
| f969642e » | Brad Fitzpatrick | 2008-12-14 | 6 | use File::Temp; | |
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 7 | use Time::HiRes qw(time); | |
| 8 | |||||
| 9 | my $boot_time = boot_time(); | ||||
| 10 | |||||
| f969642e » | Brad Fitzpatrick | 2008-12-14 | 11 | my $keyboard = "/dev/input/event2"; | |
| 12 | unless (-c $keyboard) { | ||||
| 13 | require File::Temp; | ||||
| 14 | my ($fh, $filename) = File::Temp::tempfile(); | ||||
| 94f19c44 » | Brad Fitzpatrick | 2008-12-14 | 15 | unlink($filename); # race! | |
| 16 | system("mknod", $filename, "c", 13, 66) and die "mknod failed."; | ||||
| f969642e » | Brad Fitzpatrick | 2008-12-14 | 17 | $keyboard = $filename; | |
| 18 | } | ||||
| 19 | |||||
| 20 | system("stty", '-icanon', 'eol', "\001") | ||||
| 21 | and die "stty failed"; | ||||
| 22 | |||||
| 23 | open(my $fh, ">$keyboard") | ||||
| 24 | or die "Opening keyboard for write failed."; | ||||
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 25 | ||
| 26 | my %code_map = ( | ||||
| 27 | chr(127) => 14, # backspace | ||||
| 28 | "\x1b[A" => 103, # up arrow | ||||
| 29 | "\x1b[B" => 108, # down arrow | ||||
| 30 | "\x1b[C" => 105, # left arrow | ||||
| 31 | "\x1b[D" => 106, # right arrow | ||||
| 32 | "\x1b[3~" => 111, # delete | ||||
| 33 | ' ' => 57, | ||||
| 34 | from(16, "qwertyuiop{}\n"), | ||||
| 35 | from(30, "asdfghjkl;'"), | ||||
| 36 | "\\" => 43, | ||||
| 37 | from(44, "zxcvbnm,./"), | ||||
| 38 | from(2, "1234567890"), | ||||
| 39 | ); | ||||
| 40 | |||||
| 41 | sub from { | ||||
| 42 | my ($num, $letters) = @_; | ||||
| 43 | my @ret; | ||||
| 44 | foreach my $letter (split //, $letters) { | ||||
| 6b170f2a » | Brad Fitzpatrick | 2008-12-14 | 45 | push @ret, ($letter => $num++); | |
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 46 | } | |
| 47 | return @ret; | ||||
| 48 | } | ||||
| 49 | |||||
| 50 | while (1) { | ||||
| 51 | my $key = getc(STDIN); | ||||
| 52 | |||||
| 53 | if ($key eq "\033") { | ||||
| 6b170f2a » | Brad Fitzpatrick | 2008-12-14 | 54 | $key .= getc(STDIN); | |
| 55 | $key .= getc(STDIN); | ||||
| 56 | if ($key eq "\x1b[3") { | ||||
| 57 | $key .= getc(STDIN); | ||||
| 58 | } | ||||
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 59 | } | |
| 60 | |||||
| 61 | my $shift_down = 0; | ||||
| 62 | if ($key =~ /^[A-Z]$/) { | ||||
| 6b170f2a » | Brad Fitzpatrick | 2008-12-14 | 63 | $shift_down = 1; | |
| 64 | syswrite($fh, event(42, 1)); # left shift | ||||
| 65 | $key = lc($key); | ||||
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 66 | } | |
| 67 | |||||
| 68 | my $code = $code_map{$key}; | ||||
| 69 | |||||
| 70 | unless (defined $code) { | ||||
| 6b170f2a » | Brad Fitzpatrick | 2008-12-14 | 71 | if (length($key) == 1) { | |
| 72 | print "UNKNOWN KEY! key=$key, ord=", ord($key), "\n"; | ||||
| 73 | } else { | ||||
| 74 | $key =~ s/[^[:print:]]/sprintf("\\x%02x", ord($&))/eg; | ||||
| 75 | print "UNKNOWN SEQUENCE: $key\n"; | ||||
| 76 | } | ||||
| 77 | next; | ||||
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 78 | } | |
| 79 | |||||
| 80 | |||||
| 81 | syswrite($fh, event($code, 1)); | ||||
| 82 | syswrite($fh, event($code, 0)); | ||||
| 83 | |||||
| 84 | if ($shift_down) { | ||||
| 6b170f2a » | Brad Fitzpatrick | 2008-12-14 | 85 | # let it go | |
| 86 | syswrite($fh, event(42, 0)); | ||||
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 87 | } | |
| 88 | |||||
| 89 | } | ||||
| 90 | |||||
| 91 | sub event { | ||||
| 92 | my ($code, $down) = @_; | ||||
| 93 | my $event_time = time() - $boot_time; | ||||
| 94 | my $evtime_sec = int($event_time); | ||||
| 95 | my $evtime_usec = int(($event_time - $evtime_sec) * 1e9); | ||||
| 96 | return pack("LLSSl", | ||||
| 6b170f2a » | Brad Fitzpatrick | 2008-12-14 | 97 | $evtime_sec, $evtime_usec, | |
| 98 | 1, # keyboard event | ||||
| 99 | $code, | ||||
| 100 | $down); | ||||
| 24bd1bb7 » | Brad Fitzpatrick | 2008-12-14 | 101 | } | |
| 102 | |||||
| 103 | sub boot_time { | ||||
| 104 | open(my $fh, "/proc/uptime") or die; | ||||
| 105 | my $line = <$fh>; | ||||
| 106 | $line =~ s/\s.*//; | ||||
| 107 | return time() - $line; | ||||
| 108 | } | ||||
