diff --git a/lib/modules/Stdio.pmod/Readline.pike b/lib/modules/Stdio.pmod/Readline.pike index 8aa3e840594c048d35b084d8bd482a28d52fc6e9..a63dcce2936333ec9a6d341ff6d5e7da0d797d1e 100644 --- a/lib/modules/Stdio.pmod/Readline.pike +++ b/lib/modules/Stdio.pmod/Readline.pike @@ -1,4 +1,4 @@ -// $Id: Readline.pike,v 1.21 1999/06/09 18:03:14 hubbe Exp $ +// $Id: Readline.pike,v 1.22 1999/06/11 21:40:29 marcus Exp $ class OutputController { @@ -287,9 +287,13 @@ class InputController static private function grab_binding = 0; static private mapping oldattrs = 0; + int dumb=0; + void destroy() { catch{ infd->set_blocking(); }; + if(dumb) + return; catch{ infd->tcsetattr((["ECHO":1,"ICANON":1])); }; catch{ if(oldattrs) infd->tcsetattr((["ECHO":0,"ICANON":0,"VEOF":0, "VEOL":0,"VLNEXT":0])&oldattrs); }; @@ -591,7 +595,18 @@ class InputController infd = _infd || Stdio.File("stdin"); term = objectp(_term)? _term : .Terminfo.getTerm(_term); disable(); + if(search(term->aliases, "dumb")>=0) { + // Dumb terminal. Don't try anything fancy. + dumb = 1; + return; + } catch { oldattrs = infd->tcgetattr(); }; + if(catch { infd->tcsetattr((["ECHO":0])); }) { + // If echo can't be disabled, Readline won't work very well. + // Go to dumb mode. + dumb = 1; + return; + } catch { infd->tcsetattr((["ECHO":0,"ICANON":0,"VMIN":1,"VTIME":0, "VLNEXT":0])); }; } @@ -866,6 +881,12 @@ class DefaultEditKeys ic->bindstr(sprintf("%c", i), self_insert_command); for(int i='\240'; i<='\377'; i++) ic->bindstr(sprintf("%c", i), self_insert_command); + + if(ic->dumb) { + ic->bind("^J", newline); + ic->bind("^M", lambda() { }); + return; + } foreach(default_bindings, array(string|function) b) ic->bind(@b); @@ -1018,12 +1039,14 @@ int setcursorpos(int p) p = strlen(text); if (p<cursorpos) { - output_controller->move_backward(text[p..cursorpos-1]); + if(!input_controller->dumb) + output_controller->move_backward(text[p..cursorpos-1]); cursorpos = p; } else if (p>cursorpos) { - output_controller->move_forward(text[cursorpos..p-1]); + if(!input_controller->dumb) + output_controller->move_forward(text[cursorpos..p-1]); cursorpos = p; } return cursorpos; @@ -1050,10 +1073,11 @@ void insert(string s, int p) if (p>strlen(text)) p = strlen(text); setcursorpos(p); - output_controller->write(s,0,hide); + if(!input_controller->dumb) + output_controller->write(s,0,hide); cursorpos += strlen(s); string rest = text[p..]; - if (strlen(rest)) + if (strlen(rest) && !input_controller->dumb) { output_controller->write(rest,0,hide); output_controller->move_backward(rest); @@ -1072,8 +1096,10 @@ void delete(int p1, int p2) setcursorpos(p1); if (p1>=p2) return; - output_controller->write(text[p2..],0,hide); - output_controller->erase(text[p1..p2-1]); + if(!input_controller->dumb) { + output_controller->write(text[p2..],0,hide); + output_controller->erase(text[p1..p2-1]); + } text = text[..p1-1]+text[p2..]; if (mark>p2) mark-=(p2-p1); @@ -1150,10 +1176,12 @@ void redisplay(int clear, int|void nobackup) } output_controller->check_columns(); -// This seems like a silly limitation -// if(newline_func == read_newline) - output_controller->write(prompt); - output_controller->write(text,0,hide); + if(!input_controller->dumb) { + // This seems like a silly limitation + // if(newline_func == read_newline) + output_controller->write(prompt); + output_controller->write(text,0,hide); + } cursorpos = sizeof(text); setcursorpos(p); } @@ -1169,7 +1197,10 @@ static private void initline() string newline() { setcursorpos(sizeof(text)); - output_controller->newline(); + if(!input_controller->dumb) + output_controller->newline(); + else + output_controller->bol(); string data = text; if (historyobj && !hide) historyobj->finishline(text); @@ -1205,8 +1236,10 @@ void write(string msg,void|int word_wrap) { int p = cursorpos; setcursorpos(0); - output_controller->bol(); - output_controller->clear(1); + if(!input_controller->dumb) { + output_controller->bol(); + output_controller->clear(1); + } array(string) tmp=msg/"\n"; foreach(tmp[..sizeof(tmp)-2],string l) {