summaryrefslogtreecommitdiffstats
path: root/tty-acs.c
diff options
context:
space:
mode:
authornicm <nicm>2017-05-15 16:44:04 +0000
committernicm <nicm>2017-05-15 16:44:04 +0000
commit1ba7f1d03f680df20d45b5c2ca08ae39665e1dea (patch)
treef2845204d19836360ebe18619490119c30c33205 /tty-acs.c
parentb160de5cb4cf901e0d01594308f8f4f54df9e2a9 (diff)
Check the terminfo(5) U8 capability and disable using UTF-8 for ACS if
it is present and zero. This is useful for users with terminals or fonts that do not correctly support UTF-8 line drawing characters. GitHub issue 927, reported by Hiroaki Yamazoe and Akinori Hattori.
Diffstat (limited to 'tty-acs.c')
-rw-r--r--tty-acs.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/tty-acs.c b/tty-acs.c
index 6e3103d9..1f7a2b11 100644
--- a/tty-acs.c
+++ b/tty-acs.c
@@ -74,23 +74,48 @@ tty_acs_cmp(const void *key, const void *value)
return (ch - entry->key);
}
+/* Should this terminal use ACS instead of UTF-8 line drawing? */
+int
+tty_acs_needed(struct tty *tty)
+{
+ if (tty == NULL)
+ return (0);
+
+ /*
+ * If the U8 flag is present, it marks whether a terminal supports
+ * UTF-8 and ACS together.
+ *
+ * If it is present and zero, we force ACS - this gives users a way to
+ * turn off UTF-8 line drawing.
+ *
+ * If it is nonzero, we can fall through to the default and use UTF-8
+ * line drawing on UTF-8 terminals.
+ */
+ if (tty_term_has(tty->term, TTYC_U8) &&
+ tty_term_number(tty->term, TTYC_U8) == 0)
+ return (1);
+
+ if (tty->flags & TTY_UTF8)
+ return (0);
+ return (1);
+}
+
/* Retrieve ACS to output as a string. */
const char *
tty_acs_get(struct tty *tty, u_char ch)
{
- struct tty_acs_entry *entry;
+ struct tty_acs_entry *entry;
- /* If not a UTF-8 terminal, use the ACS set. */
- if (tty != NULL && !(tty->flags & TTY_UTF8)) {
+ /* Use the ACS set instead of UTF-8 if needed. */
+ if (tty_acs_needed(tty)) {
if (tty->term->acs[ch][0] == '\0')
return (NULL);
return (&tty->term->acs[ch][0]);
}
/* Otherwise look up the UTF-8 translation. */
- entry = bsearch(&ch,
- tty_acs_table, nitems(tty_acs_table), sizeof tty_acs_table[0],
- tty_acs_cmp);
+ entry = bsearch(&ch, tty_acs_table, nitems(tty_acs_table),
+ sizeof tty_acs_table[0], tty_acs_cmp);
if (entry == NULL)
return (NULL);
return (entry->string);