diff --git a/ChangeLog b/ChangeLog index e0ad26e5a..c652f8a53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,7 @@ WeeChat ChangeLog ================= FlashCode -v0.3.2-dev, 2010-03-26 +v0.3.2-dev, 2010-03-29 Version 0.3.2 (under dev!) @@ -24,6 +24,8 @@ Version 0.3.2 (under dev!) * core: use arguments for infolist "nicklist" to return only one nick or group * core: fix bug with writing of configuration files when disk is full (bug #29331) +* core: fix infinite loop with /layout apply and bug when applying layout, + sometimes many /layout apply were needed (bug #26110) * gui: refresh screen when exiting WeeChat (to display messages printed after /quit) * gui: fix bug with global history, reset pointer to last entry after each user diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 1f6c93402..c00f94365 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -401,6 +401,7 @@ gui_buffer_new (struct t_weechat_plugin *plugin, new_buffer->layout_number = gui_layout_buffer_get_number (gui_layout_buffers, plugin_get_name (plugin), name); + new_buffer->layout_applied = 0; new_buffer->name = strdup (name); new_buffer->short_name = strdup (name); new_buffer->type = GUI_BUFFER_TYPE_FORMATTED; diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h index 8a422b21f..62699e5a1 100644 --- a/src/gui/gui-buffer.h +++ b/src/gui/gui-buffer.h @@ -77,6 +77,8 @@ struct t_gui_buffer int number; /* buffer number (for jump/switch) */ int layout_number; /* the number of buffer saved in */ /* layout */ + int layout_applied; /* used when applying layout, to */ + /* know if layout has been applied */ char *name; /* buffer name */ char *short_name; /* short buffer name */ enum t_gui_buffer_type type; /* buffer type (formatted, free, ..) */ diff --git a/src/gui/gui-layout.c b/src/gui/gui-layout.c index 339b936c5..1ca97e69a 100644 --- a/src/gui/gui-layout.c +++ b/src/gui/gui-layout.c @@ -205,22 +205,55 @@ gui_layout_buffer_apply (struct t_gui_layout_buffer *layout_buffers) { struct t_gui_buffer *ptr_buffer; const char *plugin_name; + int layout_applied_on_a_buffer; if (layout_buffers) { + /* reset flag "layout_applied" on all buffers */ for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) { - plugin_name = plugin_get_name (ptr_buffer->plugin); - ptr_buffer->layout_number = gui_layout_buffer_get_number (layout_buffers, - plugin_name, - ptr_buffer->name); - if ((ptr_buffer->layout_number > 0) - && (ptr_buffer->layout_number != ptr_buffer->number)) + ptr_buffer->layout_applied = 0; + } + + /* + * apply layout on all buffers: we start from first buffer each time, + * until layout has been applied on all buffers + */ + while (1) + { + layout_applied_on_a_buffer = 0; + for (ptr_buffer = gui_buffers; ptr_buffer; + ptr_buffer = ptr_buffer->next_buffer) { - gui_buffer_move_to_number (ptr_buffer, - ptr_buffer->layout_number); + /* if layout has not been applied on buffer yet */ + if (!ptr_buffer->layout_applied) + { + ptr_buffer->layout_applied = 1; + layout_applied_on_a_buffer = 1; + plugin_name = plugin_get_name (ptr_buffer->plugin); + ptr_buffer->layout_number = gui_layout_buffer_get_number (layout_buffers, + plugin_name, + ptr_buffer->name); + if ((ptr_buffer->layout_number > 0) + && (ptr_buffer->layout_number != ptr_buffer->number)) + { + gui_buffer_move_to_number (ptr_buffer, + ptr_buffer->layout_number); + } + /* + * exit loop when layout has been applied on buffer, we + * will apply for next buffers in another loop + */ + break; + } } + /* + * no layout applied: that means layout has been applied on all + * buffers, so we exit from loop + */ + if (!layout_applied_on_a_buffer) + break; } } }