core: fix refresh of item "completion" (bug #38214) (patch from Nils Görs)

The item is now cleared after any action that is changing content of command
line and after switch of buffer.
This commit is contained in:
Sebastien Helleu 2013-03-17 19:44:39 +01:00
parent a290589f7c
commit 3e1d811761
12 changed files with 90 additions and 52 deletions

View File

@ -14,6 +14,8 @@ http://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes]
Version 0.4.1 (under dev!) 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 support of multiple layouts (task #11274)
* core: add signals nicklist_{group|nick}_removing and hsignals * core: add signals nicklist_{group|nick}_removing and hsignals
nicklist_{group|nick}_{added|removing|changed} nicklist_{group|nick}_{added|removing|changed}

View File

@ -419,10 +419,9 @@ gui_key_flush (int paste)
gui_buffer_undo_snap (gui_current_window->buffer); gui_buffer_undo_snap (gui_current_window->buffer);
gui_input_insert_string (gui_current_window->buffer, gui_input_insert_string (gui_current_window->buffer,
key_str, -1); 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, 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; undo_done = 1;
} }

View File

@ -197,9 +197,9 @@ gui_mouse_grab_end (const char *mouse_key)
} }
gui_input_insert_string (gui_current_window->buffer, gui_input_insert_string (gui_current_window->buffer,
mouse_key_input, -1); mouse_key_input, -1);
if (gui_current_window->buffer->completion) gui_input_text_changed_modifier_and_signal (gui_current_window->buffer,
gui_completion_stop (gui_current_window->buffer->completion, 1); 1, /* save undo */
gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 1); 1); /* stop completion */
} }
gui_mouse_grab = 0; gui_mouse_grab = 0;

View File

@ -1645,7 +1645,9 @@ gui_buffer_set (struct t_gui_buffer *buffer, const char *property,
{ {
gui_buffer_undo_snap (buffer); gui_buffer_undo_snap (buffer);
gui_input_replace_input (buffer, value); 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) else if (string_strcasecmp (property, "input_pos") == 0)
{ {

View File

@ -947,7 +947,9 @@ gui_chat_hsignal_quote_line_cb (void *data, const char *signal,
&& CONFIG_STRING(config_look_prefix_suffix)[0]) ? " " : "", && CONFIG_STRING(config_look_prefix_suffix)[0]) ? " " : "",
message); message);
gui_input_insert_string (gui_current_window->buffer, str, -1); 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); free (str);
} }

View File

@ -195,12 +195,15 @@ gui_completion_free (struct t_gui_completion *completion)
*/ */
void void
gui_completion_stop (struct t_gui_completion *completion, gui_completion_stop (struct t_gui_completion *completion)
int remove_partial_completion_list)
{ {
if (!completion)
return;
completion->context = GUI_COMPLETION_NULL; completion->context = GUI_COMPLETION_NULL;
completion->position = -1; completion->position = -1;
if (remove_partial_completion_list)
if (completion->partial_completion_list)
{ {
gui_completion_partial_list_free_all (completion); gui_completion_partial_list_free_all (completion);
hook_signal_send ("partial_completion", hook_signal_send ("partial_completion",
@ -424,7 +427,7 @@ gui_completion_build_list_template (struct t_gui_completion *completion,
switch (pos[0]) switch (pos[0])
{ {
case '-': /* stop completion */ case '-': /* stop completion */
gui_completion_stop (completion, 1); gui_completion_stop (completion);
free (word); free (word);
return; return;
break; break;
@ -582,7 +585,7 @@ gui_completion_build_list (struct t_gui_completion *completion)
if (strcmp (HOOK_COMMAND(ptr_hook, completion), "-") == 0) if (strcmp (HOOK_COMMAND(ptr_hook, completion), "-") == 0)
{ {
gui_completion_stop (completion, 1); gui_completion_stop (completion);
return; return;
} }
@ -990,7 +993,7 @@ gui_completion_complete (struct t_gui_completion *completion)
if (item_is_nick if (item_is_nick
&& CONFIG_BOOLEAN(config_completion_nick_first_only)) && CONFIG_BOOLEAN(config_completion_nick_first_only))
{ {
gui_completion_stop (completion, 1); gui_completion_stop (completion);
return; return;
} }

View File

@ -68,8 +68,7 @@ struct t_gui_completion
extern void gui_completion_buffer_init (struct t_gui_completion *completion, extern void gui_completion_buffer_init (struct t_gui_completion *completion,
struct t_gui_buffer *buffer); struct t_gui_buffer *buffer);
extern void gui_completion_free (struct t_gui_completion *completion); extern void gui_completion_free (struct t_gui_completion *completion);
extern void gui_completion_stop (struct t_gui_completion *completion, extern void gui_completion_stop (struct t_gui_completion *completion);
int remove_partial_completion_list);
extern void gui_completion_list_add (struct t_gui_completion *completion, extern void gui_completion_list_add (struct t_gui_completion *completion,
const char *word, const char *word,
int nick_completion, const char *where); int nick_completion, const char *where);

View File

@ -67,7 +67,9 @@ gui_cursor_mode_toggle ()
/* restore input (and move cursor in input) */ /* restore input (and move cursor in input) */
if (gui_cursor_debug) if (gui_cursor_debug)
gui_input_delete_line (gui_current_window->buffer); 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); gui_buffer_ask_chat_refresh (gui_current_window->buffer, 2);
} }
} }

View File

@ -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. * string is long enough.
*/ */
@ -132,7 +132,8 @@ gui_input_paste_pending_signal ()
void void
gui_input_text_changed_modifier_and_signal (struct t_gui_buffer *buffer, 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; 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 */ /* send signal */
hook_signal_send ("input_text_changed", WEECHAT_HOOK_SIGNAL_POINTER, buffer); 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->last_input_undo = NULL;
from_buffer->ptr_input_undo = NULL; from_buffer->ptr_input_undo = NULL;
from_buffer->input_undo_count = 0; 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_buffer_undo_snap (buffer);
gui_input_insert_string (buffer, gui_input_insert_string (buffer,
gui_input_clipboard, -1); gui_input_clipboard, -1);
gui_completion_stop (buffer->completion, 1); gui_input_text_changed_modifier_and_signal (buffer,
1, /* save undo */
gui_input_text_changed_modifier_and_signal (buffer, 1); 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_length = 0;
window->buffer->input_buffer_pos = 0; window->buffer->input_buffer_pos = 0;
window->buffer->input_buffer_1st_display = 0; window->buffer->input_buffer_1st_display = 0;
gui_completion_stop (window->buffer->completion, 1);
gui_buffer_undo_free_all (window->buffer); gui_buffer_undo_free_all (window->buffer);
window->buffer->ptr_history = NULL; window->buffer->ptr_history = NULL;
gui_history_ptr = NULL; gui_history_ptr = NULL;
gui_input_optimize_size (window->buffer); 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); input_data (window->buffer, command);
free (command); free (command);
} }
@ -500,7 +507,9 @@ gui_input_complete_next (struct t_gui_buffer *buffer)
utf8_real_pos (buffer->input_buffer, utf8_real_pos (buffer->input_buffer,
buffer->input_buffer_pos)); buffer->input_buffer_pos));
gui_input_complete (buffer); 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, utf8_real_pos (buffer->input_buffer,
buffer->input_buffer_pos)); buffer->input_buffer_pos));
gui_input_complete (buffer); 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_pos--;
buffer->input_buffer[buffer->input_buffer_size] = '\0'; buffer->input_buffer[buffer->input_buffer_size] = '\0';
gui_input_optimize_size (buffer); gui_input_optimize_size (buffer);
gui_completion_stop (buffer->completion, 1); gui_input_text_changed_modifier_and_signal (buffer,
gui_input_text_changed_modifier_and_signal (buffer, 1); 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_length--;
buffer->input_buffer[buffer->input_buffer_size] = '\0'; buffer->input_buffer[buffer->input_buffer_size] = '\0';
gui_input_optimize_size (buffer); gui_input_optimize_size (buffer);
gui_completion_stop (buffer->completion, 1); gui_input_text_changed_modifier_and_signal (buffer,
gui_input_text_changed_modifier_and_signal (buffer, 1); 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[buffer->input_buffer_size] = '\0';
buffer->input_buffer_pos -= length_deleted; buffer->input_buffer_pos -= length_deleted;
gui_input_optimize_size (buffer); gui_input_optimize_size (buffer);
gui_completion_stop (buffer->completion, 1); gui_input_text_changed_modifier_and_signal (buffer,
gui_input_text_changed_modifier_and_signal (buffer, 1); 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_length -= length_deleted;
buffer->input_buffer[buffer->input_buffer_size] = '\0'; buffer->input_buffer[buffer->input_buffer_size] = '\0';
gui_input_optimize_size (buffer); gui_input_optimize_size (buffer);
gui_completion_stop (buffer->completion, 1); gui_input_text_changed_modifier_and_signal (buffer,
gui_input_text_changed_modifier_and_signal (buffer, 1); 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[buffer->input_buffer_size] = '\0';
buffer->input_buffer_pos = 0; buffer->input_buffer_pos = 0;
gui_input_optimize_size (buffer); gui_input_optimize_size (buffer);
gui_completion_stop (buffer->completion, 1); gui_input_text_changed_modifier_and_signal (buffer,
gui_input_text_changed_modifier_and_signal (buffer, 1); 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_size = strlen (buffer->input_buffer);
buffer->input_buffer_length = utf8_strlen (buffer->input_buffer); buffer->input_buffer_length = utf8_strlen (buffer->input_buffer);
gui_input_optimize_size (buffer); gui_input_optimize_size (buffer);
gui_completion_stop (buffer->completion, 1); gui_input_text_changed_modifier_and_signal (buffer,
gui_input_text_changed_modifier_and_signal (buffer, 1); 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_length = 0;
buffer->input_buffer_pos = 0; buffer->input_buffer_pos = 0;
gui_input_optimize_size (buffer); gui_input_optimize_size (buffer);
gui_completion_stop (buffer->completion, 1); gui_input_text_changed_modifier_and_signal (buffer,
gui_input_text_changed_modifier_and_signal (buffer, 1); 1, /* save undo */
1); /* stop completion */
} }
} }
@ -880,9 +898,9 @@ gui_input_transpose_chars (struct t_gui_buffer *buffer)
buffer->input_buffer_pos++; buffer->input_buffer_pos++;
gui_completion_stop (buffer->completion, 1); gui_input_text_changed_modifier_and_signal (buffer,
1, /* save undo */
gui_input_text_changed_modifier_and_signal (buffer, 1); 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_pos = window->buffer->input_buffer_length;
window->buffer->input_buffer_1st_display = 0; window->buffer->input_buffer_1st_display = 0;
strcpy (window->buffer->input_buffer, (*ptr_history)->text); 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); gui_buffer_undo_free_all (window->buffer);
} }
@ -1154,7 +1174,9 @@ gui_input_history_next (struct t_gui_window *window,
} }
if (input_changed) 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); 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); gui_buffer_undo_snap (buffer);
args2 = string_convert_hex_chars (args); args2 = string_convert_hex_chars (args);
gui_input_insert_string (buffer, (args2) ? args2 : args, -1); 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) if (args2)
free (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_replace_input (buffer, undo->data);
gui_input_set_pos (buffer, undo->pos); 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 */
} }
} }

View File

@ -32,7 +32,8 @@ extern void gui_input_replace_input (struct t_gui_buffer *buffer,
const char *new_input); const char *new_input);
extern void gui_input_paste_pending_signal (); extern void gui_input_paste_pending_signal ();
extern void gui_input_text_changed_modifier_and_signal (struct t_gui_buffer *buffer, 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 void gui_input_set_pos (struct t_gui_buffer *buffer, int pos);
extern int gui_input_insert_string (struct t_gui_buffer *buffer, extern int gui_input_insert_string (struct t_gui_buffer *buffer,
const char *string, int pos); const char *string, int pos);

View File

@ -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); gui_input_insert_string (gui_current_window->buffer, ptr_key->command, -1);
} }
} }
if (gui_current_window->buffer->completion) gui_input_text_changed_modifier_and_signal (gui_current_window->buffer,
gui_completion_stop (gui_current_window->buffer->completion, 1); 1, /* save undo */
gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 1); 1); /* stop completion */
} }
free (expanded_key); free (expanded_key);
} }

View File

@ -1561,7 +1561,9 @@ gui_window_search_stop (struct t_gui_window *window)
{ {
gui_input_insert_string (window->buffer, gui_input_insert_string (window->buffer,
window->buffer->text_search_input, -1); 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); free (window->buffer->text_search_input);
window->buffer->text_search_input = NULL; window->buffer->text_search_input = NULL;
} }