1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-11-03 19:37:16 -05:00

Handle insert for wide chars

This commit is contained in:
James Booth 2013-01-03 22:41:03 +00:00
parent 0cd7d43953
commit a96e36a55d

View File

@ -170,14 +170,22 @@ inp_get_char(char *input, int *size)
// handle insert if not at end of input // handle insert if not at end of input
if (inp_x < display_size) { if (inp_x < display_size) {
winsch(inp_win, ch); char bytes[5];
wmove(inp_win, inp_y, inp_x+1); size_t utf_len = wcrtomb(bytes, ch, NULL);
for (i = *size; i > inp_x; i--) char *next_ch = g_utf8_offset_to_pointer(input, inp_x);
input[i] = input[i-1]; char *offset;
input[inp_x] = ch; for (offset = &input[*size - 1]; offset >= next_ch; offset--) {
*(offset + utf_len) = *offset;
}
for (i = 0; i < utf_len; i++) {
*(next_ch + i) = bytes[i];
}
(*size)++; *size += utf_len;
input[*size] = '\0';
wprintw(inp_win, next_ch);
wmove(inp_win, inp_y, inp_x + 1);
// otherwise just append // otherwise just append
} else { } else {
@ -339,7 +347,7 @@ _handle_edit(const wint_t ch, char *input, int *size)
} }
// if in middle, delete and shift chars left // if in middle, delete and shift chars left
} else if (inp_x > 0 && inp_x < *size) { } else if (inp_x > 0 && inp_x < display_size) {
for (i = inp_x; i < *size; i++) for (i = inp_x; i < *size; i++)
input[i-1] = input[i]; input[i-1] = input[i];
(*size)--; (*size)--;
@ -387,7 +395,7 @@ _handle_edit(const wint_t ch, char *input, int *size)
return 1; return 1;
case KEY_RIGHT: case KEY_RIGHT:
if (inp_x < *size) { if (inp_x < display_size) {
wmove(inp_win, inp_y, inp_x+1); wmove(inp_win, inp_y, inp_x+1);
// current position off screen to right // current position off screen to right