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.
114 lines
2.2 KiB
114 lines
2.2 KiB
20 years ago
|
#!/bin/sh -- # A comment mentioning perl
|
||
|
eval 'exec perl -S $0 ${1+"$@"}'
|
||
|
if 0;
|
||
|
#
|
||
|
# vcinject.pl: simple hack to inject keystrokes into Linux VC tty.
|
||
|
# See LinuxVNC.c for a more careful treatment using C and public API.
|
||
|
#
|
||
|
# Usage: vcinject.pl <N> (or /dev/ttyN)
|
||
|
#
|
||
|
# This is an example x11vnc -pipeinput program E.g.:
|
||
|
#
|
||
|
# x11vnc -rawfb map:/dev/fb0@1024x768x16 -pipeinput "vcinject.pl /dev/tty3"
|
||
|
#
|
||
|
# (see fbset(8) for obtaining fb info).
|
||
|
#
|
||
|
# It reads lines like this from STDIN:
|
||
|
#
|
||
|
# Keysym <id> <down> <n> <Keysym> ...
|
||
|
#
|
||
|
# <id> is ignored, it uses the rest to deduce the keystrokes to send
|
||
|
# to the console.
|
||
|
#
|
||
|
|
||
|
$tty = shift;
|
||
|
$tty = "/dev/tty$tty" if $tty =~ /^\d+$/;
|
||
|
|
||
|
warn "strange tty device: $tty\n" if $tty !~ m,^/dev/tty\d+$,;
|
||
|
|
||
|
open(TTY, ">$tty") || die "open $tty: $!\n";
|
||
|
$fd = fileno(TTY);
|
||
|
|
||
|
$linux_ioctl_syscall = 54; # common knowledge, eh? :-)
|
||
|
$TIOCSTI = 0x5412;
|
||
|
|
||
|
%Map = qw(
|
||
|
Escape 27
|
||
|
Tab 9
|
||
|
Return 13
|
||
|
BackSpace 8
|
||
|
Home 1
|
||
|
End 5
|
||
|
Up 16
|
||
|
Down 14
|
||
|
Right 6
|
||
|
Left 2
|
||
|
Next 6
|
||
|
Prior 2
|
||
|
);
|
||
|
# the latter few above seem to be vi specials. (since they are normally
|
||
|
# escape sequences, e.g. ESC [ 5 ~)
|
||
|
|
||
|
sub lookup {
|
||
|
my($down, $key, $name) = @_;
|
||
|
|
||
|
my $n = -1;
|
||
|
$name =~ s/^KP_//;
|
||
|
|
||
|
# algorithm borrowed from LinuxVNC.c:
|
||
|
if (! $down) {
|
||
|
if ($name =~ /^Control/) {
|
||
|
$control--;
|
||
|
}
|
||
|
return $n;
|
||
|
}
|
||
|
|
||
|
if ($name =~ /^Control/) {
|
||
|
$control++;
|
||
|
} else {
|
||
|
if (exists($Map{$name})) {
|
||
|
$n = $Map{$name};
|
||
|
}
|
||
|
if ($control && $name =~ /^[A-z]$/) {
|
||
|
$n = ord($name);
|
||
|
# shift down to the Control zone:
|
||
|
if ($name =~ /[a-z]/) {
|
||
|
$n -= (ord("a") - 1);
|
||
|
} else {
|
||
|
$n -= (ord("A") - 1);
|
||
|
}
|
||
|
}
|
||
|
if ($n < 0 && $key < 256) {
|
||
|
$n = $key;
|
||
|
}
|
||
|
}
|
||
|
return $n;
|
||
|
}
|
||
|
|
||
|
$control = 0;
|
||
|
$debug = 0;
|
||
|
|
||
|
while (<>) {
|
||
|
chomp;
|
||
|
if (/^\w+$/) {
|
||
|
# for debugging, you type the keysym in manually.
|
||
|
$_ = "Keysym 1 0 999 $_ None";
|
||
|
}
|
||
|
next unless /^Keysym/;
|
||
|
|
||
|
my ($j, $id, $down, $k, $keysym, $rest) = split(' ', $_);
|
||
|
|
||
|
$n = lookup($down, $k, $keysym);
|
||
|
if ($n < 0 || $n > 255) {
|
||
|
print STDERR "skip: '$keysym' -> $n\n" if $down && $debug;
|
||
|
next;
|
||
|
}
|
||
|
|
||
|
$n_p = pack("c", $n);
|
||
|
$ret = syscall($linux_ioctl_syscall, $fd, $TIOCSTI, $n_p);
|
||
|
|
||
|
print STDERR "ctrl=$control $keysym/$k syscall(" .
|
||
|
"$linux_ioctl_syscall, $fd, $TIOCSTI, $n) = $ret\n" if $debug;
|
||
|
|
||
|
}
|