diff options
Diffstat (limited to 'src/ui/inputwin.c')
-rw-r--r-- | src/ui/inputwin.c | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index b42c366a..e4da800b 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -96,6 +96,7 @@ static void _inp_rl_addfuncs(void); static int _inp_rl_getc(FILE *stream); static void _inp_rl_linehandler(char *line); static int _inp_rl_tab_handler(int count, int key); +static int _inp_rl_shift_tab_handler(int count, int key); static int _inp_rl_win_clear_handler(int count, int key); static int _inp_rl_win_1_handler(int count, int key); static int _inp_rl_win_2_handler(int count, int key); @@ -421,6 +422,7 @@ _inp_rl_startup_hook(void) rl_bind_keyseq("\\eOs", _inp_rl_win_pagedown_handler); rl_bind_key('\t', _inp_rl_tab_handler); + rl_bind_keyseq("\\e[Z", _inp_rl_shift_tab_handler); // unbind unwanted mappings rl_bind_keyseq("\\e=", NULL); @@ -449,10 +451,27 @@ _inp_rl_linehandler(char *line) inp_line = line; } +static gboolean shift_tab = FALSE; + static int _inp_rl_getc(FILE *stream) { int ch = rl_getc(stream); + + // 27, 91, 90 = Shift tab + if (ch == 27) { + shift_tab = TRUE; + return ch; + } + if (shift_tab && ch == 91) { + return ch; + } + if (shift_tab && ch == 90) { + return ch; + } + + shift_tab = FALSE; + if (_inp_printable(ch)) { ProfWin *window = wins_get_current(); cmd_ac_reset(window); @@ -477,7 +496,35 @@ _inp_rl_tab_handler(int count, int key) ProfWin *current = wins_get_current(); if ((strncmp(rl_line_buffer, "/", 1) != 0) && (current->type == WIN_MUC)) { - char *result = muc_autocomplete(current, rl_line_buffer); + char *result = muc_autocomplete(current, rl_line_buffer, FALSE); + if (result) { + rl_replace_line(result, 1); + rl_point = rl_end; + free(result); + } + } else if (strncmp(rl_line_buffer, "/", 1) == 0) { + ProfWin *window = wins_get_current(); + char *result = cmd_ac_complete(window, rl_line_buffer, FALSE); + if (result) { + rl_replace_line(result, 1); + rl_point = rl_end; + free(result); + } + } + + return 0; +} + +static int +_inp_rl_shift_tab_handler(int count, int key) +{ + if (rl_point != rl_end || !rl_line_buffer) { + return 0; + } + + ProfWin *current = wins_get_current(); + if ((strncmp(rl_line_buffer, "/", 1) != 0) && (current->type == WIN_MUC)) { + char *result = muc_autocomplete(current, rl_line_buffer, TRUE); if (result) { rl_replace_line(result, 1); rl_point = rl_end; @@ -485,7 +532,7 @@ _inp_rl_tab_handler(int count, int key) } } else if (strncmp(rl_line_buffer, "/", 1) == 0) { ProfWin *window = wins_get_current(); - char *result = cmd_ac_complete(window, rl_line_buffer); + char *result = cmd_ac_complete(window, rl_line_buffer, TRUE); if (result) { rl_replace_line(result, 1); rl_point = rl_end; |