summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2011-04-13 23:47:28 -0500
committerJesse Luehrs <doy@tozt.net>2011-04-13 23:53:48 -0500
commit494b7e609819202a78f92cce023cc9c3f842d9b3 (patch)
tree069056b7ae337eb33a9e001bb0a3f2280869201b
parent7fedd8ff77678ce30a6ce7dd453e9d48d7763d53 (diff)
downloadapp-termcast-494b7e609819202a78f92cce023cc9c3f842d9b3.tar.gz
app-termcast-494b7e609819202a78f92cce023cc9c3f842d9b3.zip
refactor the ReadMode stuff a bit
-rw-r--r--lib/App/Termcast.pm40
1 files changed, 30 insertions, 10 deletions
diff --git a/lib/App/Termcast.pm b/lib/App/Termcast.pm
index 4e1576a..0d20b9f 100644
--- a/lib/App/Termcast.pm
+++ b/lib/App/Termcast.pm
@@ -151,13 +151,22 @@ sub _build_socket {
}
$socket->syswrite($self->establishment_message);
+ ReadMode 5 if $self->_raw_mode;
return $socket;
}
before clear_socket => sub {
+ my $self = shift;
Carp::carp("Lost connection to server ($!), reconnecting...");
+ ReadMode 0 if $self->_raw_mode;
};
+sub new_socket {
+ my $self = shift;
+ $self->clear_socket;
+ $self->socket;
+}
+
has pty => (
traits => ['NoGetopt'],
is => 'rw',
@@ -170,6 +179,23 @@ sub _build_pty {
IO::Pty::Easy->new(raw => 0);
}
+has _raw_mode => (
+ traits => ['NoGetopt'],
+ is => 'rw',
+ isa => 'Bool',
+ default => 0,
+ trigger => sub {
+ my $self = shift;
+ my ($val) = @_;
+ if ($val) {
+ ReadMode 5;
+ }
+ else {
+ ReadMode 0;
+ }
+ },
+);
+
sub _build_select_args {
my $self = shift;
my @for = @_ ? @_ : (qw(socket pty input));
@@ -244,10 +270,10 @@ sub run {
my $self = shift;
my @cmd = @_;
+ $self->_raw_mode(1);
$self->socket;
- ReadMode 5;
- my $guard = Scope::Guard->new(sub { ReadMode 0 });
+ my $guard = Scope::Guard->new(sub { $self->_raw_mode(0) });
$self->pty->spawn(@cmd) || die "Couldn't spawn @cmd: $!";
@@ -269,10 +295,7 @@ sub run {
}
if ($self->_socket_ready($eout)) {
- ReadMode 0;
- $self->clear_socket;
- $self->socket;
- ReadMode 5;
+ $self->new_socket;
}
if ($self->_in_ready($rout)) {
@@ -305,10 +328,7 @@ sub run {
$self->socket->recv($buf, 4096);
if (!defined $buf || length $buf == 0) {
if (defined $buf) {
- ReadMode 0;
- $self->clear_socket;
- $self->socket;
- ReadMode 5;
+ $self->new_socket;
}
else {
Carp::croak("Error reading from socket: $!");