#!/usr/bin/perl -w
use strict;
use POSIX;
my ($cols, $rows) = do {
use Term::ReadKey;
GetTerminalSize();
};
my $termios = POSIX::Termios->new();
$termios->getattr(fileno(STDIN));
my $terminal = do {
require Term::Cap;
Tgetent Term::Cap { TERM => undef, OSPEED => $termios->getospeed };
};
my $lflag = $termios->getlflag();
sub raw {
$termios->setlflag($lflag & ~(ECHO | ECHOK | ICANON));
# $termios->setcc(VTIME, 1);
$termios->setattr(fileno(STDIN), TCSANOW);
}
sub cooked {
$termios->setlflag($lflag);
# $termios->setcc(VTIME, 0);
$termios->setattr(fileno(STDIN), TCSANOW);
}
END {
$terminal->Tputs("ve", 0, \*STDOUT);
cooked();
}
$SIG{TERM} = $SIG{INT} = sub { exit; };
raw();
$terminal->Tputs("vi", 0, \*STDOUT);
for my $n (1..3) {
use List::Util "shuffle";
for (shuffle(split //, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")) {
$terminal->Tputs("ho", 0, \*STDOUT);
$terminal->Tputs("cd", 0, \*STDOUT);
$terminal->Tgoto("cm", $cols / 2, $rows / 2, \*STDOUT);
print "$_\n";
sysread(STDIN, my $k, 20);
}
}
$terminal->Tputs("ve", 0, \*STDOUT);