From 4c6cfcdca0f7aec1f0e3243a60d88ed494357a5d Mon Sep 17 00:00:00 2001 From: James Booth Date: Fri, 16 Jan 2015 22:50:40 +0000 Subject: Simplified autocompleters and command history --- src/ui/core.c | 8 ++++---- src/ui/inputwin.c | 51 +++++++++++++++++++++++++++++++++++++-------------- src/ui/inputwin.h | 3 ++- src/ui/ui.h | 3 ++- 4 files changed, 45 insertions(+), 20 deletions(-) (limited to 'src/ui') diff --git a/src/ui/core.c b/src/ui/core.c index 3e4d2c80..14ea2c17 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -204,15 +204,15 @@ ui_readline(void) } void -ui_input_clear(void) +ui_inp_history_append(char *inp) { - inp_win_reset(); + inp_history_append(inp); } void -ui_replace_input(char *input, const char * const new_input, int *size) +ui_input_clear(void) { - inp_replace_input(input, new_input, size); + inp_win_reset(); } void diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index e9ea95e7..8bd64ffb 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -50,6 +50,7 @@ #include "config/accounts.h" #include "config/preferences.h" #include "config/theme.h" +#include "tools/history.h" #include "log.h" #include "muc.h" #include "profanity.h" @@ -72,6 +73,7 @@ #define KEY_CTRL_U 0025 #define KEY_CTRL_W 0027 +#define MAX_HISTORY 100 #define INP_WIN_MAX 1000 static WINDOW *inp_win; @@ -79,6 +81,7 @@ static int pad_start = 0; static int rows, cols; static char line[INP_WIN_MAX]; static int inp_size; +static History history; static int _handle_edit(int key_type, const wint_t ch); static int _handle_alt_key(int key); @@ -103,6 +106,7 @@ create_input_window(void) keypad(inp_win, TRUE); wmove(inp_win, 0, 0); _inp_win_update_virtual(); + history = history_new(MAX_HISTORY); } void @@ -227,7 +231,7 @@ inp_read(int *key_type, wint_t *ch) echo(); if (*ch == '\n') { - line[inp_size++] = '\0'; + line[inp_size] = '\0'; inp_size = 0; return strdup(line); } else { @@ -255,13 +259,13 @@ inp_put_back(void) } void -inp_replace_input(char *input, const char * const new_input, int *size) +inp_replace_input(const char * const new_input) { - strncpy(input, new_input, INP_WIN_MAX); - *size = strlen(input); + strncpy(line, new_input, INP_WIN_MAX); + inp_size = strlen(line); inp_win_reset(); - input[*size] = '\0'; - waddstr(inp_win, input); + line[inp_size] = '\0'; + waddstr(inp_win, line); _go_to_end(); } @@ -273,6 +277,12 @@ inp_win_reset(void) _inp_win_update_virtual(); } +void +inp_history_append(char *inp) +{ + history_append(history, inp); +} + static void _clear_input(void) { @@ -497,9 +507,10 @@ _handle_edit(int key_type, const wint_t ch) return 0; } case KEY_CTRL_P: - prev = cmd_history_previous(line, &inp_size); + line[inp_size] = '\0'; + prev = history_previous(history, line); if (prev) { - inp_replace_input(line, prev, &inp_size); + inp_replace_input(prev); } return 1; @@ -508,13 +519,14 @@ _handle_edit(int key_type, const wint_t ch) return 0; } case KEY_CTRL_N: - next = cmd_history_next(line, &inp_size); + line[inp_size] = '\0'; + next = history_next(history, line); if (next) { - inp_replace_input(line, next, &inp_size); + inp_replace_input(next); } else if (inp_size != 0) { line[inp_size] = '\0'; - cmd_history_append(line); - inp_replace_input(line, "", &inp_size); + history_append(history, line); + inp_replace_input(""); } return 1; @@ -538,10 +550,21 @@ _handle_edit(int key_type, const wint_t ch) case 9: // tab if (inp_size != 0) { + line[inp_size] = '\0'; if ((strncmp(line, "/", 1) != 0) && (ui_current_win_type() == WIN_MUC)) { - muc_autocomplete(line, &inp_size); + char *result = muc_autocomplete(line); + if (result) { + cons_debug("ac result = %s", result); + inp_replace_input(result); + free(result); + } } else if (strncmp(line, "/", 1) == 0) { - cmd_autocomplete(line, &inp_size); + char *result = cmd_autocomplete(line); + if (result) { + cons_debug("ac result = %s", result); + inp_replace_input(result); + free(result); + } } } return 1; diff --git a/src/ui/inputwin.h b/src/ui/inputwin.h index f121c9d9..39fde720 100644 --- a/src/ui/inputwin.h +++ b/src/ui/inputwin.h @@ -43,6 +43,7 @@ void inp_put_back(void); void inp_non_block(gint); void inp_block(void); void inp_get_password(char *passwd); -void inp_replace_input(char *input, const char * const new_input, int *size); +void inp_replace_input(const char * const new_input); +void inp_history_append(char *inp); #endif diff --git a/src/ui/ui.h b/src/ui/ui.h index 90dd4d28..99e73b4a 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -230,7 +230,6 @@ void ui_statusbar_new(const int win); char * ui_readline(void); void ui_input_clear(void); void ui_input_nonblocking(gboolean); -void ui_replace_input(char *input, const char * const new_input, int *size); void ui_invalid_command_usage(const char * const usage, void (*setting_func)(void)); @@ -240,6 +239,8 @@ void ui_open_xmlconsole_win(void); gboolean ui_win_has_unsaved_form(int num); +void ui_inp_history_append(char *inp); + // console window actions void cons_show(const char * const msg, ...); void cons_about(void); -- cgit 1.4.1-2-gfad0