X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/6908fed739ac49c43d4400ef572e0811a0ac676e..8c028e6547c06622ebd8a2c59f5720faa2268304:/terminal.c diff --git a/terminal.c b/terminal.c index 7f6f8bba..7b69e06e 100644 --- a/terminal.c +++ b/terminal.c @@ -99,7 +99,7 @@ static int wrap, wrapnext; /* wrap flags */ static int insert; /* insert-mode flag */ static int cset; /* 0 or 1: which char set */ static int save_cset, save_csattr; /* saved with cursor position */ -static int save_utf; /* saved with cursor position */ +static int save_utf, save_wnext; /* saved with cursor position */ static int rvideo; /* global reverse video flag */ static unsigned long rvbell_startpoint;/* for ESC[?5hESC[?5l vbell */ static int cursor_on; /* cursor enabled flag */ @@ -206,10 +206,6 @@ static void erase_lots(int, int, int); static void swap_screen(int); static void update_sbar(void); static void deselect(void); -/* log session to file stuff ... */ -static FILE *lgfp = NULL; -static void logtraffic(unsigned char c, int logmode); -static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm); /* * Resize a line to make it `cols' columns wide. @@ -750,6 +746,7 @@ static void save_cursor(int save) save_attr = curr_attr; save_cset = cset; save_utf = utf; + save_wnext = wrapnext; save_csattr = cset_attr[cset]; save_sco_acs = sco_acs; } else { @@ -763,6 +760,13 @@ static void save_cursor(int save) curr_attr = save_attr; cset = save_cset; utf = save_utf; + wrapnext = save_wnext; + /* + * wrapnext might reset to False if the x position is no + * longer at the rightmost edge. + */ + if (wrapnext && curs.x < cols-1) + wrapnext = FALSE; cset_attr[cset] = save_csattr; sco_acs = save_sco_acs; fix_cpos; @@ -1955,11 +1959,107 @@ void term_out(void) * illegal values (eg first arg 1..9) for window changing * and reports. */ - compatibility(VT340TEXT); if (esc_nargs <= 1 && (esc_args[0] < 1 || esc_args[0] >= 24)) { + compatibility(VT340TEXT); request_resize(cols, def(esc_args[0], 24)); deselect(); + } else if (esc_nargs >= 1 && + esc_args[0] >= 1 && + esc_args[0] < 24) { + compatibility(OTHER); + + switch (esc_args[0]) { + int x, y, len; + char buf[80], *p; + case 1: + set_iconic(FALSE); + break; + case 2: + set_iconic(TRUE); + break; + case 3: + if (esc_nargs >= 3) { + move_window(def(esc_args[1], 0), + def(esc_args[2], 0)); + } + break; + case 4: + /* We should resize the window to a given + * size in pixels here, but currently our + * resizing code isn't healthy enough to + * manage it. */ + break; + case 5: + set_zorder(TRUE); /* move to top */ + break; + case 6: + set_zorder(FALSE); /* move to bottom */ + break; + case 7: + refresh_window(); + break; + case 8: + if (esc_nargs >= 3) { + request_resize(def(esc_args[2], cfg.width), + def(esc_args[1], cfg.height)); + } + break; + case 9: + if (esc_nargs >= 2) + set_zoomed(esc_args[1] ? TRUE : FALSE); + break; + case 11: + ldisc_send(is_iconic() ? "\033[1t" : "\033[2t", + 4, 0); + break; + case 13: + get_window_pos(&x, &y); + len = sprintf(buf, "\033[3;%d;%dt", x, y); + ldisc_send(buf, len, 0); + break; + case 14: + get_window_pixels(&x, &y); + len = sprintf(buf, "\033[4;%d;%dt", x, y); + ldisc_send(buf, len, 0); + break; + case 18: + len = sprintf(buf, "\033[8;%d;%dt", + rows, cols); + ldisc_send(buf, len, 0); + break; + case 19: + /* + * Hmmm. Strictly speaking we + * should return `the size of the + * screen in characters', but + * that's not easy: (a) window + * furniture being what it is it's + * hard to compute, and (b) in + * resize-font mode maximising the + * window wouldn't change the + * number of characters. *shrug*. I + * think we'll ignore it for the + * moment and see if anyone + * complains, and then ask them + * what they would like it to do. + */ + break; + case 20: + p = get_window_title(TRUE); + len = strlen(p); + ldisc_send("\033]L", 3, 0); + ldisc_send(p, len, 0); + ldisc_send("\033\\", 2, 0); + break; + case 21: + p = get_window_title(FALSE); + len = strlen(p); + ldisc_send("\033]l", 3, 0); + ldisc_send(p, len, 0); + ldisc_send("\033\\", 2, 0); + break; + } } break; case 'S': @@ -3511,6 +3611,8 @@ int term_ldisc(int option) */ int from_backend(int is_stderr, char *data, int len) { + assert(len > 0); + bufchain_add(&inbuf, data, len); /* @@ -3534,138 +3636,3 @@ int from_backend(int is_stderr, char *data, int len) */ return 0; } - -/* - * Log session traffic. - */ -void logtraffic(unsigned char c, int logmode) -{ - if (cfg.logtype > 0) { - if (cfg.logtype == logmode) { - /* deferred open file from pgm start? */ - if (!lgfp) - logfopen(); - if (lgfp) - fputc(c, lgfp); - } - } -} - -void settimstr(char *ta, int no_sec); -char *subslfcode(char *dest, char *src, char *dstrt); -char *stpncpy(char *dst, const char *src, size_t maxlen); -char timdatbuf[20]; -char currlogfilename[FILENAME_MAX]; - -/* open log file append/overwrite mode */ -void logfopen(void) -{ - char buf[256]; - time_t t; - struct tm tm; - char writemod[4]; - - if (!cfg.logtype) - return; - sprintf(writemod, "wb"); /* default to rewrite */ - - time(&t); - tm = *localtime(&t); - - /* substitute special codes in file name */ - xlatlognam(currlogfilename,cfg.logfilename,cfg.host, &tm); - - lgfp = fopen(currlogfilename, "r"); /* file already present? */ - if (lgfp) { - int i; - fclose(lgfp); - i = askappend(currlogfilename); - if (i == 1) - writemod[0] = 'a'; /* set append mode */ - else if (i == 0) { /* cancelled */ - lgfp = NULL; - cfg.logtype = 0; /* disable logging */ - return; - } - } - - lgfp = fopen(currlogfilename, writemod); - if (lgfp) { /* enter into event log */ - sprintf(buf, "%s session log (%s mode) to file : ", - (writemod[0] == 'a') ? "Appending" : "Writing new", - (cfg.logtype == LGTYP_ASCII ? "ASCII" : - cfg.logtype == LGTYP_DEBUG ? "raw" : "")); - /* Make sure we do not exceed the output buffer size */ - strncat(buf, currlogfilename, 128); - buf[strlen(buf)] = '\0'; - logevent(buf); - - /* --- write header line into log file */ - fputs("=~=~=~=~=~=~=~=~=~=~=~= PuTTY log ", lgfp); - strftime(buf, 24, "%Y.%m.%d %H:%M:%S", &tm); - fputs(buf, lgfp); - fputs(" =~=~=~=~=~=~=~=~=~=~=~=\r\n", lgfp); - } -} - -void logfclose(void) -{ - if (lgfp) { - fclose(lgfp); - lgfp = NULL; - } -} - -/* - * translate format codes into time/date strings - * and insert them into log file name - * - * "&Y":YYYY "&m":MM "&d":DD "&T":hhmm "&h": "&&":& - */ -static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm) { - char buf[10], *bufp; - int size; - char *ds = d; /* save start pos. */ - int len = FILENAME_MAX-1; - - while (*s) { - /* Let (bufp, len) be the string to append. */ - bufp = buf; /* don't usually override this */ - if (*s == '&') { - char c; - s++; - if (*s) switch (c = *s++, tolower(c)) { - case 'y': - size = strftime(buf, sizeof(buf), "%Y", tm); - break; - case 'm': - size = strftime(buf, sizeof(buf), "%m", tm); - break; - case 'd': - size = strftime(buf, sizeof(buf), "%d", tm); - break; - case 't': - size = strftime(buf, sizeof(buf), "%H%M%S", tm); - break; - case 'h': - bufp = hostname; - size = strlen(bufp); - break; - default: - buf[0] = '&'; - size = 1; - if (c != '&') - buf[size++] = c; - } - } else { - buf[0] = *s++; - size = 1; - } - if (size > len) - size = len; - memcpy(d, bufp, size); - d += size; - len -= size; - } - *d = '\0'; -}