X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fconsole.pl;h=f4c4a85fa37731c163379cdf3b21b9b84d609b35;hb=39cc57add0d181ac15f470ddfe47ffc5ea8accd1;hp=fd033d90d66cb704d9efcb939344bbeac5522ab0;hpb=b672afe940f843351af2bc4a87b4c4239f3a5140;p=spider.git diff --git a/perl/console.pl b/perl/console.pl index fd033d90..f4c4a85f 100755 --- a/perl/console.pl +++ b/perl/console.pl @@ -32,6 +32,7 @@ use DXDebug; use DXUtil; use DXDebug; use IO::File; +use Time::HiRes qw(gettimeofday tv_interval); use Curses 1.06; use Console; @@ -50,6 +51,9 @@ $connsort = "local"; $khistpos = 0; $spos = $pos = $lth = 0; $inbuf = ""; +@time = (); + +$SIG{WINCH} = sub {@time = gettimeofday}; sub mydbg { @@ -85,11 +89,13 @@ sub do_initscr $top = $scr->subwin($lines-4, $cols, 0, 0); $top->intrflush(0); $top->scrollok(1); + $top->idlok(1); $top->meta(1); # $scr->addstr($lines-4, 0, '-' x $cols); $bot = $scr->subwin(3, $cols, $lines-3, 0); $bot->intrflush(0); $bot->scrollok(1); + $top->idlok(1); $bot->keypad(1); $bot->move(1,0); $bot->meta(1); @@ -106,13 +112,12 @@ sub do_resize initscr(); raw(); noecho(); - $lines = LINES; + nonl(); + $lines = LINES; $cols = COLS; $has_colors = has_colors(); do_initscr(); - $winch = 0; - $SIG{'WINCH'} = sub {$winch = 1}; show_screen(); } @@ -168,6 +173,7 @@ sub show_screen $top->addstr("\n") if $spos > 0; setattr($line); $top->addstr($line); +# $top->addstr("\n"); $top->attrset(COLOR_PAIR(0)) if $has_colors; $spos = @shistory; @@ -190,8 +196,9 @@ sub show_screen my $line = $shistory[$p]; my $lines = measure($line); last if $i + $lines > $pagel; + $top->addstr("\n") if $i; setattr($line); - $top->addstr($i, 0, "$line\n"); + $top->addstr($line); $top->attrset(COLOR_PAIR(0)) if $has_colors; $i += $lines; } @@ -219,6 +226,9 @@ sub addtotop { while (@_) { my $inbuf = shift; + if ($inbuf =~ s/\x07+$//) { + beep(); + } push @shistory, $inbuf; shift @shistory if @shistory > $maxshist; } @@ -235,8 +245,9 @@ sub rec_socket if (defined $msg) { my ($sort, $call, $line) = $msg =~ /^(\w)([^\|]+)\|(.*)$/; + $line =~ s/[\x00-\x06\x08\x0a-\x19\x1b-\x1f\x80-\x9f]/./g; # immutable CSI sequence + control characters if ($sort && $sort eq 'D') { - $line = " " unless $line; + $line = " " unless length($line); addtotop($line); } elsif ($sort && $sort eq 'Z') { # end, disconnect, go, away ..... cease(0); @@ -264,11 +275,12 @@ sub rec_stdin # print "sys: $r ($prbuf)\n"; if (defined $r) { + $r = '0' if !$r; if ($r eq KEY_ENTER || $r eq "\n" || $r eq "\r") { # save the lines - $inbuf = " " unless $inbuf; + $inbuf = " " unless length $inbuf; # check for a pling and do a search back for a command if ($inbuf =~ /^!/o) { @@ -285,7 +297,7 @@ sub rec_stdin return; } } - push @khistory, $inbuf if $inbuf; + push @khistory, $inbuf if length $inbuf; shift @khistory if @khistory > $maxkhist; $khistpos = @khistory; $bot->move(0,0); @@ -361,7 +373,7 @@ sub rec_stdin $pos = 0; } elsif ($r eq KEY_END || $r eq "\005") { $pos = $lth; - } elsif ($r eq KEY_BACKSPACE || $r eq "\010" || $r eq "\0177") { + } elsif ($r eq KEY_BACKSPACE || $r eq "\010" || $r eq "\x7f") { if ($pos > 0) { my $a = substr($inbuf, 0, $pos-1); my $b = substr($inbuf, $pos) if $pos < $lth; @@ -387,7 +399,7 @@ sub rec_stdin } elsif ($r eq KEY_RESIZE || $r eq "\0632") { do_resize(); return; - } elsif (is_pctext($r)) { + } elsif (defined $r && is_pctext($r)) { # move the top screen back to the bottom if you type something if ($spos < @shistory) { $spos = @shistory; @@ -476,7 +488,7 @@ $SIG{__DIE__} = \&sig_term; $conn->send_later("A$call|$connsort width=$cols"); $conn->send_later("I$call|set/page $maxshist"); -$conn->send_later("I$call|set/nobeep"); +#$conn->send_later("I$call|set/nobeep"); #Msg->set_event_handler(\*STDIN, "read" => \&rec_stdin); @@ -494,7 +506,7 @@ for (;;) { $lasttime = $t; } my $ch = $bot->getch(); - if ($winch) { + if (@time && tv_interval(\@time, [gettimeofday]) >= 1) { # mydbg("Got Resize"); # do_resize(); next;