fix longstanding issues with console EOL handling
[spider.git] / perl / console.pl
index ea46553f39acce2122c0f103f3a038e9c815f5cf..97b6220df84dbdec0663dc3263c368bc19faee32 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl
 #
 # this is the operators console.
 #
@@ -14,6 +14,7 @@
 # 
 
 require 5.004;
+use warnings;
 
 # search local then perl directories
 BEGIN {
@@ -26,11 +27,16 @@ BEGIN {
        $is_win = ($^O =~ /^MS/ || $^O =~ /^OS-2/) ? 1 : 0; # is it Windows?
 }
 
+$clusteraddr = '127.0.0.1';
+$clusterport = 27754;
+
 use Mojo::IOLoop;
 
+use DXVars;
+use SysVar;
+
 use Msg;
 use IntMsg;
-use DXVars;
 use DXDebug;
 use DXUtil;
 use DXDebug;
@@ -174,13 +180,18 @@ sub measure
 sub show_screen
 {
        if ($spos == @shistory - 1) {
-
                # if we really are scrolling thru at the end of the history
                my $line = $shistory[$spos];
-               $top->addstr("\n") if $spos > 0;
+               my $y = $spos;
+               if ($spos >= $pagel) {
+                       $top->scrl(1);
+                       $y = $pagel-1;
+#                      $top->addstr("\r");
+               }
+               $top->move($y, 0);
+               $top->refresh;
                setattr($line);
                $top->addstr($line);
-#              $top->addstr("\n");
                $top->attrset(COLOR_PAIR(0)) if $has_colors;
                $spos = @shistory;
                
@@ -202,8 +213,7 @@ sub show_screen
                for ($i = 0; $i < $pagel && $p < @shistory; $p++) {
                        my $line = $shistory[$p];
                        my $lines = measure($line);
-                       last if $i + $lines > $pagel;
-                       $top->addstr("\n") if $i;
+                       $top->move($i, 0);
                        setattr($line);
                        $top->addstr($line);
                        $top->attrset(COLOR_PAIR(0)) if $has_colors;
@@ -236,7 +246,8 @@ sub addtotop
                if ($inbuf =~ s/\x07+$//) {
                        beep();
                }
-               if (length $inbuf >= $cols) {
+               $inbuf =~ s/\s+$//s;
+               if (length $inbuf > $cols) {
                        $Text::Wrap::Columns = $cols;
                        push @shistory, wrap('',"\t", $inbuf);
                } else {
@@ -255,7 +266,10 @@ sub rec_socket
                cease(1);
        }
        if (defined $msg) {
-               my ($sort, $call, $line) = $msg =~ /^(\w)([^\|]+)\|(.*)$/;
+               my ($sort, $incall, $line) = $msg =~ /^(\w)([^\|]+)\|(.*)$/;
+
+               # change my call if my node says "tonight Michael you are Jane" or something like that...
+               $call = $incall if $call ne $incall;
                
                $line =~ s/[\x00-\x06\x08\x0a-\x19\x1b-\x1f\x80-\x9f]/./g;         # immutable CSI sequence + control characters
                if ($sort && $sort eq 'D') {
@@ -526,7 +540,7 @@ $Text::Wrap::Columns = $cols;
 my $lastmin = 0;
 
 
-$conn = IntMsg->connect($clusteraddr, $clusterport, \&rec_socket);
+$conn = IntMsg->connect($clusteraddr, $clusterport, rproc => \&rec_socket);
 $conn->{on_connect} = \&on_connect;
 $conn->{on_disconnect} = \&on_disconnect;