From 9f6caa4e031bd6aec4e2482e87b2246bfa8669a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Mon, 4 Nov 2024 18:00:23 +0100 Subject: [PATCH] core: send signal "buffer_moved" only when the buffer number changes (issue #2097) --- src/gui/gui-buffer.c | 59 ++++++++++++++++++++++++++++++++++---------- src/gui/gui-buffer.h | 1 + 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 4936cbc04..57745a5eb 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -95,8 +95,8 @@ char *gui_buffer_notify_string[GUI_BUFFER_NUM_NOTIFY] = { "none", "highlight", "message", "all" }; char *gui_buffer_properties_get_integer[] = -{ "opening", "number", "layout_number", "layout_number_merge_order", "type", - "notify", "num_displayed", "active", "hidden", "zoomed", +{ "opening", "number", "old_number", "layout_number", "layout_number_merge_order", + "type", "notify", "num_displayed", "active", "hidden", "zoomed", "print_hooks_enabled", "day_change", "clear", "filter", "closing", "lines_hidden", "prefix_max_length", "next_line_id", "time_for_each_line", "nicklist", "nicklist_case_sensitive", "nicklist_max_length", @@ -452,7 +452,8 @@ gui_buffer_find_pos (struct t_gui_buffer *buffer) */ void -gui_buffer_shift_numbers (struct t_gui_buffer *buffer) +gui_buffer_shift_numbers (struct t_gui_buffer *buffer, + int send_signal_buffer_moved) { struct t_gui_buffer *ptr_buffer; @@ -464,10 +465,13 @@ gui_buffer_shift_numbers (struct t_gui_buffer *buffer) break; } ptr_buffer->number++; - (void) gui_buffer_send_signal (ptr_buffer, - "buffer_moved", - WEECHAT_HOOK_SIGNAL_POINTER, - ptr_buffer); + if (send_signal_buffer_moved) + { + (void) gui_buffer_send_signal (ptr_buffer, + "buffer_moved", + WEECHAT_HOOK_SIGNAL_POINTER, + ptr_buffer); + } } } @@ -561,7 +565,11 @@ gui_buffer_insert (struct t_gui_buffer *buffer) gui_buffers = buffer; pos_buffer->prev_buffer = buffer; if (buffer->number == pos_buffer->number) - gui_buffer_shift_numbers (pos_buffer); + { + gui_buffer_shift_numbers ( + pos_buffer, + 1); /* send_signal_buffer_moved */ + } } else { @@ -4249,6 +4257,16 @@ gui_buffer_move_to_number (struct t_gui_buffer *buffer, int number) return; } + /* + * save old buffer numbers to send signal "buffer_moved" for each buffer + * really moved, after the move operation + */ + for (ptr_buffer = gui_buffers; ptr_buffer; + ptr_buffer = ptr_buffer->next_buffer) + { + ptr_buffer->old_number = ptr_buffer->number; + } + /* remove buffer(s) from list */ if (ptr_first_buffer->prev_buffer) (ptr_first_buffer->prev_buffer)->next_buffer = ptr_last_buffer->next_buffer; @@ -4301,7 +4319,9 @@ gui_buffer_move_to_number (struct t_gui_buffer *buffer, int number) if (ptr_last_buffer->next_buffer && (ptr_last_buffer->next_buffer->number == number)) { - gui_buffer_shift_numbers (ptr_last_buffer->next_buffer); + gui_buffer_shift_numbers ( + ptr_last_buffer->next_buffer, + 0); /* send_signal_buffer_moved */ } } else @@ -4324,9 +4344,16 @@ gui_buffer_move_to_number (struct t_gui_buffer *buffer, int number) last_gui_buffer = ptr_last_buffer; } - (void) gui_buffer_send_signal (buffer, - "buffer_moved", - WEECHAT_HOOK_SIGNAL_POINTER, buffer); + for (ptr_buffer = gui_buffers; ptr_buffer; + ptr_buffer = ptr_buffer->next_buffer) + { + if (ptr_buffer->number != ptr_buffer->old_number) + { + (void) gui_buffer_send_signal (ptr_buffer, + "buffer_moved", + WEECHAT_HOOK_SIGNAL_POINTER, ptr_buffer); + } + } } /* @@ -4672,7 +4699,9 @@ gui_buffer_unmerge (struct t_gui_buffer *buffer, int number) if (buffer->next_buffer && (buffer->next_buffer->number == number)) { - gui_buffer_shift_numbers (buffer->next_buffer); + gui_buffer_shift_numbers ( + buffer->next_buffer, + 1); /* send_signal_buffer_moved */ } gui_buffer_compute_num_displayed (); @@ -5267,6 +5296,7 @@ gui_buffer_hdata_buffer_cb (const void *pointer, void *data, HDATA_VAR(struct t_gui_buffer, plugin, POINTER, 0, NULL, "plugin"); HDATA_VAR(struct t_gui_buffer, plugin_name_for_upgrade, STRING, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, number, INTEGER, 0, NULL, NULL); + HDATA_VAR(struct t_gui_buffer, old_number, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, layout_number, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, layout_number_merge_order, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_buffer, name, STRING, 0, NULL, NULL); @@ -5465,6 +5495,8 @@ gui_buffer_add_to_infolist (struct t_infolist *infolist, return 0; if (!infolist_new_var_integer (ptr_item, "number", buffer->number)) return 0; + if (!infolist_new_var_integer (ptr_item, "old_number", buffer->old_number)) + return 0; if (!infolist_new_var_integer (ptr_item, "layout_number", buffer->layout_number)) return 0; if (!infolist_new_var_integer (ptr_item, "layout_number_merge_order", buffer->layout_number_merge_order)) @@ -5727,6 +5759,7 @@ gui_buffer_print_log () ptr_buffer->plugin, gui_buffer_get_plugin_name (ptr_buffer)); log_printf (" plugin_name_for_upgrade : '%s'", ptr_buffer->plugin_name_for_upgrade); log_printf (" number. . . . . . . . . : %d", ptr_buffer->number); + log_printf (" old_number. . . . . . . : %d", ptr_buffer->old_number); log_printf (" layout_number . . . . . : %d", ptr_buffer->layout_number); log_printf (" layout_number_merge_order: %d", ptr_buffer->layout_number_merge_order); log_printf (" name. . . . . . . . . . : '%s'", ptr_buffer->name); diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h index ce8670bcd..adb83547e 100644 --- a/src/gui/gui-buffer.h +++ b/src/gui/gui-buffer.h @@ -111,6 +111,7 @@ struct t_gui_buffer char *plugin_name_for_upgrade; /* plugin name when upgrading */ int number; /* buffer number (first is 1) */ + int old_number; /* internally used when moving buffer*/ int layout_number; /* number of buffer stored in layout */ int layout_number_merge_order; /* order in merge for layout */ char *name; /* buffer name */