diff options
author | James Booth <boothj5@gmail.com> | 2015-01-27 22:13:09 +0000 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2015-01-27 22:13:09 +0000 |
commit | 2cdbfc7eb7d90ed286c6c5f432990166cdec0b93 (patch) | |
tree | 678c2bcd6edae1c335e428103bb2af9b7471b8a2 /src/ui | |
parent | 25d31101bfb365c8224ef09f84a92794a89e975f (diff) | |
download | profani-tty-2cdbfc7eb7d90ed286c6c5f432990166cdec0b93.tar.gz |
Added gnu readline
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/core.c | 6 | ||||
-rw-r--r-- | src/ui/inputwin.c | 80 | ||||
-rw-r--r-- | src/ui/inputwin.h | 1 | ||||
-rw-r--r-- | src/ui/keyhandlers.c | 55 | ||||
-rw-r--r-- | src/ui/keyhandlers.h | 5 | ||||
-rw-r--r-- | src/ui/ui.h | 1 |
6 files changed, 102 insertions, 46 deletions
diff --git a/src/ui/core.c b/src/ui/core.c index e295a3ad..efebdb5e 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -177,6 +177,12 @@ ui_close(void) endwin(); } +void +ui_write(char *line, int offset) +{ + inp_write(line, offset); +} + char* ui_readline(void) { diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index 7b5c33d0..64c65a96 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -131,6 +131,43 @@ inp_win_resize(void) _inp_win_update_virtual(); } +static int +offset_to_col(char *str, int offset) +{ + int i = 0; + int col = 0; + mbstate_t internal; + + while (i != offset && str[i] != '\n') { + gunichar uni = g_utf8_get_char(&str[i]); + size_t ch_len = mbrlen(&str[i], 4, &internal); + i += ch_len; + col++; + if (g_unichar_iswide(uni)) { + col++; + } + } + + return col; +} + +void +inp_write(char *line, int offset) +{ + int col = offset_to_col(line, offset); + + cons_debug("LEN BYTES: %d", strlen(line)); + cons_debug("LEN UTF8 : %d", g_utf8_strlen(line, -1)); + cons_debug("OFFSET : %d", offset); + cons_debug("COL : %d", col); + cons_debug(""); + + werase(inp_win); + waddstr(inp_win, line); + wmove(inp_win, 0, col); + _inp_win_update_virtual(); +} + void inp_non_block(gint timeout) { @@ -174,8 +211,8 @@ inp_read(int *key_type, wint_t *ch) } int col = getcurx(inp_win); - int wcols = getmaxx(stdscr); - key_printable(line, &line_utf8_pos, &col, &pad_start, *ch, wcols); + int maxx = getmaxx(stdscr); + key_printable(line, &line_utf8_pos, &col, &pad_start, *ch, maxx); werase(inp_win); waddstr(inp_win, line); @@ -265,44 +302,9 @@ _handle_edit(int key_type, const wint_t ch) return 1; // CTRL-RIGHT - } else if (line_utf8_pos < utf8_len && _is_ctrl_right(key_type, ch)) { - gchar *curr_ch = g_utf8_offset_to_pointer(line, line_utf8_pos); - gunichar curr_uni = g_utf8_get_char(curr_ch); - - // find next word if in whitespace - while (g_unichar_isspace(curr_uni)) { - col++; - line_utf8_pos++; - curr_ch = g_utf8_find_next_char(curr_ch, NULL); - if (!curr_ch) { - break; - } - curr_uni = g_utf8_get_char(curr_ch); - } - - if (curr_ch) { - while (!g_unichar_isspace(curr_uni)) { - line_utf8_pos++; - col++; - if (g_unichar_iswide(curr_uni)) { - col++; - } - curr_ch = g_utf8_find_next_char(curr_ch, NULL); - if (!curr_ch || line_utf8_pos >= utf8_len) { - break; - } - curr_uni = g_utf8_get_char(curr_ch); - } - } - + } else if (_is_ctrl_right(key_type, ch)) { + key_ctrl_right(line, &line_utf8_pos, &col, &pad_start, wcols); wmove(inp_win, 0, col); - - // if gone off screen to right, jump right (half a screen worth) - if (col > pad_start + wcols) { - pad_start = pad_start + (wcols / 2); - _inp_win_update_virtual(); - } - return 1; // ALT-LEFT diff --git a/src/ui/inputwin.h b/src/ui/inputwin.h index a4de16f0..d27bfef7 100644 --- a/src/ui/inputwin.h +++ b/src/ui/inputwin.h @@ -48,5 +48,6 @@ void inp_non_block(gint); void inp_block(void); void inp_get_password(char *passwd); void inp_history_append(char *inp); +void inp_write(char *line, int offset); #endif diff --git a/src/ui/keyhandlers.c b/src/ui/keyhandlers.c index d7c3c616..0836737b 100644 --- a/src/ui/keyhandlers.c +++ b/src/ui/keyhandlers.c @@ -42,7 +42,7 @@ #include "common.h" 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) +key_printable(char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const wint_t ch, const int maxx) { int utf8_len = g_utf8_strlen(line, -1); @@ -65,7 +65,7 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int free(new_line); gunichar uni = g_utf8_get_char(bytes); - if (*col == (*pad_start + wcols)) { + if (*col == (*pad_start + maxx)) { (*pad_start)++; if (g_unichar_iswide(uni)) { (*pad_start)++; @@ -101,7 +101,7 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int (*col)++; } - if (*col - *pad_start > wcols-1) { + if (*col - *pad_start > maxx-1) { (*pad_start)++; if (g_unichar_iswide(uni)) { (*pad_start)++; @@ -112,7 +112,7 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int } void -key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int wcols) +key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int maxx) { if (*line_utf8_pos == 0) { return; @@ -120,6 +120,7 @@ key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const co 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)) { @@ -145,7 +146,7 @@ key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const co prev_uni = g_utf8_get_char(prev_ch); (*line_utf8_pos)--; (*col)--; - if (g_unichar_iswide(prev_uni)) { + if (g_unichar_iswide(curr_uni)) { (*col)--; } if (g_unichar_isspace(prev_uni)) { @@ -169,3 +170,47 @@ key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const co *pad_start = *col; } } + +void +key_ctrl_right(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int maxx) +{ + int utf8_len = g_utf8_strlen(line, -1); + if (*line_utf8_pos >= utf8_len) { + return; + } + + gchar *curr_ch = g_utf8_offset_to_pointer(line, *line_utf8_pos); + gunichar curr_uni = g_utf8_get_char(curr_ch); + + // find next word if in whitespace + while (g_unichar_isspace(curr_uni)) { + (*col)++; + (*line_utf8_pos)++; + curr_ch = g_utf8_find_next_char(curr_ch, NULL); + if (!curr_ch) { + break; + } + curr_uni = g_utf8_get_char(curr_ch); + } + + if (curr_ch) { + while (!g_unichar_isspace(curr_uni)) { + (*line_utf8_pos)++; + (*col)++; + if (g_unichar_iswide(curr_uni)) { + (*col)++; + } + curr_ch = g_utf8_find_next_char(curr_ch, NULL); + if (!curr_ch || *line_utf8_pos >= utf8_len) { + break; + } + curr_uni = g_utf8_get_char(curr_ch); + } + } + + // if gone off screen to right, jump right (half a screen worth) +// if (col > pad_start + wcols) { +// pad_start = pad_start + (wcols / 2); +// _inp_win_update_virtual(); +// } +} diff --git a/src/ui/keyhandlers.h b/src/ui/keyhandlers.h index d8153356..62a2c0d6 100644 --- a/src/ui/keyhandlers.h +++ b/src/ui/keyhandlers.h @@ -37,8 +37,9 @@ #include <wchar.h> -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_printable(char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const wint_t ch, const int maxx); -void key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, 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 maxx); +void key_ctrl_right(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int maxx); #endif diff --git a/src/ui/ui.h b/src/ui/ui.h index 99e73b4a..23315af9 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -230,6 +230,7 @@ void ui_statusbar_new(const int win); char * ui_readline(void); void ui_input_clear(void); void ui_input_nonblocking(gboolean); +void ui_write(char *line, int offset); void ui_invalid_command_usage(const char * const usage, void (*setting_func)(void)); |