From 4520b0f7aeb87b269d8590354def1681b68d4c0e Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sat, 7 Dec 2013 10:44:08 +0100 Subject: [PATCH] core: add option weechat.look.buffer_position The value of option can be: - "end": buffer is added after the end of list (number = last number + 1) - "first_gap": buffer is added at first number available in the list (after the end of list if no number is available) --- src/core/wee-config.c | 10 ++++++++ src/core/wee-config.h | 7 +++++ src/gui/gui-buffer.c | 59 ++++++++++++++++++++++++++++++++++++------- 3 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/core/wee-config.c b/src/core/wee-config.c index 9b3888ccf..cfcdf4f9a 100644 --- a/src/core/wee-config.c +++ b/src/core/wee-config.c @@ -86,6 +86,7 @@ struct t_config_option *config_look_bar_more_up; struct t_config_option *config_look_bar_more_down; struct t_config_option *config_look_buffer_auto_renumber; struct t_config_option *config_look_buffer_notify_default; +struct t_config_option *config_look_buffer_position; struct t_config_option *config_look_buffer_search_case_sensitive; struct t_config_option *config_look_buffer_search_force_default; struct t_config_option *config_look_buffer_search_regex; @@ -2008,6 +2009,15 @@ config_weechat_init_options () "none=never display in hotlist"), "none|highlight|message|all", 0, 0, "all", NULL, 0, NULL, NULL, &config_change_buffer_notify_default, NULL, NULL, NULL); + config_look_buffer_position = config_file_new_option ( + weechat_config_file, ptr_section, + "buffer_position", "integer", + N_("position of a new buffer: end = after the end of list (number = " + "last number + 1) (default), first_gap = at first available " + "number in the list (after the end of list if no number is " + "available); this option is used only if the buffer has no layout " + "number"), + "end|first_gap", 0, 0, "end", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); config_look_buffer_search_case_sensitive = config_file_new_option ( weechat_config_file, ptr_section, "buffer_search_case_sensitive", "boolean", diff --git a/src/core/wee-config.h b/src/core/wee-config.h index a5f1df7be..cefed77ee 100644 --- a/src/core/wee-config.h +++ b/src/core/wee-config.h @@ -37,6 +37,12 @@ enum t_config_look_align_end_of_lines CONFIG_LOOK_ALIGN_END_OF_LINES_MESSAGE, }; +enum t_config_look_buffer_position +{ + CONFIG_LOOK_BUFFER_POSITION_END = 0, + CONFIG_LOOK_BUFFER_POSITION_FIRST_GAP, +}; + enum t_config_look_buffer_search_where { CONFIG_LOOK_BUFFER_SEARCH_PREFIX = 0, @@ -110,6 +116,7 @@ extern struct t_config_option *config_look_bar_more_up; extern struct t_config_option *config_look_bar_more_down; extern struct t_config_option *config_look_buffer_auto_renumber; extern struct t_config_option *config_look_buffer_notify_default; +extern struct t_config_option *config_look_buffer_position; extern struct t_config_option *config_look_buffer_search_case_sensitive; extern struct t_config_option *config_look_buffer_search_force_default; extern struct t_config_option *config_look_buffer_search_regex; diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index daae4f8d6..0e28878d9 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -313,7 +313,11 @@ gui_buffer_notify_set_all () } /* - * Searches for position of buffer in list (to keep buffers sorted by number). + * Searches for position of buffer in list using its layout number + * (to keep buffers sorted by number). + * + * Returns the pointer to the buffer that will be after the new buffer in list. + * Returns NULL if position is undefined. */ struct t_gui_buffer * @@ -321,7 +325,7 @@ gui_buffer_find_pos (struct t_gui_buffer *buffer) { struct t_gui_buffer *ptr_buffer; - /* if no number is asked by layout, then add to the end by default */ + /* if no number is asked by layout, position is undefined */ if (buffer->layout_number < 1) return NULL; @@ -342,7 +346,7 @@ gui_buffer_find_pos (struct t_gui_buffer *buffer) } } - /* position not found, add to the end */ + /* position not found */ return NULL; } @@ -375,17 +379,54 @@ gui_buffer_shift_numbers (struct t_gui_buffer *buffer) void gui_buffer_insert (struct t_gui_buffer *buffer) { - struct t_gui_buffer *pos_buffer; + struct t_gui_buffer *pos_buffer, *ptr_buffer; + int force_number; + + force_number = 0; pos_buffer = gui_buffer_find_pos (buffer); + + /* + * if position was not forced by layout and that buffer position is set + * to "first gap", search for the first available number in the list + * (if there is not, buffer will be added to the end of list) + */ + if (!pos_buffer + && (CONFIG_INTEGER(config_look_buffer_position) == CONFIG_LOOK_BUFFER_POSITION_FIRST_GAP)) + { + for (ptr_buffer = gui_buffers; ptr_buffer; + ptr_buffer = ptr_buffer->next_buffer) + { + if (ptr_buffer->prev_buffer) + { + if (ptr_buffer->number > ptr_buffer->prev_buffer->number + 1) + { + pos_buffer = ptr_buffer; + force_number = ptr_buffer->prev_buffer->number + 1; + break; + } + } + else if (ptr_buffer->number > 1) + { + pos_buffer = ptr_buffer; + force_number = 1; + break; + } + } + } + if (pos_buffer) { /* add buffer into the list (before position found) */ - if (!CONFIG_BOOLEAN(config_look_buffer_auto_renumber) - && (buffer->layout_number > 0) - && (buffer->layout_number < pos_buffer->number) - && (!pos_buffer->prev_buffer - || (buffer->layout_number > pos_buffer->prev_buffer->number))) + if (force_number > 0) + { + buffer->number = force_number; + } + else if (!CONFIG_BOOLEAN(config_look_buffer_auto_renumber) + && (buffer->layout_number > 0) + && (buffer->layout_number < pos_buffer->number) + && (!pos_buffer->prev_buffer + || (buffer->layout_number > pos_buffer->prev_buffer->number))) { buffer->number = buffer->layout_number; }