my ($class, $name, $cfgfile, $app_config) = @_;
$self->InitSignalHandlers;
$self->Init($name, $cfgfile, $app_config, \
%DerivedConfig);
$self->{'Termios'} = undef;
$self->{'OrigTermios'} = undef;
$self->{'ReadCallbacks'} = {};
$self->{'WriteCallbacks'} = {};
$self->{'GotInterrupt'} = 0;
my ($fileno, $fd_read, $fd_write);
if( $self->GotInterrupt ) {
if( $self->UpdatePrompt ) {
'readable' => sub{ $self->ReadLine->callback_read_char; }
$self->ReadLine->CallbackHandlerInstall(
sub { $self->ProcessLine(@_); }
next if select($fd_read = $self->ReadFD, $fd_write = $self->WriteFD, undef, 1.0) < 0;
foreach $fileno (keys %{ $self->ReadCallbacks }) {
&{ $self->{'ReadCallbacks'}{$fileno} } if vec($fd_read, $fileno, 1);
foreach $fileno (keys %{ $self->WriteCallbacks }) {
&{ $self->{'WriteCallbacks'}{$fileno} } if vec($fd_write, $fileno, 1);
my ($self, $how, @what) = @_;
my $what = join '', @what;
my $LOGFILE = $self->LogFH;
my $ReDirFH = $self->ReDirFH;
print $LOGFILE $what if defined($LOGFILE);
print { $ReDirFH } $what;
} elsif( $ENV{'TERM'} and $ENV{'TERM'} ne 'vt100' ) {
print colored
($what, $how);
my ($self, $titlestr) = @_;
print STDOUT
"\e]2;$titlestr\cg";
my ($self, $iconstr) = @_;
print STDOUT
"\e]1;$iconstr\cg";
$self->ReadLine->CallbackHandlerInstall('', sub {});
$self->ReadLine->call_function('clear-screen');
$self->Attribs->{'erase_empty_line'} = 1;
$self->ReadLine->stuff_char(ord("\n"));
$self->ReadLine->callback_read_char;
$self->Attribs->{'erase_empty_line'} = 0;
$self->SUPER::InitSignalHandlers
;
$SIG{'INT'} = sub { $self->GotInterrupt(1); };
my $Termios = POSIX
::Termios
->new;
my $OrigTermios = POSIX
::Termios
->new;
if( not $Termios->getattr(STDIN_FILENO
) ) {
$self->PrintError("Error in getattr for STDIN(", STDIN_FILENO
, "): $!\n ");
$self->PrintError("Weird terminal behavior may occur.\n");
$OrigTermios->getattr(STDIN_FILENO
);
$Termios->setlflag(($Termios->getlflag | ISIG
) & ~ICANON
);
$Termios->setoflag($Termios->getoflag & ~$TABDLY);
$Termios->setcc(VTIME
, 1);
$Termios->setcc(VINTR
, 3);
if( not $Termios->setattr(STDIN_FILENO
, TCSANOW
) ) {
$self->PrintError("Error in setattr for STDIN(", STDIN_FILENO
, "): $!\n ");
$self->PrintError("Weird terminal behavior may occur.\n");
$self->Termios($Termios);
$self->OrigTermios($OrigTermios);
$self->SUPER::InitReadLine
;
if( $ENV{'TERM'} and $ENV{'TERM'} eq 'vt100' ) {
# turn off all ornaments if the terminal can't handle it
$self->ReadLine->ornaments(0);
# else set prompt to bold
$self->ReadLine->ornaments('md,me,,');
&{ $self->TogglePromptCallback };
my $line = $self->Attribs->{'line_buffer'};
# This bit of magic just erases the current line, prompt included.
$self->ReadLine->CallbackHandlerInstall('', sub {});
$self->Attribs->{'erase_empty_line'} = 1;
$self->ReadLine->stuff_char(ord("\n"));
$self->ReadLine->callback_read_char;
$self->Attribs->{'erase_empty_line'} = 0;
# Install a new prompt and restore the old line
$self->ReadLine->CallbackHandlerInstall($self->GetPrompt, sub { $self->ProcessLine(@_); });
$self->ReadLine->insert_text($line);
my $ReadLine = $self->ReadLine;
my $Attribs = $self->Attribs;
if( $Attribs and $Attribs->{'end'} != 0 ) {
$Attribs->{'point'} = $Attribs->{'end'} = 0;
&{ $self->HandleInterruptCallback };
sub DefaultInterruptCallback
{
my ($self, $fh, $readwrite, $func) = @_;
return unless defined($fh) and defined($readwrite);
my $fileno = fileno($fh);
if( $readwrite eq 'readable' ) {
if( defined($func) and ref($func) eq 'CODE' ) {
vec($self->{'ReadFD'}, $fileno, 1) = 1;
$self->{'ReadCallbacks'}{$fileno} = $func;
vec($self->{'ReadFD'}, $fileno, 1) = 0;
delete $self->{'ReadCallbacks'}{$fileno}
} elsif( $readwrite eq 'writable' ) {
if( defined($func) and ref($func) eq 'CODE' ) {
vec($self->{'WriteFD'}, $fileno, 1) = 1;
$self->{'WriteCallbacks'}{$fileno} = $func;
vec($self->{'WriteFD'}, $fileno, 1) = 0;
delete $self->{'WriteCallbacks'}{$fileno};
$self->PrintError("Bad mode to fileevent: '$readwrite'\n");
$self->OrigTermios->setattr(STDIN_FILENO
, TCSANOW
) if $self->OrigTermios;
my $ReadLine = $self->ReadLine;
my $Attribs = $self->Attribs;
unless( defined($line) ) {
$Attribs->{'point'} = $Attribs->{'end'} = 0;
$self->fileevent(*STDIN
, 'readable' => '');
$ReadLine->callback_handler_remove;
$self->SUPER::ProcessLine
($line);