diff options
author | James Booth <boothj5@gmail.com> | 2015-01-20 23:02:04 +0000 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2015-01-20 23:02:04 +0000 |
commit | 25d31101bfb365c8224ef09f84a92794a89e975f (patch) | |
tree | 6f1b66974da22e26f8d7d1cbe3b9772ba25da863 /src | |
parent | 58239244bb703d770aa423d8fcea19522771ae0d (diff) | |
download | profani-tty-25d31101bfb365c8224ef09f84a92794a89e975f.tar.gz |
Added key insert tests, extracted key_ctrl_left handler
Diffstat (limited to 'src')
-rw-r--r-- | src/ui/inputwin.c | 68 | ||||
-rw-r--r-- | src/ui/keyhandlers.c | 90 | ||||
-rw-r--r-- | src/ui/keyhandlers.h | 2 |
3 files changed, 77 insertions, 83 deletions
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index 59292482..7b5c33d0 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -256,67 +256,12 @@ _handle_edit(int key_type, const wint_t ch) { int col = getcurx(inp_win); int utf8_len = g_utf8_strlen(line, -1); + int wcols = getmaxx(stdscr); // CTRL-LEFT - if (line_utf8_pos > 0 && _is_ctrl_left(key_type, ch)) { - gchar *curr_ch = g_utf8_offset_to_pointer(line, line_utf8_pos); - gunichar curr_uni = g_utf8_get_char(curr_ch); - line_utf8_pos--; - col--; - if (g_unichar_iswide(curr_uni)) { - col--; - } - - curr_ch = g_utf8_find_prev_char(line, curr_ch); - - gchar *prev_ch; - gunichar prev_uni; - while (curr_ch != NULL) { - curr_uni = g_utf8_get_char(curr_ch); - if (g_unichar_isspace(curr_uni)) { - curr_ch = g_utf8_find_prev_char(line, curr_ch); - line_utf8_pos--; - col--; - } else { - prev_ch = g_utf8_find_prev_char(line, curr_ch); - if (prev_ch == NULL) { - curr_ch = NULL; - break; - } else { - prev_uni = g_utf8_get_char(prev_ch); - line_utf8_pos--; - col--; - if (g_unichar_iswide(prev_uni)) { - col--; - } - if (g_unichar_isspace(prev_uni)) { - break; - } else { - curr_ch = prev_ch; - } - } - } - } - - if (curr_ch == NULL) { - col = 0; - wmove(inp_win, 0, col); - } else { - col++; - line_utf8_pos++; - wmove(inp_win, 0, col); - } - - // if gone off screen to left, jump left (half a screen worth) - int wcols = getmaxx(stdscr); - if (col <= pad_start) { - pad_start = pad_start - (wcols / 2); - if (pad_start < 0) { - pad_start = 0; - } - - _inp_win_update_virtual(); - } + if (_is_ctrl_left(key_type, ch)) { + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, wcols); + wmove(inp_win, 0, col); return 1; // CTRL-RIGHT @@ -353,7 +298,6 @@ _handle_edit(int key_type, const wint_t ch) wmove(inp_win, 0, col); // if gone off screen to right, jump right (half a screen worth) - int wcols = getmaxx(stdscr); if (col > pad_start + wcols) { pad_start = pad_start + (wcols / 2); _inp_win_update_virtual(); @@ -464,7 +408,7 @@ _handle_edit(int key_type, const wint_t ch) line_utf8_pos--; // current position off screen to left - if (col - 1 < pad_start) { + if (col < pad_start) { pad_start--; _inp_win_update_virtual(); } @@ -490,7 +434,7 @@ _handle_edit(int key_type, const wint_t ch) // current position off screen to right int wcols = getmaxx(stdscr); - if ((col + 1 - pad_start) >= wcols) { + if ((col - pad_start) >= wcols) { pad_start++; _inp_win_update_virtual(); } diff --git a/src/ui/keyhandlers.c b/src/ui/keyhandlers.c index 513997ef..d7c3c616 100644 --- a/src/ui/keyhandlers.c +++ b/src/ui/keyhandlers.c @@ -48,7 +48,6 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int // handle insert if not at end of input if (*line_utf8_pos < utf8_len) { - // create new line char bytes[MB_CUR_MAX]; size_t utf8_ch_len = wcrtomb(bytes, ch, NULL); bytes[utf8_ch_len] = '\0'; @@ -62,35 +61,29 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int g_free(end); g_string_free(new_line_str, FALSE); - // replace old line strncpy(line, new_line, INP_WIN_MAX); free(new_line); - // set utf8 position + gunichar uni = g_utf8_get_char(bytes); + if (*col == (*pad_start + wcols)) { + (*pad_start)++; + if (g_unichar_iswide(uni)) { + (*pad_start)++; + } + } + (*line_utf8_pos)++; - // set col position (*col)++; - gunichar uni = g_utf8_get_char(bytes); if (g_unichar_iswide(uni)) { (*col)++; } - // set pad_start - int display_len = utf8_display_len(line); - (*pad_start) = 0; - if (display_len > wcols-2) { - (*pad_start) = display_len - wcols + 1; - } - // otherwise just append } else { char bytes[MB_CUR_MAX+1]; size_t utf8_ch_len = wcrtomb(bytes, ch, NULL); - - // wcrtomb can return (size_t) -1 if (utf8_ch_len < MB_CUR_MAX) { - // update old line int i; int bytes_len = strlen(line); @@ -99,10 +92,8 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int } line[bytes_len] = '\0'; - // set utf8 position (*line_utf8_pos)++; - // set col position (*col)++; bytes[utf8_ch_len] = '\0'; gunichar uni = g_utf8_get_char(bytes); @@ -110,9 +101,7 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int (*col)++; } - // set pad_start - // if gone over screen size follow input - if (*col - *pad_start > wcols-2) { + if (*col - *pad_start > wcols-1) { (*pad_start)++; if (g_unichar_iswide(uni)) { (*pad_start)++; @@ -120,4 +109,63 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int } } } -} \ No newline at end of file +} + +void +key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int wcols) +{ + if (*line_utf8_pos == 0) { + return; + } + + gchar *curr_ch = g_utf8_offset_to_pointer(line, *line_utf8_pos); + gunichar curr_uni = g_utf8_get_char(curr_ch); + (*line_utf8_pos)--; + (*col)--; + if (g_unichar_iswide(curr_uni)) { + (*col)--; + } + + curr_ch = g_utf8_find_prev_char(line, curr_ch); + + gchar *prev_ch; + gunichar prev_uni; + while (curr_ch != NULL) { + curr_uni = g_utf8_get_char(curr_ch); + if (g_unichar_isspace(curr_uni)) { + curr_ch = g_utf8_find_prev_char(line, curr_ch); + (*line_utf8_pos)--; + (*col)--; + } else { + prev_ch = g_utf8_find_prev_char(line, curr_ch); + if (prev_ch == NULL) { + curr_ch = NULL; + break; + } else { + prev_uni = g_utf8_get_char(prev_ch); + (*line_utf8_pos)--; + (*col)--; + if (g_unichar_iswide(prev_uni)) { + (*col)--; + } + if (g_unichar_isspace(prev_uni)) { + break; + } else { + curr_ch = prev_ch; + } + } + } + } + + if (curr_ch == NULL) { + (*col) = 0; + (*line_utf8_pos) = 0; + } else { + (*col)++; + (*line_utf8_pos)++; + } + + if (*col < *pad_start) { + *pad_start = *col; + } +} diff --git a/src/ui/keyhandlers.h b/src/ui/keyhandlers.h index cb1b14d8..d8153356 100644 --- a/src/ui/keyhandlers.h +++ b/src/ui/keyhandlers.h @@ -39,4 +39,6 @@ void key_printable(char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const wint_t ch, const int wcols); +void key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int wcols); + #endif |