Skip to content

Instantly share code, notes, and snippets.

@rblackwe
Forked from jrockway/term-sharer.pl
Created October 12, 2009 00:03
Show Gist options
  • Save rblackwe/207982 to your computer and use it in GitHub Desktop.
Save rblackwe/207982 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use strict;
use warnings;
use feature ':5.10';
use Term::ReadKey;
use AnyEvent::Subprocess;
$|=1;
sub mk_collector {
my $handle = shift;
my $r; $r = sub {
my $h = shift;
no warnings;
print $h->{rbuf} if $h->{active};
$h->{everything} .= delete $h->{rbuf};
$h->push_read($r);
};
$handle->push_read($r);
}
my $done = AnyEvent->condvar;
my ($a,$b) = map {
$done->begin;
AnyEvent::Subprocess->new(
on_completion => sub { $done->end },
delegates => [
{ Pty => { stderr => 1 }},
{ Callback => {
parent_setup_hook => sub {
my ($proc, $run) = @_;
mk_collector($run->delegate('pty')->handle);
},
}},
],
code => sub {
open my $fh, '<', '/usr/share/dict/words' or die $!;
while (<$fh>) {
print;
if(rand() < 0.1){
print {*STDERR} "Continue? [Y/n]";
my $continue = <>;
exit 0 if $continue =~ /n/i;
}
}
exit 0;
},
) } 1..2;
my $ra = $a->run;
my $rb = $b->run;
ReadMode 4;
my $mode = 0;
my $inw = AnyEvent->io( poll => "r", fh => \*STDIN, cb => sub {
my $char = ReadKey(-1);
#print "got $char ". ord($char). "\n";
given($mode){
when(0){
given($char){
when('q'){
$ra->kill(9);
$rb->kill(9);
}
when(1){
system('clear');
print $ra->delegate('pty')->handle->{everything};
$mode = 1;
}
when(2){
system('clear');
print $rb->delegate('pty')->handle->{everything};
$mode = 2;
}
default {
say "That does nothing.";
}
}
}
when([1,2]){
given($char){
when(ord($char) == 3){ # 3 == C-c
say "\n\nLeaving mode $mode";
$mode = 0;
$ra->delegate('pty')->handle->{active} = 0;
$rb->delegate('pty')->handle->{active} = 0;
}
default {
my $r = [$ra,$rb]->[$mode-1];
$r->delegate('pty')->handle->{active} = 1;
$r->delegate('pty')->handle->push_write($char);
}
}
}
}
});
$done->wait;
ReadMode 0;
say "done";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment