Term-GnuScreen
view release on metacpan or search on metacpan
lib/Term/GnuScreen.pm view on Meta::CPAN
package Term::GnuScreen;
use Moo;
use File::Temp qw(tmpnam);
use autodie qw(:all);
use File::Which;
use IO::CaptureOutput qw(capture);
our $VERSION = '0.06';
BEGIN {
no strict 'refs';
my @commands = ( qw( acladd aclchg acldel aclgrp aclumask activity addacl allpartial
altscreen at attrcolor autodetach autonuke backtick bce bell_msg
bindkey blanker blankerprg break breaktype bufferfile c1 caption chacl
charset clear colon command compacthist console copy copy_reg
crlf debug defautonuke defbce defbreaktype defc1 defcharset defencoding
defescape defflow defgr defhstatus deflog deflogin defmode defmonitor
defnonblock defobuflimit defscrollback defshell defsilence defslowpaste
defutf8 defwrap defwritelock defzombie detach digraph dinfo displays
dumptermcap echo encoding escape eval fit flow focus gr
hardcopy_append hardcopydir hardstatus height help history hstatus idle
ignorecase info ins_reg lastmsg license lockscreen log logfile login
logtstamp mapdefault mapnotnext maptimeout markkeys maxwin monitor
msgminwait msgwait multiuser nethack next nonblock number obuflimit only
other partial password paste pastefont pow_break pow_detach pow_detach_msg
prev printcmd process quit readbuf readreg redisplay register remove
removebuf reset resize screen scrollback select sessionname setenv setsid
shell shelltitle silence silencewait sleep slowpaste source sorendition
split startup_message stuff su suspend term termcap terminfo termcapinfo
time title unsetenv utf8 vbell vbell_msg vbellwait version wall
width windowlist windows wrap writebuf writelock xoff xon zmodem zombie ) );
for my $name (@commands) {
*{__PACKAGE__ . "::$name"} = sub { shift->send_command($name,@_) }
}
my @rcommands = ( qw( bind kill meta chdir exec umask) );
for my $name (@rcommands) {
*{__PACKAGE__ . "::s$name"} = sub { shift->send_command($name,@_) }
}
}
has session => (is => 'rw' );
has window => (is => 'rw', default => sub { 0 } );
has executable => (is => 'rw', default => sub { which("screen") } );
has create => (is => 'ro', default => sub { 0 } );
has debugging => (is => 'rw', default => sub { 0 } );
sub BUILD {
my ($self) = @_;
if ($self->create) {
if (!$self->session) {
$self->session("term_gnuscreen.$$" . int(rand(10000)));
}
$self->call_screen('-m','-d');
}
return;
}
sub send_command {
my ($self,$cmd,@args) = @_;
die "No command supplied while trying to call screen via -X."
if !$cmd;
return $self->call_screen('-X', $cmd, @args) if $cmd;
}
sub call_screen {
my ($self,@parameter) = @_;
my @screencmd = ( $self->executable );
push @screencmd, '-S', $self->session if defined $self->session;
push @screencmd, '-p', $self->window if defined $self->window;
push @screencmd, @parameter;
if ($self->debugging) {
print STDERR "Command: " . join(" ",@screencmd) . "\n";
}
my ($stdout,$stderr);
eval {
capture { system(@screencmd) } \$stdout, \$stderr;
1;
} or do {
my $err;# = $!;
$err = $stderr if defined $stderr;
$err = $stdout if defined $stdout; # '*err*, stdout seems to be actual more helpful
die "$err";
};
return 1;
}
( run in 0.947 second using v1.01-cache-2.11-cpan-2398b32b56e )