diff --git a/ChangeLog b/ChangeLog index 9433f8f74..a6dd8e83b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,8 @@ http://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes] Version 0.4.1 (under dev!) -------------------------- +* core: fix refresh of item "completion": clear it after any action that is + changing content of command line and after switch of buffer (bug #38214) * core: add support of multiple layouts (task #11274) * core: add signals nicklist_{group|nick}_removing and hsignals nicklist_{group|nick}_{added|removing|changed} diff --git a/src/gui/curses/gui-curses-key.c b/src/gui/curses/gui-curses-key.c index 9cde635f9..3d632886b 100644 --- a/src/gui/curses/gui-curses-key.c +++ b/src/gui/curses/gui-curses-key.c @@ -419,10 +419,9 @@ gui_key_flush (int paste) gui_buffer_undo_snap (gui_current_window->buffer); gui_input_insert_string (gui_current_window->buffer, key_str, -1); - if (gui_current_window->buffer->completion) - gui_completion_stop (gui_current_window->buffer->completion, 0); gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, - (!paste || !undo_done) ? 1 : 0); + (!paste || !undo_done) ? 1 : 0, + 1); /* stop completion */ undo_done = 1; } diff --git a/src/gui/curses/gui-curses-mouse.c b/src/gui/curses/gui-curses-mouse.c index 7d49e174c..6cdfa85f7 100644 --- a/src/gui/curses/gui-curses-mouse.c +++ b/src/gui/curses/gui-curses-mouse.c @@ -197,9 +197,9 @@ gui_mouse_grab_end (const char *mouse_key) } gui_input_insert_string (gui_current_window->buffer, mouse_key_input, -1); - if (gui_current_window->buffer->completion) - gui_completion_stop (gui_current_window->buffer->completion, 1); - gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 1); + gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, + 1, /* save undo */ + 1); /* stop completion */ } gui_mouse_grab = 0; diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index d133f8c94..bb62d3d01 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -1645,7 +1645,9 @@ gui_buffer_set (struct t_gui_buffer *buffer, const char *property, { gui_buffer_undo_snap (buffer); gui_input_replace_input (buffer, value); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } else if (string_strcasecmp (property, "input_pos") == 0) { diff --git a/src/gui/gui-chat.c b/src/gui/gui-chat.c index d63b33d87..3fe661635 100644 --- a/src/gui/gui-chat.c +++ b/src/gui/gui-chat.c @@ -947,7 +947,9 @@ gui_chat_hsignal_quote_line_cb (void *data, const char *signal, && CONFIG_STRING(config_look_prefix_suffix)[0]) ? " " : "", message); gui_input_insert_string (gui_current_window->buffer, str, -1); - gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 1); + gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, + 1, /* save undo */ + 1); /* stop completion */ free (str); } diff --git a/src/gui/gui-completion.c b/src/gui/gui-completion.c index 642f49f91..455b9b87c 100644 --- a/src/gui/gui-completion.c +++ b/src/gui/gui-completion.c @@ -195,12 +195,15 @@ gui_completion_free (struct t_gui_completion *completion) */ void -gui_completion_stop (struct t_gui_completion *completion, - int remove_partial_completion_list) +gui_completion_stop (struct t_gui_completion *completion) { + if (!completion) + return; + completion->context = GUI_COMPLETION_NULL; completion->position = -1; - if (remove_partial_completion_list) + + if (completion->partial_completion_list) { gui_completion_partial_list_free_all (completion); hook_signal_send ("partial_completion", @@ -424,7 +427,7 @@ gui_completion_build_list_template (struct t_gui_completion *completion, switch (pos[0]) { case '-': /* stop completion */ - gui_completion_stop (completion, 1); + gui_completion_stop (completion); free (word); return; break; @@ -582,7 +585,7 @@ gui_completion_build_list (struct t_gui_completion *completion) if (strcmp (HOOK_COMMAND(ptr_hook, completion), "-") == 0) { - gui_completion_stop (completion, 1); + gui_completion_stop (completion); return; } @@ -990,7 +993,7 @@ gui_completion_complete (struct t_gui_completion *completion) if (item_is_nick && CONFIG_BOOLEAN(config_completion_nick_first_only)) { - gui_completion_stop (completion, 1); + gui_completion_stop (completion); return; } diff --git a/src/gui/gui-completion.h b/src/gui/gui-completion.h index 6c2b88fdd..1ab6740a6 100644 --- a/src/gui/gui-completion.h +++ b/src/gui/gui-completion.h @@ -68,8 +68,7 @@ struct t_gui_completion extern void gui_completion_buffer_init (struct t_gui_completion *completion, struct t_gui_buffer *buffer); extern void gui_completion_free (struct t_gui_completion *completion); -extern void gui_completion_stop (struct t_gui_completion *completion, - int remove_partial_completion_list); +extern void gui_completion_stop (struct t_gui_completion *completion); extern void gui_completion_list_add (struct t_gui_completion *completion, const char *word, int nick_completion, const char *where); diff --git a/src/gui/gui-cursor.c b/src/gui/gui-cursor.c index be0deebb2..825a1ea9f 100644 --- a/src/gui/gui-cursor.c +++ b/src/gui/gui-cursor.c @@ -67,7 +67,9 @@ gui_cursor_mode_toggle () /* restore input (and move cursor in input) */ if (gui_cursor_debug) gui_input_delete_line (gui_current_window->buffer); - gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 0); + gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, + 0, /* save undo */ + 1); /* stop completion */ gui_buffer_ask_chat_refresh (gui_current_window->buffer, 2); } } diff --git a/src/gui/gui-input.c b/src/gui/gui-input.c index 535b849f3..82453093e 100644 --- a/src/gui/gui-input.c +++ b/src/gui/gui-input.c @@ -82,7 +82,7 @@ gui_input_optimize_size (struct t_gui_buffer *buffer) } /* - * Replaces full input by another string, trying to keep cursor position is new + * Replaces full input by another string, trying to keep cursor position if new * string is long enough. */ @@ -132,7 +132,8 @@ gui_input_paste_pending_signal () void gui_input_text_changed_modifier_and_signal (struct t_gui_buffer *buffer, - int save_undo) + int save_undo, + int stop_completion) { char str_buffer[128], *new_input; @@ -161,6 +162,9 @@ gui_input_text_changed_modifier_and_signal (struct t_gui_buffer *buffer, } } + if (stop_completion) + gui_completion_stop (buffer->completion); + /* send signal */ hook_signal_send ("input_text_changed", WEECHAT_HOOK_SIGNAL_POINTER, buffer); } @@ -319,6 +323,8 @@ gui_input_move_to_buffer (struct t_gui_buffer *from_buffer, from_buffer->last_input_undo = NULL; from_buffer->ptr_input_undo = NULL; from_buffer->input_undo_count = 0; + + gui_completion_stop (from_buffer->completion); } /* @@ -355,9 +361,9 @@ gui_input_clipboard_paste (struct t_gui_buffer *buffer) gui_buffer_undo_snap (buffer); gui_input_insert_string (buffer, gui_input_clipboard, -1); - gui_completion_stop (buffer->completion, 1); - - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } } @@ -391,12 +397,13 @@ gui_input_return (struct t_gui_buffer *buffer) window->buffer->input_buffer_length = 0; window->buffer->input_buffer_pos = 0; window->buffer->input_buffer_1st_display = 0; - gui_completion_stop (window->buffer->completion, 1); gui_buffer_undo_free_all (window->buffer); window->buffer->ptr_history = NULL; gui_history_ptr = NULL; gui_input_optimize_size (window->buffer); - gui_input_text_changed_modifier_and_signal (window->buffer, 0); + gui_input_text_changed_modifier_and_signal (window->buffer, + 0, /* save undo */ + 1); /* stop completion */ input_data (window->buffer, command); free (command); } @@ -500,7 +507,9 @@ gui_input_complete_next (struct t_gui_buffer *buffer) utf8_real_pos (buffer->input_buffer, buffer->input_buffer_pos)); gui_input_complete (buffer); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 0); /* stop completion */ } } @@ -522,7 +531,9 @@ gui_input_complete_previous (struct t_gui_buffer *buffer) utf8_real_pos (buffer->input_buffer, buffer->input_buffer_pos)); gui_input_complete (buffer); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 0); /* stop completion */ } } @@ -641,8 +652,9 @@ gui_input_delete_previous_char (struct t_gui_buffer *buffer) buffer->input_buffer_pos--; buffer->input_buffer[buffer->input_buffer_size] = '\0'; gui_input_optimize_size (buffer); - gui_completion_stop (buffer->completion, 1); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } } @@ -670,8 +682,9 @@ gui_input_delete_next_char (struct t_gui_buffer *buffer) buffer->input_buffer_length--; buffer->input_buffer[buffer->input_buffer_size] = '\0'; gui_input_optimize_size (buffer); - gui_completion_stop (buffer->completion, 1); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } } @@ -727,8 +740,9 @@ gui_input_delete_previous_word (struct t_gui_buffer *buffer) buffer->input_buffer[buffer->input_buffer_size] = '\0'; buffer->input_buffer_pos -= length_deleted; gui_input_optimize_size (buffer); - gui_completion_stop (buffer->completion, 1); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } } @@ -766,8 +780,9 @@ gui_input_delete_next_word (struct t_gui_buffer *buffer) buffer->input_buffer_length -= length_deleted; buffer->input_buffer[buffer->input_buffer_size] = '\0'; gui_input_optimize_size (buffer); - gui_completion_stop (buffer->completion, 1); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } } @@ -799,8 +814,9 @@ gui_input_delete_beginning_of_line (struct t_gui_buffer *buffer) buffer->input_buffer[buffer->input_buffer_size] = '\0'; buffer->input_buffer_pos = 0; gui_input_optimize_size (buffer); - gui_completion_stop (buffer->completion, 1); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } } @@ -825,8 +841,9 @@ gui_input_delete_end_of_line (struct t_gui_buffer *buffer) buffer->input_buffer_size = strlen (buffer->input_buffer); buffer->input_buffer_length = utf8_strlen (buffer->input_buffer); gui_input_optimize_size (buffer); - gui_completion_stop (buffer->completion, 1); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } } @@ -845,8 +862,9 @@ gui_input_delete_line (struct t_gui_buffer *buffer) buffer->input_buffer_length = 0; buffer->input_buffer_pos = 0; gui_input_optimize_size (buffer); - gui_completion_stop (buffer->completion, 1); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } } @@ -880,9 +898,9 @@ gui_input_transpose_chars (struct t_gui_buffer *buffer) buffer->input_buffer_pos++; - gui_completion_stop (buffer->completion, 1); - - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ } } @@ -1080,7 +1098,9 @@ gui_input_history_previous (struct t_gui_window *window, window->buffer->input_buffer_pos = window->buffer->input_buffer_length; window->buffer->input_buffer_1st_display = 0; strcpy (window->buffer->input_buffer, (*ptr_history)->text); - gui_input_text_changed_modifier_and_signal (window->buffer, 0); + gui_input_text_changed_modifier_and_signal (window->buffer, + 0, /* save undo */ + 1); /* stop completion */ gui_buffer_undo_free_all (window->buffer); } @@ -1154,7 +1174,9 @@ gui_input_history_next (struct t_gui_window *window, } if (input_changed) { - gui_input_text_changed_modifier_and_signal (window->buffer, 0); + gui_input_text_changed_modifier_and_signal (window->buffer, + 0, /* save undo */ + 1); /* stop completion */ gui_buffer_undo_free_all (window->buffer); } } @@ -1535,7 +1557,9 @@ gui_input_insert (struct t_gui_buffer *buffer, const char *args) gui_buffer_undo_snap (buffer); args2 = string_convert_hex_chars (args); gui_input_insert_string (buffer, (args2) ? args2 : args, -1); - gui_input_text_changed_modifier_and_signal (buffer, 1); + gui_input_text_changed_modifier_and_signal (buffer, + 1, /* save undo */ + 1); /* stop completion */ if (args2) free (args2); } @@ -1552,7 +1576,9 @@ gui_input_undo_use (struct t_gui_buffer *buffer, struct t_gui_input_undo *undo) { gui_input_replace_input (buffer, undo->data); gui_input_set_pos (buffer, undo->pos); - gui_input_text_changed_modifier_and_signal (buffer, 0); + gui_input_text_changed_modifier_and_signal (buffer, + 0, /* save undo */ + 1); /* stop completion */ } } diff --git a/src/gui/gui-input.h b/src/gui/gui-input.h index 6c6e255ee..5d93cefcb 100644 --- a/src/gui/gui-input.h +++ b/src/gui/gui-input.h @@ -32,7 +32,8 @@ extern void gui_input_replace_input (struct t_gui_buffer *buffer, const char *new_input); extern void gui_input_paste_pending_signal (); extern void gui_input_text_changed_modifier_and_signal (struct t_gui_buffer *buffer, - int save_undo); + int save_undo, + int stop_completion); extern void gui_input_set_pos (struct t_gui_buffer *buffer, int pos); extern int gui_input_insert_string (struct t_gui_buffer *buffer, const char *string, int pos); diff --git a/src/gui/gui-key.c b/src/gui/gui-key.c index b8e9704dc..8a3138513 100644 --- a/src/gui/gui-key.c +++ b/src/gui/gui-key.c @@ -243,9 +243,9 @@ gui_key_grab_end_timer_cb (void *data, int remaining_calls) gui_input_insert_string (gui_current_window->buffer, ptr_key->command, -1); } } - if (gui_current_window->buffer->completion) - gui_completion_stop (gui_current_window->buffer->completion, 1); - gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 1); + gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, + 1, /* save undo */ + 1); /* stop completion */ } free (expanded_key); } diff --git a/src/gui/gui-window.c b/src/gui/gui-window.c index 5df31b910..9c99c6623 100644 --- a/src/gui/gui-window.c +++ b/src/gui/gui-window.c @@ -1561,7 +1561,9 @@ gui_window_search_stop (struct t_gui_window *window) { gui_input_insert_string (window->buffer, window->buffer->text_search_input, -1); - gui_input_text_changed_modifier_and_signal (window->buffer, 0); + gui_input_text_changed_modifier_and_signal (window->buffer, + 0, /* save undo */ + 1); /* stop completion */ free (window->buffer->text_search_input); window->buffer->text_search_input = NULL; }