Skip to content
Snippets Groups Projects
Commit b09076ac authored by Marcus Comstedt's avatar Marcus Comstedt
Browse files

Dumb mode implemented.

Rev: lib/modules/Stdio.pmod/Readline.pike:1.22
parent d4ba7284
No related branches found
No related tags found
No related merge requests found
// $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 class OutputController
{ {
...@@ -287,9 +287,13 @@ class InputController ...@@ -287,9 +287,13 @@ class InputController
static private function grab_binding = 0; static private function grab_binding = 0;
static private mapping oldattrs = 0; static private mapping oldattrs = 0;
int dumb=0;
void destroy() void destroy()
{ {
catch{ infd->set_blocking(); }; catch{ infd->set_blocking(); };
if(dumb)
return;
catch{ infd->tcsetattr((["ECHO":1,"ICANON":1])); }; catch{ infd->tcsetattr((["ECHO":1,"ICANON":1])); };
catch{ if(oldattrs) infd->tcsetattr((["ECHO":0,"ICANON":0,"VEOF":0, catch{ if(oldattrs) infd->tcsetattr((["ECHO":0,"ICANON":0,"VEOF":0,
"VEOL":0,"VLNEXT":0])&oldattrs); }; "VEOL":0,"VLNEXT":0])&oldattrs); };
...@@ -591,7 +595,18 @@ class InputController ...@@ -591,7 +595,18 @@ class InputController
infd = _infd || Stdio.File("stdin"); infd = _infd || Stdio.File("stdin");
term = objectp(_term)? _term : .Terminfo.getTerm(_term); term = objectp(_term)? _term : .Terminfo.getTerm(_term);
disable(); disable();
if(search(term->aliases, "dumb")>=0) {
// Dumb terminal. Don't try anything fancy.
dumb = 1;
return;
}
catch { oldattrs = infd->tcgetattr(); }; 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, catch { infd->tcsetattr((["ECHO":0,"ICANON":0,"VMIN":1,"VTIME":0,
"VLNEXT":0])); }; "VLNEXT":0])); };
} }
...@@ -867,6 +882,12 @@ class DefaultEditKeys ...@@ -867,6 +882,12 @@ class DefaultEditKeys
for(int i='\240'; i<='\377'; i++) for(int i='\240'; i<='\377'; i++)
ic->bindstr(sprintf("%c", i), self_insert_command); 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) foreach(default_bindings, array(string|function) b)
ic->bind(@b); ic->bind(@b);
} }
...@@ -1018,11 +1039,13 @@ int setcursorpos(int p) ...@@ -1018,11 +1039,13 @@ int setcursorpos(int p)
p = strlen(text); p = strlen(text);
if (p<cursorpos) if (p<cursorpos)
{ {
if(!input_controller->dumb)
output_controller->move_backward(text[p..cursorpos-1]); output_controller->move_backward(text[p..cursorpos-1]);
cursorpos = p; cursorpos = p;
} }
else if (p>cursorpos) else if (p>cursorpos)
{ {
if(!input_controller->dumb)
output_controller->move_forward(text[cursorpos..p-1]); output_controller->move_forward(text[cursorpos..p-1]);
cursorpos = p; cursorpos = p;
} }
...@@ -1050,10 +1073,11 @@ void insert(string s, int p) ...@@ -1050,10 +1073,11 @@ void insert(string s, int p)
if (p>strlen(text)) if (p>strlen(text))
p = strlen(text); p = strlen(text);
setcursorpos(p); setcursorpos(p);
if(!input_controller->dumb)
output_controller->write(s,0,hide); output_controller->write(s,0,hide);
cursorpos += strlen(s); cursorpos += strlen(s);
string rest = text[p..]; string rest = text[p..];
if (strlen(rest)) if (strlen(rest) && !input_controller->dumb)
{ {
output_controller->write(rest,0,hide); output_controller->write(rest,0,hide);
output_controller->move_backward(rest); output_controller->move_backward(rest);
...@@ -1072,8 +1096,10 @@ void delete(int p1, int p2) ...@@ -1072,8 +1096,10 @@ void delete(int p1, int p2)
setcursorpos(p1); setcursorpos(p1);
if (p1>=p2) if (p1>=p2)
return; return;
if(!input_controller->dumb) {
output_controller->write(text[p2..],0,hide); output_controller->write(text[p2..],0,hide);
output_controller->erase(text[p1..p2-1]); output_controller->erase(text[p1..p2-1]);
}
text = text[..p1-1]+text[p2..]; text = text[..p1-1]+text[p2..];
if (mark>p2) mark-=(p2-p1); if (mark>p2) mark-=(p2-p1);
...@@ -1150,10 +1176,12 @@ void redisplay(int clear, int|void nobackup) ...@@ -1150,10 +1176,12 @@ void redisplay(int clear, int|void nobackup)
} }
output_controller->check_columns(); output_controller->check_columns();
if(!input_controller->dumb) {
// This seems like a silly limitation // This seems like a silly limitation
// if(newline_func == read_newline) // if(newline_func == read_newline)
output_controller->write(prompt); output_controller->write(prompt);
output_controller->write(text,0,hide); output_controller->write(text,0,hide);
}
cursorpos = sizeof(text); cursorpos = sizeof(text);
setcursorpos(p); setcursorpos(p);
} }
...@@ -1169,7 +1197,10 @@ static private void initline() ...@@ -1169,7 +1197,10 @@ static private void initline()
string newline() string newline()
{ {
setcursorpos(sizeof(text)); setcursorpos(sizeof(text));
if(!input_controller->dumb)
output_controller->newline(); output_controller->newline();
else
output_controller->bol();
string data = text; string data = text;
if (historyobj && !hide) if (historyobj && !hide)
historyobj->finishline(text); historyobj->finishline(text);
...@@ -1205,8 +1236,10 @@ void write(string msg,void|int word_wrap) ...@@ -1205,8 +1236,10 @@ void write(string msg,void|int word_wrap)
{ {
int p = cursorpos; int p = cursorpos;
setcursorpos(0); setcursorpos(0);
if(!input_controller->dumb) {
output_controller->bol(); output_controller->bol();
output_controller->clear(1); output_controller->clear(1);
}
array(string) tmp=msg/"\n"; array(string) tmp=msg/"\n";
foreach(tmp[..sizeof(tmp)-2],string l) foreach(tmp[..sizeof(tmp)-2],string l)
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment