#!/usr/bin/perl -slw use strict; use Tk; use AnyEvent; use POSIX qw(:sys_wait_h); use Term::ReadLine; use IO::File; use 5.12.1; sub LOG { state $fh; open $fh, '>', '/tmp/sopw.out' unless $fh; die $! unless $fh; autoflush $fh 1; say $fh @_; } package Term::ReadLine::AE; unshift @Term::ReadLine::Stub::ISA, __PACKAGE__; #use Data::Dump qw(ddx); #ddx(\%INC); if ( not defined &Tk::DoOneEvent ) { ::LOG("overriding"); *Tk::DoOneEvent = sub { AnyEvent->_poll(); }; ::LOG("Not created?") unless defined &Tk::DoOneEvent; } our $cv; sub Tk_loop { my $self = shift; ::LOG("Entering Tk_loop"); $cv = AE::cv; $cv->recv(); } sub register_Tk { my $self = shift; ::LOG("Registering"); $Term::ReadLine::registered++ or AE::io( $self->IN, 0, sub { $cv->send() } ); } package main; use 5.12.1; my $esc; BEGIN { $esc = "\x1b["; print "${esc}2J"; } my $t = 0; my $w = AE::timer( 0, 1, sub { print "${esc}s${esc}1H$t s ${esc}u"; ++$t } ); my $term = Term::ReadLine->new('AE'); my $OUT = $term->OUT || \*STDOUT; my $prompt = "Finished"; my $cmd; while (defined( $cmd = $term->readline('>') )) { my @output = `$cmd`; my $exit_value = $? >> 8; my $signal_num = $? & 127; my $dumped_core = $? & 128; printf $OUT "Program terminated with status %d from signal %d%s\n", $exit_value, $signal_num, $dumped_core ? " (core dumped)" : ""; say @output; $term->addhistory; $term->tkRunning(1); say $prompt; exit; }