[LWN Logo]

From: Tom Christiansen <tchrist@mox.perl.com>
Subject: SRC: read a single key without echo or <ENTER>
Date: 22 May 1998 13:55:02 GMT

This works on any POSIX-conforming system.  Term::ReadKey works
on even more.

package HotKey;

@ISA = qw(Exporter);
@EXPORT = qw(cbreak cooked readkey);

use strict;

use POSIX qw(:termios_h);

my ($term, $oterm, $echo, $noecho, $fd_stdin);

$fd_stdin = fileno(STDIN);

$term     = POSIX::Termios->new();
$term->getattr($fd_stdin);
$oterm     = $term->getlflag();

$echo     = ECHO | ECHOK | ICANON;
$noecho   = $oterm & ~$echo;

sub cbreak {
    $term->setlflag($noecho);
    $term->setcc(VTIME, 1);
    $term->setattr($fd_stdin, TCSANOW);
}

sub cooked {
    $term->setlflag($oterm);
    $term->setcc(VTIME, 0);
    $term->setattr($fd_stdin, TCSANOW);
}

sub readkey {
    my $key = '';
    cbreak();
    sysread(STDIN, $key, 1);
    cooked();
    return $key;
}


END { cooked() }


1;
-- 
    "I can only bend the rules so much before it starts looking like I'm breaking
    the rules." --Larry Wall