summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-06-24 16:01:02 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-06-24 16:01:02 +0000
commit2de599ac0ec0634282a52711378258e25839bc7f (patch)
tree801da081ece4aed7ebb958c794de17f63328cd1e
parent7b4077ef8710aead343ea306d598f457652ba5c0 (diff)
Trying to predict the cursor position for UTF-8 output in the same way as for
normal eight-bit output is wrong, separate it into a different function. Fixes spacing when mixing UTF-8 with some escape sequences, notably the way w3m does it.
-rw-r--r--tmux.h1
-rw-r--r--tty.c23
2 files changed, 19 insertions, 5 deletions
diff --git a/tmux.h b/tmux.h
index 04088a16..2052b498 100644
--- a/tmux.h
+++ b/tmux.h
@@ -994,6 +994,7 @@ void tty_putcode1(struct tty *, enum tty_code_code, int);
void tty_putcode2(struct tty *, enum tty_code_code, int, int);
void tty_puts(struct tty *, const char *);
void tty_putc(struct tty *, u_char);
+void tty_pututf8(struct tty *, const struct grid_utf8 *);
void tty_init(struct tty *, char *, char *);
void tty_start_tty(struct tty *);
void tty_stop_tty(struct tty *);
diff --git a/tty.c b/tty.c
index 3149c8fb..d0c89afd 100644
--- a/tty.c
+++ b/tty.c
@@ -409,6 +409,23 @@ tty_putc(struct tty *tty, u_char ch)
}
void
+tty_pututf8(struct tty *tty, const struct grid_utf8 *gu)
+{
+ u_int i, width;
+
+ for (i = 0; i < UTF8_SIZE; i++) {
+ if (gu->data[i] == 0xff)
+ break;
+ buffer_write8(tty->out, gu->data[i]);
+ if (tty->log_fd != -1)
+ write(tty->log_fd, &gu->data[i], 1);
+ }
+
+ width = utf8_width(gu->data);
+ tty->cx += width;
+}
+
+void
tty_set_title(struct tty *tty, const char *title)
{
if (strstr(tty->termname, "xterm") == NULL &&
@@ -912,11 +929,7 @@ tty_cell(
}
/* Otherwise, write UTF-8. */
- for (i = 0; i < UTF8_SIZE; i++) {
- if (gu->data[i] == 0xff)
- break;
- tty_putc(tty, gu->data[i]);
- }
+ tty_pututf8(tty, gu);
}
void