mirror of
https://github.com/weechat/weechat.git
synced 2026-07-08 18:53:12 +02:00
Fix infinite loop with /layout apply and bug when applying layout, sometimes many /layout apply were needed (bug #26110)
This commit is contained in:
@@ -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, ..) */
|
||||
|
||||
+41
-8
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user