mirror of
https://github.com/Tha14/toxic.git
synced 2024-11-26 14:13:27 +01:00
improve input scrolling, fix some unicode issues (WIP)
This commit is contained in:
parent
0bc9725b98
commit
43c1140aa2
37
src/chat.c
37
src/chat.c
@ -662,16 +662,15 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
|
|||||||
int cur_len = 0; /* widechar size of current char */
|
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 */
|
||||||
if (ctx->len < MAX_STR_SIZE - 1) {
|
if (ctx->len < MAX_STR_SIZE - 1) {
|
||||||
add_char_to_buf(ctx, key);
|
add_char_to_buf(ctx, key);
|
||||||
|
cur_len = MAX(1, wcwidth(key));
|
||||||
|
wmove(self->window, y, x + cur_len);
|
||||||
|
|
||||||
if (x >= x2 - 1) {
|
if (x + cur_len >= x2)
|
||||||
wmove(self->window, y, x2 / 2 + x2_is_odd);
|
ctx->start += cur_len;
|
||||||
ctx->start += x2 / 2;
|
|
||||||
} else {
|
|
||||||
wmove(self->window, y, x + MAX(1, wcwidth(key)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ctx->self_is_typing && ctx->line[0] != '/')
|
if (!ctx->self_is_typing && ctx->line[0] != '/')
|
||||||
@ -683,10 +682,10 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
|
|||||||
|
|
||||||
if (key == 0x107 || key == 0x8 || key == 0x7f) { /* BACKSPACE key */
|
if (key == 0x107 || key == 0x8 || key == 0x7f) { /* BACKSPACE key */
|
||||||
if (ctx->pos > 0) {
|
if (ctx->pos > 0) {
|
||||||
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos]));
|
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos - 1]));
|
||||||
del_char_buf_bck(ctx);
|
del_char_buf_bck(ctx);
|
||||||
|
|
||||||
if (x == 0) {
|
if (x <= 0) {
|
||||||
ctx->start = ctx->start >= x2 ? ctx->start - x2 : 0;
|
ctx->start = ctx->start >= x2 ? ctx->start - x2 : 0;
|
||||||
int new_x = ctx->start == 0 ? ctx->pos : x2 - cur_len;
|
int new_x = ctx->start == 0 ? ctx->pos : x2 - cur_len;
|
||||||
wmove(self->window, y, new_x);
|
wmove(self->window, y, new_x);
|
||||||
@ -733,7 +732,7 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
|
|||||||
if (ctx->pos != ctx->len) {
|
if (ctx->pos != ctx->len) {
|
||||||
ctx->pos = ctx->len;
|
ctx->pos = ctx->len;
|
||||||
ctx->start = x2 * (ctx->len / x2);
|
ctx->start = x2 * (ctx->len / x2);
|
||||||
mv_curs_end(self->window, ctx->len, y2, x2);
|
mv_curs_end(self->window, MAX(0, wcswidth(ctx->line, MAX_STR_SIZE)), y2, x2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,7 +741,7 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
|
|||||||
--ctx->pos;
|
--ctx->pos;
|
||||||
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos]));
|
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos]));
|
||||||
|
|
||||||
if (x == 0) {
|
if (x <= 0) {
|
||||||
wmove(self->window, y, x2 - cur_len);
|
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;
|
ctx->pos = ctx->start + x2 - 1;
|
||||||
@ -757,15 +756,11 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
|
|||||||
else if (key == KEY_RIGHT) {
|
else if (key == KEY_RIGHT) {
|
||||||
if (ctx->pos < ctx->len) {
|
if (ctx->pos < ctx->len) {
|
||||||
++ctx->pos;
|
++ctx->pos;
|
||||||
|
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos - 1]));
|
||||||
|
wmove(self->window, y, x + cur_len);
|
||||||
|
|
||||||
if (x == x2 - 1) {
|
if (x + cur_len >= x2)
|
||||||
wmove(self->window, y, 0);
|
ctx->start += cur_len;
|
||||||
ctx->start += x2;
|
|
||||||
ctx->pos = ctx->start;
|
|
||||||
} else {
|
|
||||||
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos]));
|
|
||||||
wmove(self->window, y, x + cur_len);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
beep();
|
beep();
|
||||||
}
|
}
|
||||||
@ -774,13 +769,13 @@ 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);
|
||||||
ctx->start = x2 * (ctx->len / x2);
|
ctx->start = x2 * (ctx->len / x2);
|
||||||
mv_curs_end(self->window, ctx->len, y2, x2);
|
mv_curs_end(self->window, MAX(0, wcswidth(ctx->line, MAX_STR_SIZE)), 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);
|
||||||
ctx->start = x2 * (ctx->len / x2);
|
ctx->start = x2 * (ctx->len / x2);
|
||||||
mv_curs_end(self->window, ctx->len, y2, x2);
|
mv_curs_end(self->window, MAX(0, wcswidth(ctx->line, MAX_STR_SIZE)), y2, x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (key == '\t') { /* TAB key: completes command */
|
else if (key == '\t') { /* TAB key: completes command */
|
||||||
|
@ -399,15 +399,12 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
|
|||||||
if (ltr) { /* char is printable */
|
if (ltr) { /* char is printable */
|
||||||
if (ctx->len < MAX_STR_SIZE - 1) {
|
if (ctx->len < MAX_STR_SIZE - 1) {
|
||||||
add_char_to_buf(ctx, key);
|
add_char_to_buf(ctx, key);
|
||||||
|
cur_len = MAX(1, wcwidth(key));
|
||||||
|
wmove(self->window, y, x + cur_len);
|
||||||
|
|
||||||
if (x >= x2 - 1) {
|
if (x + cur_len >= x2)
|
||||||
wmove(self->window, y, x2 / 2 + x2_is_odd);
|
ctx->start += cur_len;
|
||||||
ctx->start += x2 / 2;
|
|
||||||
} else {
|
|
||||||
wmove(self->window, y, x + MAX(1, wcwidth(key)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else { /* if (!ltr) */
|
} else { /* if (!ltr) */
|
||||||
|
|
||||||
if (line_info_onKey(self, key))
|
if (line_info_onKey(self, key))
|
||||||
@ -415,10 +412,10 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
|
|||||||
|
|
||||||
if (key == 0x107 || key == 0x8 || key == 0x7f) { /* BACKSPACE key */
|
if (key == 0x107 || key == 0x8 || key == 0x7f) { /* BACKSPACE key */
|
||||||
if (ctx->pos > 0) {
|
if (ctx->pos > 0) {
|
||||||
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos]));
|
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos - 1]));
|
||||||
del_char_buf_bck(ctx);
|
del_char_buf_bck(ctx);
|
||||||
|
|
||||||
if (x == 0) {
|
if (x <= 0) {
|
||||||
ctx->start = ctx->start >= x2 ? ctx->start - x2 : 0;
|
ctx->start = ctx->start >= x2 ? ctx->start - x2 : 0;
|
||||||
int new_x = ctx->start == 0 ? ctx->pos : x2 - cur_len;
|
int new_x = ctx->start == 0 ? ctx->pos : x2 - cur_len;
|
||||||
wmove(self->window, y, new_x);
|
wmove(self->window, y, new_x);
|
||||||
@ -465,16 +462,16 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
|
|||||||
if (ctx->pos != ctx->len) {
|
if (ctx->pos != ctx->len) {
|
||||||
ctx->pos = ctx->len;
|
ctx->pos = ctx->len;
|
||||||
ctx->start = x2 * (ctx->len / x2);
|
ctx->start = x2 * (ctx->len / x2);
|
||||||
mv_curs_end(self->window, ctx->len, y2, x2);
|
mv_curs_end(self->window, MAX(0, wcswidth(ctx->line, MAX_STR_SIZE)), y2, x2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (key == KEY_LEFT) {
|
else if (key == KEY_LEFT) {
|
||||||
if (ctx->pos > 0) {
|
if (ctx->pos > 0) {
|
||||||
--ctx->pos;
|
--ctx->pos;
|
||||||
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos]));
|
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos - 1]));
|
||||||
|
|
||||||
if (x == 0) {
|
if (x <= 0) {
|
||||||
wmove(self->window, y, x2 - cur_len);
|
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;
|
ctx->pos = ctx->start + x2 - 1;
|
||||||
@ -489,15 +486,11 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
|
|||||||
else if (key == KEY_RIGHT) {
|
else if (key == KEY_RIGHT) {
|
||||||
if (ctx->pos < ctx->len) {
|
if (ctx->pos < ctx->len) {
|
||||||
++ctx->pos;
|
++ctx->pos;
|
||||||
|
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos - 1]));
|
||||||
|
wmove(self->window, y, x + cur_len);
|
||||||
|
|
||||||
if (x == x2 - 1) {
|
if (x + cur_len >= x2)
|
||||||
wmove(self->window, y, 0);
|
ctx->start += cur_len;
|
||||||
ctx->start += x2;
|
|
||||||
ctx->pos = ctx->start;
|
|
||||||
} else {
|
|
||||||
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos]));
|
|
||||||
wmove(self->window, y, x + cur_len);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
beep();
|
beep();
|
||||||
}
|
}
|
||||||
@ -506,13 +499,13 @@ 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);
|
||||||
ctx->start = x2 * (ctx->len / x2);
|
ctx->start = x2 * (ctx->len / x2);
|
||||||
mv_curs_end(self->window, ctx->len, y2, x2);
|
mv_curs_end(self->window, MAX(0, wcswidth(ctx->line, MAX_STR_SIZE)), 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);
|
||||||
ctx->start = x2 * (ctx->len / x2);
|
ctx->start = x2 * (ctx->len / x2);
|
||||||
mv_curs_end(self->window, ctx->len, y2, x2);
|
mv_curs_end(self->window, MAX(0, wcswidth(ctx->line, MAX_STR_SIZE)), y2, x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (key == '\t') { /* TAB key: completes peer name */
|
else if (key == '\t') { /* TAB key: completes peer name */
|
||||||
|
Loading…
Reference in New Issue
Block a user