X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/8f22582cf466052917dad28301545cfa60db76e8..5471d09ad63fc6216fb9c2a3b52ca9c93821a054:/terminal.c diff --git a/terminal.c b/terminal.c index aeadc771..87c151e3 100644 --- a/terminal.c +++ b/terminal.c @@ -254,6 +254,7 @@ unsigned long *lineptr(int y, int lineno) if (newline != line) { delpos234(whichtree, treeindex); addpos234(whichtree, newline, treeindex); + line = newline; } return line + 1; @@ -1948,6 +1949,21 @@ void term_out(void) } } break; + case 'Z': /* BackTab for xterm */ + compatibility(OTHER); + { + int i = def(esc_args[0], 1); + pos old_curs = curs; + + for(;i>0 && curs.x>0; i--) { + do { + curs.x--; + } while (curs.x >0 && !tabs[curs.x]); + } + fix_cpos; + check_selection(old_curs, curs); + } + break; case ANSI('L', '='): compatibility(OTHER); use_bce = (esc_args[0] <= 0); @@ -3265,13 +3281,33 @@ int term_ldisc(int option) /* * from_backend(), to get data from the backend for the terminal. */ -void from_backend(int is_stderr, char *data, int len) +int from_backend(int is_stderr, char *data, int len) { while (len--) { if (inbuf_head >= INBUF_SIZE) term_out(); inbuf[inbuf_head++] = *data++; } + + /* + * We process all stdout/stderr data immediately we receive it, + * and don't return until it's all gone. Therefore, there's no + * reason at all to return anything other than zero from this + * function. + * + * This is a slightly suboptimal way to deal with SSH2 - in + * principle, the window mechanism would allow us to continue + * to accept data on forwarded ports and X connections even + * while the terminal processing was going slowly - but we + * can't do the 100% right thing without moving the terminal + * processing into a separate thread, and that might hurt + * portability. So we manage stdout buffering the old SSH1 way: + * if the terminal processing goes slowly, the whole SSH + * connection stops accepting data until it's ready. + * + * In practice, I can't imagine this causing serious trouble. + */ + return 0; } /*