Use UTF-8 line drawing characters on UTF-8 terminals. Fixes some stupid

terminals (I'm looking at you, putty) which disable the vt100 ACS mode
switching sequences in UTF-8 mode.

Also on terminals without ACS at all, use ASCII equivalents where
obvious.
This commit is contained in:
Nicholas Marriott
2010-09-11 16:19:22 +00:00
parent 3696cce4ae
commit cb564bb427
6 changed files with 137 additions and 54 deletions

View File

@ -302,6 +302,7 @@ tty_term_find(char *name, int fd, const char *overrides, char **cause)
u_int i;
int n, error;
char *s;
const char *acs;
SLIST_FOREACH(term, &tty_terms, entry) {
if (strcmp(term->name, name) == 0) {
@ -315,7 +316,7 @@ tty_term_find(char *name, int fd, const char *overrides, char **cause)
term->name = xstrdup(name);
term->references = 1;
term->flags = 0;
memset(&term->codes, 0, sizeof term->codes);
memset(term->codes, 0, sizeof term->codes);
SLIST_INSERT_HEAD(&tty_terms, term, entry);
/* Set up curses terminal. */
@ -411,6 +412,15 @@ tty_term_find(char *name, int fd, const char *overrides, char **cause)
if (!tty_term_flag(term, TTYC_XENL))
term->flags |= TERM_EARLYWRAP;
/* Generate ACS table. If none is present, use nearest ASCII. */
memset(term->acs, 0, sizeof term->acs);
if (tty_term_has(term, TTYC_ACSC))
acs = tty_term_string(term, TTYC_ACSC);
else
acs = "a#j+k+l+m+n+o-p-q-r-s-t+u+v+w+x|y<z>~.";
for (; acs[0] != '\0' && acs[1] != '\0'; acs += 2)
term->acs[(u_char) acs[0]][0] = acs[1];
return (term);
error: