1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-11-26 22:53:28 +01:00

fix backspace bug

This commit is contained in:
Jfreegman 2014-06-21 01:26:33 -04:00
parent bba81ac884
commit 62239a1fda
2 changed files with 25 additions and 23 deletions

View File

@ -547,8 +547,11 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
int x, y, y2, x2; int x, y, y2, x2;
getyx(self->window, y, x); getyx(self->window, y, x);
getmaxyx(self->window, y2, x2); getmaxyx(self->window, y2, x2);
int cur_len = 0; /* widechar len of current char */
int len = MAX(0, wcslen(ctx->line)); /* widechar len of line */ if (x2 <= 0)
return;
int cur_len = 0; /* widechar size of current char */
int x2_is_odd = x2 % 2 != 0; int x2_is_odd = x2 % 2 != 0;
if (ltr) { /* char is printable */ if (ltr) { /* char is printable */
@ -576,9 +579,9 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
del_char_buf_bck(ctx); del_char_buf_bck(ctx);
if (x == 0) { if (x == 0) {
wmove(self->window, y, x2 - cur_len);
ctx->start = ctx->start >= x2 ? ctx->start - x2 : 0; ctx->start = ctx->start >= x2 ? ctx->start - x2 : 0;
ctx->pos = ctx->start + x2 - 1; int new_x = ctx->start == 0 ? ctx->pos : x2 - cur_len;
wmove(self->window, y, new_x);
} else { } else {
wmove(self->window, y, x - cur_len); wmove(self->window, y, x - cur_len);
} }
@ -621,8 +624,8 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
else if (key == KEY_END || key == T_KEY_C_E) { /* END/C-e key: move cursor to end of line */ else if (key == KEY_END || key == T_KEY_C_E) { /* END/C-e key: move cursor to end of line */
if (ctx->pos != ctx->len) { if (ctx->pos != ctx->len) {
ctx->pos = ctx->len; ctx->pos = ctx->len;
ctx->start = x2 * (len / x2); ctx->start = x2 * (ctx->len / x2);
mv_curs_end(self->window, len, y2, x2); mv_curs_end(self->window, ctx->len, y2, x2);
} }
} }
@ -662,16 +665,14 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
else if (key == KEY_UP) { /* fetches previous item in history */ else if (key == KEY_UP) { /* fetches previous item in history */
fetch_hist_item(ctx, MOVE_UP); fetch_hist_item(ctx, MOVE_UP);
len = wcslen(ctx->line); ctx->start = x2 * (ctx->len / x2);
ctx->start = x2 * (len / x2); mv_curs_end(self->window, ctx->len, y2, x2);
mv_curs_end(self->window, len, y2, x2);
} }
else if (key == KEY_DOWN) { /* fetches next item in history */ else if (key == KEY_DOWN) { /* fetches next item in history */
fetch_hist_item(ctx, MOVE_DOWN); fetch_hist_item(ctx, MOVE_DOWN);
len = wcslen(ctx->line); ctx->start = x2 * (ctx->len / x2);
ctx->start = x2 * (len / x2); mv_curs_end(self->window, ctx->len, y2, x2);
mv_curs_end(self->window, len, y2, x2);
} }
else if (key == '\t') { /* TAB key: completes command */ else if (key == '\t') { /* TAB key: completes command */

View File

@ -389,8 +389,11 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
int x, y, y2, x2; int x, y, y2, x2;
getyx(self->window, y, x); getyx(self->window, y, x);
getmaxyx(self->window, y2, x2); getmaxyx(self->window, y2, x2);
if (x2 <= 0)
return;
int cur_len = 0; /* widechar len of current char */ int cur_len = 0; /* widechar len of current char */
int len = MAX(0, wcslen(ctx->line)); /* widechar len of line */
int x2_is_odd = x2 % 2 != 0; int x2_is_odd = x2 % 2 != 0;
if (ltr) { /* char is printable */ if (ltr) { /* char is printable */
@ -416,9 +419,9 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
del_char_buf_bck(ctx); del_char_buf_bck(ctx);
if (x == 0) { if (x == 0) {
wmove(self->window, y, x2 - cur_len);
ctx->start = ctx->start >= x2 ? ctx->start - x2 : 0; ctx->start = ctx->start >= x2 ? ctx->start - x2 : 0;
ctx->pos = ctx->start + x2 - 1; int new_x = ctx->start == 0 ? ctx->pos : x2 - cur_len;
wmove(self->window, y, new_x);
} else { } else {
wmove(self->window, y, x - cur_len); wmove(self->window, y, x - cur_len);
} }
@ -461,8 +464,8 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
else if (key == KEY_END || key == T_KEY_C_E) { /* END/C-e key: move cursor to end of line */ else if (key == KEY_END || key == T_KEY_C_E) { /* END/C-e key: move cursor to end of line */
if (ctx->pos != ctx->len) { if (ctx->pos != ctx->len) {
ctx->pos = ctx->len; ctx->pos = ctx->len;
ctx->start = x2 * (len / x2); ctx->start = x2 * (ctx->len / x2);
mv_curs_end(self->window, len, y2, x2); mv_curs_end(self->window, ctx->len, y2, x2);
} }
} }
@ -502,16 +505,14 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
else if (key == KEY_UP) { /* fetches previous item in history */ else if (key == KEY_UP) { /* fetches previous item in history */
fetch_hist_item(ctx, MOVE_UP); fetch_hist_item(ctx, MOVE_UP);
len = wcslen(ctx->line); ctx->start = x2 * (ctx->len / x2);
ctx->start = x2 * (len / x2); mv_curs_end(self->window, ctx->len, y2, x2);
mv_curs_end(self->window, len, y2, x2);
} }
else if (key == KEY_DOWN) { /* fetches next item in history */ else if (key == KEY_DOWN) { /* fetches next item in history */
fetch_hist_item(ctx, MOVE_DOWN); fetch_hist_item(ctx, MOVE_DOWN);
len = wcslen(ctx->line); ctx->start = x2 * (ctx->len / x2);
ctx->start = x2 * (len / x2); mv_curs_end(self->window, ctx->len, y2, x2);
mv_curs_end(self->window, len, y2, x2);
} }
else if (key == '\t') { /* TAB key: completes peer name */ else if (key == '\t') { /* TAB key: completes peer name */