summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/curses/gui-curses-keyboard.c1
-rw-r--r--src/gui/gui-action.c120
-rw-r--r--src/gui/gui-common.c109
-rw-r--r--src/gui/gui-keyboard.c2
-rw-r--r--src/gui/gui.h2
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);