#!/usr/bin/env perl -w
#
# Test script to combine Term::Readline::Gnu and Event.
# Derived from the ptksh+ script by A. Bohnet which comes
# with Term::Readline::Gnu.
#
# The script does nothing more than just demonstrating how
# Term::Readline::Gnu can be combined with event loops built
# by using the Event module.
#
# The running event loop can be visualized by using the
# option -idle.
#
# J. Stenzel (perl@jochen-stenzel.de)
#
# check perl version
require 5.005;
# pragmata
use strict;
# load modules
use Event;
use Getopt::Long;
use File::Basename;
use Term::ReadLine;
# inits and declarations
my ($script, %options)=basename($0);
# get options
GetOptions(\%options, "idle");
# init readline
my $term=new Term::ReadLine($script);
my $attribs=$term->Attribs;
$term->callback_handler_install("$script> ", \&processLine);
# store output buffer in a scalar (for print)
my $outstream=$attribs->{'outstream'};
# install STDIN handler
Event->io(
desc => 'STDIN handler', # description;
fd => \*STDIN, # handle;
poll => 'r', # wait for income;
cb => sub {&{$attribs->{'callback_read_char'}}()}, # callback;
repeat => 1, # keep alive after events;
);
# install an additional idle task just to demonstrate that the loop works fine, if necessary
Event->idle(
desc => 'idle task', # description;
prio => 5, # low priority;
min => 1, # minimal pending time in seconds;
max => 5, # invoked after at least this number of seconds;
cb => sub {print $outstream "\n\n[Trace] Idle task is running.\n\n"}, # callback;
repeat => 1, # keep alive after events;
) if exists $options{'idle'};
# enter event loop
Event::loop();
# handle a line completely read
sub processLine
{
# get line
my ($line)=@_;
# anyhing to process?
if (defined $line)
{
# do something
print $outstream "[Trace] $line\n";
$term->add_history($line) if $line ne '';
}
else
{
# well done
print $outstream "\n";
$term->callback_handler_remove();
$_->cancel for Event::all_watchers;
}
}