Fix infinite loop with /layout apply and bug when applying layout, sometimes many /layout apply were needed (bug #26110)
This commit is contained in:
parent
88853df080
commit
56526db5cf
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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, ..) */
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user