diff options
Diffstat (limited to 'src/ui/inputwin.c')
-rw-r--r-- | src/ui/inputwin.c | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index 64c65a96..4b3ec296 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -39,6 +39,9 @@ #include <string.h> #include <wchar.h> +#include <readline/readline.h> +#include <readline/history.h> + #ifdef HAVE_NCURSESW_NCURSES_H #include <ncursesw/ncurses.h> #elif HAVE_NCURSES_H @@ -77,6 +80,11 @@ static WINDOW *inp_win; static History history; +static struct timeval p_rl_timeout; +static fd_set fds; +static int r; +static gboolean cmd_result = TRUE; + // input line static char line[INP_WIN_MAX]; // current position in the utf8 string @@ -95,6 +103,17 @@ static gboolean _is_ctrl_right(int key_type, const wint_t ch); static void _inp_win_update_virtual(void); +static void +cb_linehandler(char *line) +{ + if (*line) { + add_history(line); + } + rl_redisplay(); + cmd_result = cmd_process_input(line); + free(line); +} + void create_input_window(void) { @@ -103,6 +122,10 @@ create_input_window(void) #else ESCDELAY = 25; #endif + p_rl_timeout.tv_sec = 0; + p_rl_timeout.tv_usec = 500000; + rl_callback_handler_install(NULL, cb_linehandler); + inp_win = newpad(1, INP_WIN_MAX); wbkgd(inp_win, theme_attrs(THEME_INPUT_TEXT));; keypad(inp_win, TRUE); @@ -169,9 +192,9 @@ inp_write(char *line, int offset) } void -inp_non_block(gint timeout) +inp_non_block(gint block_timeout) { - wtimeout(inp_win, timeout); + wtimeout(inp_win, block_timeout); } void @@ -180,6 +203,35 @@ inp_block(void) wtimeout(inp_win, -1); } +gboolean +inp_readline(void) +{ + FD_ZERO(&fds); + FD_SET(fileno (rl_instream), &fds); + r = select(FD_SETSIZE, &fds, NULL, NULL, &p_rl_timeout); + if (r < 0) { + log_error("Readline failed."); + rl_callback_handler_remove(); + return false; + } + + if (FD_ISSET (fileno (rl_instream), &fds)) { + rl_callback_read_char(); + inp_write(rl_line_buffer, rl_point); + } + + p_rl_timeout.tv_sec = 0; + p_rl_timeout.tv_usec = 500000; + + return cmd_result; +} + +void +inp_close(void) +{ + rl_callback_handler_remove(); +} + char * inp_read(int *key_type, wint_t *ch) { |