diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/curses/gui-curses-keyboard.c | 1 | ||||
-rw-r--r-- | src/gui/gui-action.c | 120 | ||||
-rw-r--r-- | src/gui/gui-common.c | 109 | ||||
-rw-r--r-- | src/gui/gui-keyboard.c | 2 | ||||
-rw-r--r-- | src/gui/gui.h | 2 |
5 files changed, 133 insertions, 101 deletions
diff --git a/src/gui/curses/gui-curses-keyboard.c b/src/gui/curses/gui-curses-keyboard.c index 02a1c2f6c..25fe4ccfd 100644 --- a/src/gui/curses/gui-curses-keyboard.c +++ b/src/gui/curses/gui-curses-keyboard.c @@ -51,6 +51,7 @@ gui_keyboard_default_bindings () gui_keyboard_bind ( /* RC */ "ctrl-M", "return"); gui_keyboard_bind ( /* RC */ "ctrl-J", "return"); gui_keyboard_bind ( /* tab */ "ctrl-I", "tab"); + gui_keyboard_bind ( /* s-tab */ "meta2-Z", "tab_previous"); gui_keyboard_bind ( /* basckp */ "ctrl-H", "backspace"); gui_keyboard_bind ( /* basckp */ "ctrl-?", "backspace"); gui_keyboard_bind ( /* del */ "meta2-3~", "delete"); diff --git a/src/gui/gui-action.c b/src/gui/gui-action.c index b23d26354..75784c39d 100644 --- a/src/gui/gui-action.c +++ b/src/gui/gui-action.c @@ -125,114 +125,32 @@ gui_action_return (t_gui_window *window) void gui_action_tab (t_gui_window *window) { - int i; + if (window->buffer->has_input) + { + completion_search (&(window->buffer->completion), 1, + window->buffer->input_buffer, + window->buffer->input_buffer_size, + utf8_real_pos (window->buffer->input_buffer, + window->buffer->input_buffer_pos)); + gui_input_complete (window); + } +} +/* + * gui_action_tab_previous: shift-tab key => find previous completion + */ + +void +gui_action_tab_previous (t_gui_window *window) +{ if (window->buffer->has_input) { - completion_search (&(window->buffer->completion), + completion_search (&(window->buffer->completion), -1, window->buffer->input_buffer, window->buffer->input_buffer_size, utf8_real_pos (window->buffer->input_buffer, window->buffer->input_buffer_pos)); - - if (window->buffer->completion.word_found) - { - /* replace word with new completed word into input buffer */ - if (window->buffer->completion.diff_size > 0) - { - window->buffer->input_buffer_size += - window->buffer->completion.diff_size; - window->buffer->input_buffer_length += - window->buffer->completion.diff_length; - gui_input_optimize_size (window->buffer); - window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0'; - window->buffer->input_buffer_color_mask[window->buffer->input_buffer_size] = '\0'; - for (i = window->buffer->input_buffer_size - 1; - i >= window->buffer->completion.position_replace + - (int)strlen (window->buffer->completion.word_found); i--) - { - window->buffer->input_buffer[i] = - window->buffer->input_buffer[i - window->buffer->completion.diff_size]; - window->buffer->input_buffer_color_mask[i] = - window->buffer->input_buffer_color_mask[i - window->buffer->completion.diff_size]; - } - } - else - { - for (i = window->buffer->completion.position_replace + - strlen (window->buffer->completion.word_found); - i < window->buffer->input_buffer_size; i++) - { - window->buffer->input_buffer[i] = - window->buffer->input_buffer[i - window->buffer->completion.diff_size]; - window->buffer->input_buffer_color_mask[i] = - window->buffer->input_buffer_color_mask[i - window->buffer->completion.diff_size]; - } - window->buffer->input_buffer_size += - window->buffer->completion.diff_size; - window->buffer->input_buffer_length += - window->buffer->completion.diff_length; - gui_input_optimize_size (window->buffer); - window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0'; - window->buffer->input_buffer_color_mask[window->buffer->input_buffer_size] = '\0'; - } - - strncpy (window->buffer->input_buffer + window->buffer->completion.position_replace, - window->buffer->completion.word_found, - strlen (window->buffer->completion.word_found)); - for (i = 0; i < (int)strlen (window->buffer->completion.word_found); i++) - { - window->buffer->input_buffer_color_mask[window->buffer->completion.position_replace + i] = ' '; - } - window->buffer->input_buffer_pos = - utf8_pos (window->buffer->input_buffer, - window->buffer->completion.position_replace) + - utf8_strlen (window->buffer->completion.word_found); - - /* position is < 0 this means only one word was found to complete, - so reinit to stop completion */ - if (window->buffer->completion.position >= 0) - window->buffer->completion.position = - utf8_real_pos (window->buffer->input_buffer, - window->buffer->input_buffer_pos); - - /* add space or completor to the end of completion, if needed */ - if ((window->buffer->completion.context == COMPLETION_COMMAND) - || (window->buffer->completion.context == COMPLETION_COMMAND_ARG)) - { - if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer, - window->buffer->input_buffer_pos)] != ' ') - gui_insert_string_input (window, " ", - window->buffer->input_buffer_pos); - if (window->buffer->completion.position >= 0) - window->buffer->completion.position++; - window->buffer->input_buffer_pos++; - } - else - { - /* add nick completor if position 0 and completing nick */ - if ((window->buffer->completion.base_word_pos == 0) - && (window->buffer->completion.context == COMPLETION_NICK)) - { - if (strncmp (utf8_add_offset (window->buffer->input_buffer, - window->buffer->input_buffer_pos), - cfg_look_nick_completor, strlen (cfg_look_nick_completor)) != 0) - gui_insert_string_input (window, cfg_look_nick_completor, - window->buffer->input_buffer_pos); - if (window->buffer->completion.position >= 0) - window->buffer->completion.position += strlen (cfg_look_nick_completor); - window->buffer->input_buffer_pos += utf8_strlen (cfg_look_nick_completor); - if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer, - window->buffer->input_buffer_pos)] != ' ') - gui_insert_string_input (window, " ", - window->buffer->input_buffer_pos); - if (window->buffer->completion.position >= 0) - window->buffer->completion.position++; - window->buffer->input_buffer_pos++; - } - } - gui_input_draw (window->buffer, 0); - } + gui_input_complete (window); } } diff --git a/src/gui/gui-common.c b/src/gui/gui-common.c index 8a4833d58..9d63e7d4b 100644 --- a/src/gui/gui-common.c +++ b/src/gui/gui-common.c @@ -553,6 +553,115 @@ gui_input_move (t_gui_buffer *buffer, char *target, char *source, int size) } /* + * gui_input_complete: complete a word in input buffer + */ + +void +gui_input_complete (t_gui_window *window) +{ + int i; + + if (window->buffer->completion.word_found) + { + /* replace word with new completed word into input buffer */ + if (window->buffer->completion.diff_size > 0) + { + window->buffer->input_buffer_size += + window->buffer->completion.diff_size; + window->buffer->input_buffer_length += + window->buffer->completion.diff_length; + gui_input_optimize_size (window->buffer); + window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0'; + window->buffer->input_buffer_color_mask[window->buffer->input_buffer_size] = '\0'; + for (i = window->buffer->input_buffer_size - 1; + i >= window->buffer->completion.position_replace + + (int)strlen (window->buffer->completion.word_found); i--) + { + window->buffer->input_buffer[i] = + window->buffer->input_buffer[i - window->buffer->completion.diff_size]; + window->buffer->input_buffer_color_mask[i] = + window->buffer->input_buffer_color_mask[i - window->buffer->completion.diff_size]; + } + } + else + { + for (i = window->buffer->completion.position_replace + + strlen (window->buffer->completion.word_found); + i < window->buffer->input_buffer_size; i++) + { + window->buffer->input_buffer[i] = + window->buffer->input_buffer[i - window->buffer->completion.diff_size]; + window->buffer->input_buffer_color_mask[i] = + window->buffer->input_buffer_color_mask[i - window->buffer->completion.diff_size]; + } + window->buffer->input_buffer_size += + window->buffer->completion.diff_size; + window->buffer->input_buffer_length += + window->buffer->completion.diff_length; + gui_input_optimize_size (window->buffer); + window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0'; + window->buffer->input_buffer_color_mask[window->buffer->input_buffer_size] = '\0'; + } + + strncpy (window->buffer->input_buffer + window->buffer->completion.position_replace, + window->buffer->completion.word_found, + strlen (window->buffer->completion.word_found)); + for (i = 0; i < (int)strlen (window->buffer->completion.word_found); i++) + { + window->buffer->input_buffer_color_mask[window->buffer->completion.position_replace + i] = ' '; + } + window->buffer->input_buffer_pos = + utf8_pos (window->buffer->input_buffer, + window->buffer->completion.position_replace) + + utf8_strlen (window->buffer->completion.word_found); + + /* position is < 0 this means only one word was found to complete, + so reinit to stop completion */ + if (window->buffer->completion.position >= 0) + window->buffer->completion.position = + utf8_real_pos (window->buffer->input_buffer, + window->buffer->input_buffer_pos); + + /* add space or completor to the end of completion, if needed */ + if ((window->buffer->completion.context == COMPLETION_COMMAND) + || (window->buffer->completion.context == COMPLETION_COMMAND_ARG)) + { + if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer, + window->buffer->input_buffer_pos)] != ' ') + gui_insert_string_input (window, " ", + window->buffer->input_buffer_pos); + if (window->buffer->completion.position >= 0) + window->buffer->completion.position++; + window->buffer->input_buffer_pos++; + } + else + { + /* add nick completor if position 0 and completing nick */ + if ((window->buffer->completion.base_word_pos == 0) + && (window->buffer->completion.context == COMPLETION_NICK)) + { + if (strncmp (utf8_add_offset (window->buffer->input_buffer, + window->buffer->input_buffer_pos), + cfg_look_nick_completor, strlen (cfg_look_nick_completor)) != 0) + gui_insert_string_input (window, cfg_look_nick_completor, + window->buffer->input_buffer_pos); + if (window->buffer->completion.position >= 0) + window->buffer->completion.position += strlen (cfg_look_nick_completor); + window->buffer->input_buffer_pos += utf8_strlen (cfg_look_nick_completor); + if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer, + window->buffer->input_buffer_pos)] != ' ') + gui_insert_string_input (window, " ", + window->buffer->input_buffer_pos); + if (window->buffer->completion.position >= 0) + window->buffer->completion.position++; + window->buffer->input_buffer_pos++; + } + } + gui_input_draw (window->buffer, 0); + } +} + +/* * gui_exec_action_dcc: execute an action on a DCC after a user input * return -1 if DCC buffer was closed due to action, * 0 otherwise diff --git a/src/gui/gui-keyboard.c b/src/gui/gui-keyboard.c index d32bfda51..253c997b4 100644 --- a/src/gui/gui-keyboard.c +++ b/src/gui/gui-keyboard.c @@ -49,6 +49,8 @@ t_gui_key_function gui_key_functions[] = N_("terminate line") }, { "tab", gui_action_tab, N_("complete word") }, + { "tab_previous", gui_action_tab_previous, + N_("find previous completion for word") }, { "backspace", gui_action_backspace, N_("delete previous char") }, { "delete", gui_action_delete, diff --git a/src/gui/gui.h b/src/gui/gui.h index 7781bb38b..ff3036a65 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -106,6 +106,7 @@ extern void gui_action_clipboard_copy (char *, int); extern void gui_action_clipboard_paste (t_gui_window *); extern void gui_action_return (t_gui_window *); extern void gui_action_tab (t_gui_window *); +extern void gui_action_tab_previous (t_gui_window *); extern void gui_action_backspace (t_gui_window *); extern void gui_action_delete (t_gui_window *); extern void gui_action_delete_previous_word (t_gui_window *); @@ -174,6 +175,7 @@ extern void gui_printf_raw_data (void *, int, char *); extern void gui_input_optimize_size (t_gui_buffer *); extern void gui_input_init_color_mask (t_gui_buffer *); extern void gui_input_move (t_gui_buffer *, char *, char *, int ); +extern void gui_input_complete (t_gui_window *); extern void gui_exec_action_dcc (t_gui_window *, char *); extern void gui_exec_action_raw_data (t_gui_window *, char *); extern int gui_insert_string_input (t_gui_window *, char *, int); |