From bc8e737514268782f877f71daa36acef13d889e2 Mon Sep 17 00:00:00 2001 From: AZ Huang Date: Thu, 12 Dec 2013 13:41:16 +0800 Subject: [PATCH] Fix wchar cursor movement. --- src/chat.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/chat.c b/src/chat.c index bc6127a..77ad295 100644 --- a/src/chat.c +++ b/src/chat.c @@ -303,15 +303,17 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key) int x, y, y2, x2; getyx(self->window, y, x); getmaxyx(self->window, y2, x2); + int cur_len = 0; if (key == 0x107 || key == 0x8 || key == 0x7f) { /* BACKSPACE key: Remove character behind pos */ if (ctx->pos > 0) { + cur_len = wcwidth(ctx->line[ctx->pos - 1]); del_char_buf_bck(ctx->line, &ctx->pos, &ctx->len); if (x == 0) - wmove(self->window, y-1, x2-1); + wmove(self->window, y-1, x2 - cur_len); else - wmove(self->window, y, x-1); + wmove(self->window, y, x - cur_len); } } @@ -342,29 +344,31 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key) else if (key == KEY_END) { /* END key: move cursor to end of line */ if (ctx->pos != ctx->len) { ctx->pos = ctx->len; - mv_curs_end(self->window, ctx->len, y2, x2); + mv_curs_end(self->window, wcswidth(ctx->line), y2, x2); } } else if (key == KEY_LEFT) { if (ctx->pos > 0) { --ctx->pos; + cur_len = wcwidth(ctx->line[ctx->pos]); if (x == 0) - wmove(self->window, y-1, x2-1); + wmove(self->window, y-1, x2 - cur_len); else - wmove(self->window, y, x-1); + wmove(self->window, y, x - cur_len); } } else if (key == KEY_RIGHT) { if (ctx->pos < ctx->len) { + cur_len = wcwidth(ctx->line[ctx->pos]); ++ctx->pos; if (x == x2-1) wmove(self->window, y+1, 0); else - wmove(self->window, y, x+1); + wmove(self->window, y, x + cur_len); } } @@ -413,7 +417,7 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key) if (x == x2-1) wmove(self->window, y+1, 0); else - wmove(self->window, y, x+1); + wmove(self->window, y, x + wcwidth(key)); } } /* RETURN key: Execute command or print line */