From: Pierre Habouzit Date: Fri, 9 Nov 2007 09:10:47 +0000 (+0100) Subject: fix fullwidth char X-Git-Url: http://git.madism.org/?a=commitdiff_plain;h=9ba434044157089e3a9d9342424b463d130fb4c5;p=apps%2Fmadtty.git fix fullwidth char Signed-off-by: Pierre Habouzit --- diff --git a/madtty/madtty.c b/madtty/madtty.c index ce9f256..83c2a5d 100644 --- a/madtty/madtty.c +++ b/madtty/madtty.c @@ -19,6 +19,7 @@ Copyright © 2006 Pierre Habouzit */ +#define _GNU_SOURCE #include #include #include @@ -30,6 +31,7 @@ #include #include #include +#include #include "madtty.h" @@ -564,9 +566,9 @@ static void try_interpret_escape_seq(madtty_t *rt) } if (rt->elen + 1 >= (int)sizeof(rt->ebuf)) { - int i; cancel: #if 0 + int i; fprintf(stderr, "cancelled: \\033"); for (i = 0; i < rt->elen; i++) { int c = rt->ebuf[i]; @@ -625,6 +627,8 @@ static void madtty_process_nonprinting(madtty_t *rt, wchar_t wc) void madtty_putc(madtty_t *rt, wchar_t wc) { + int width = 0; + if (!rt->seen_input) { rt->seen_input = 1; kill(-rt->childpid, SIGWINCH); @@ -665,8 +669,18 @@ void madtty_putc(madtty_t *rt, wchar_t wc) if (wc >= 0x41 && wc <= 0x7e && vt100_0[wc - 0x41]) { wc = vt100_0[wc - 0x41]; - // width = 1; // vt100 line drawing characters are always single-width } + width = 1; + } else { + width = wcwidth(wc) ?: 1; + } + + if (width == 2 && rt->curs_col == rt->cols - 1) { + tmp = rt->curs_row; + tmp->dirty = true; + tmp->text[rt->curs_col] = 0; + tmp->attr[rt->curs_col] = build_attrs(rt->curattrs); + rt->curs_col++; } if (rt->curs_col >= rt->cols) { @@ -675,18 +689,23 @@ void madtty_putc(madtty_t *rt, wchar_t wc) } tmp = rt->curs_row; + tmp->dirty = true; if (rt->insert) { - wmemmove(tmp->text + rt->curs_col + 1, tmp->text + rt->curs_col, - (rt->cols - rt->curs_col - 1)); - memmove(tmp->attr + rt->curs_col + 1, tmp->attr + rt->curs_col, - (rt->cols - rt->curs_col - 1) * sizeof(tmp->attr[0])); + wmemmove(tmp->text + rt->curs_col + width, tmp->text + rt->curs_col, + (rt->cols - rt->curs_col - width)); + memmove(tmp->attr + rt->curs_col + width, tmp->attr + rt->curs_col, + (rt->cols - rt->curs_col - width) * sizeof(tmp->attr[0])); } tmp->text[rt->curs_col] = wc; tmp->attr[rt->curs_col] = build_attrs(rt->curattrs); - tmp->dirty = true; rt->curs_col++; + if (width == 2) { + tmp->text[rt->curs_col] = 0; + tmp->attr[rt->curs_col] = build_attrs(rt->curattrs); + rt->curs_col++; + } } } @@ -803,6 +822,8 @@ void madtty_draw(madtty_t *rt, WINDOW *win, int srow, int scol) len = wcrtomb(buf, row->text[j], NULL); waddnstr(win, buf, len); + if (wcwidth(row->text[j]) > 1) + j++; } else { waddch(win, row->text[j] > ' ' ? row->text[j] : ' '); } @@ -884,6 +905,7 @@ void madtty_initialize(void) raw(); nodelay(stdscr, TRUE); keypad(stdscr, TRUE); + ESCDELAY=50; for (int i = -1; i < 8; i++) { for (int j = -1; j < 8; j++) {