Fix infinite loop with /layout apply and bug when applying layout, sometimes many /layout apply were needed (bug #26110)

This commit is contained in:
Sebastien Helleu 2010-03-29 16:30:23 +02:00
parent 88853df080
commit 56526db5cf
4 changed files with 47 additions and 9 deletions

View File

@ -1,7 +1,7 @@
WeeChat ChangeLog
=================
FlashCode <flashcode@flashtux.org>
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

View File

@ -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;

View File

@ -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, ..) */

View File

@ -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;
}
}
}