mirror of
https://github.com/weechat/weechat.git
synced 2026-06-30 23:06:38 +02:00
Improve refreshs of windows/buffers/bars, fix refresh bug when some bars are hidden
This commit is contained in:
@@ -384,7 +384,7 @@ gui_bar_window_draw (struct t_gui_bar_window *bar_window,
|
||||
if (items_count == 0)
|
||||
{
|
||||
if (CONFIG_INTEGER(bar_window->bar->options[GUI_BAR_OPTION_SIZE]) == 0)
|
||||
gui_bar_window_set_current_size (bar_window->bar, 1);
|
||||
gui_bar_window_set_current_size (bar_window, window, 1);
|
||||
gui_window_clear (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
|
||||
CONFIG_COLOR(bar_window->bar->options[GUI_BAR_OPTION_COLOR_BG]));
|
||||
}
|
||||
@@ -426,12 +426,12 @@ gui_bar_window_draw (struct t_gui_bar_window *bar_window,
|
||||
num_lines = optimal_number_of_lines;
|
||||
else
|
||||
num_lines = items_count;
|
||||
gui_bar_window_set_current_size (bar_window->bar,
|
||||
gui_bar_window_set_current_size (bar_window, window,
|
||||
num_lines);
|
||||
break;
|
||||
case GUI_BAR_POSITION_LEFT:
|
||||
case GUI_BAR_POSITION_RIGHT:
|
||||
gui_bar_window_set_current_size (bar_window->bar,
|
||||
gui_bar_window_set_current_size (bar_window, window,
|
||||
max_length);
|
||||
break;
|
||||
case GUI_BAR_NUM_POSITIONS:
|
||||
@@ -558,7 +558,7 @@ gui_bar_window_draw (struct t_gui_bar_window *bar_window,
|
||||
else
|
||||
{
|
||||
if (CONFIG_INTEGER(bar_window->bar->options[GUI_BAR_OPTION_SIZE]) == 0)
|
||||
gui_bar_window_set_current_size (bar_window->bar, 1);
|
||||
gui_bar_window_set_current_size (bar_window, window, 1);
|
||||
gui_window_clear (GUI_BAR_WINDOW_OBJECTS(bar_window)->win_bar,
|
||||
CONFIG_COLOR(bar_window->bar->options[GUI_BAR_OPTION_COLOR_BG]));
|
||||
}
|
||||
|
||||
@@ -256,41 +256,41 @@ gui_main_loop ()
|
||||
gui_window_refresh_screen ();
|
||||
gui_window_refresh_needed = 0;
|
||||
}
|
||||
else
|
||||
|
||||
/* refresh bars if needed */
|
||||
for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar)
|
||||
{
|
||||
/* refresh bars if needed */
|
||||
for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar)
|
||||
if (ptr_bar->bar_refresh_needed)
|
||||
gui_bar_draw (ptr_bar);
|
||||
}
|
||||
|
||||
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
|
||||
{
|
||||
if (ptr_win->refresh_needed)
|
||||
{
|
||||
if (ptr_bar->bar_refresh_needed)
|
||||
gui_bar_draw (ptr_bar);
|
||||
gui_window_switch_to_buffer (ptr_win, ptr_win->buffer, 0);
|
||||
gui_window_redraw_buffer (ptr_win->buffer);
|
||||
ptr_win->refresh_needed = 0;
|
||||
}
|
||||
|
||||
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
|
||||
}
|
||||
|
||||
for (ptr_buffer = gui_buffers; ptr_buffer;
|
||||
ptr_buffer = ptr_buffer->next_buffer)
|
||||
{
|
||||
/* refresh chat if needed */
|
||||
if (ptr_buffer->chat_refresh_needed)
|
||||
{
|
||||
if (ptr_win->refresh_needed)
|
||||
{
|
||||
gui_window_switch_to_buffer (ptr_win, ptr_win->buffer, 0);
|
||||
gui_window_redraw_buffer (ptr_win->buffer);
|
||||
ptr_win->refresh_needed = 0;
|
||||
}
|
||||
gui_chat_draw (ptr_buffer,
|
||||
(ptr_buffer->chat_refresh_needed) > 1 ? 1 : 0);
|
||||
}
|
||||
|
||||
for (ptr_buffer = gui_buffers; ptr_buffer;
|
||||
ptr_buffer = ptr_buffer->next_buffer)
|
||||
}
|
||||
|
||||
/* refresh bars if needed */
|
||||
for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar)
|
||||
{
|
||||
if (ptr_bar->bar_refresh_needed)
|
||||
{
|
||||
/* refresh chat if needed */
|
||||
if (ptr_buffer->chat_refresh_needed)
|
||||
{
|
||||
gui_chat_draw (ptr_buffer,
|
||||
(ptr_buffer->chat_refresh_needed) > 1 ? 1 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* refresh bars if needed */
|
||||
for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar)
|
||||
{
|
||||
if (ptr_bar->bar_refresh_needed)
|
||||
gui_bar_draw (ptr_bar);
|
||||
gui_bar_draw (ptr_bar);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -477,24 +477,26 @@ gui_window_switch_to_buffer (struct t_gui_window *window,
|
||||
}
|
||||
|
||||
window->buffer = buffer;
|
||||
buffer->num_displayed++;
|
||||
|
||||
if (gui_ok && (old_buffer == buffer))
|
||||
{
|
||||
gui_bar_window_remove_unused_bars (window);
|
||||
gui_bar_window_add_missing_bars (window);
|
||||
}
|
||||
|
||||
gui_window_calculate_pos_size (window);
|
||||
gui_hotlist_remove_buffer (buffer);
|
||||
|
||||
if (gui_ok)
|
||||
{
|
||||
gui_bar_window_remove_unused_bars (window);
|
||||
gui_bar_window_add_missing_bars (window);
|
||||
|
||||
/* create bar windows */
|
||||
for (ptr_bar_window = window->bar_windows; ptr_bar_window;
|
||||
ptr_bar_window = ptr_bar_window->next_bar_window)
|
||||
{
|
||||
gui_bar_window_content_build (ptr_bar_window, window);
|
||||
gui_bar_window_calculate_pos_size (ptr_bar_window, window);
|
||||
gui_bar_window_create_win (ptr_bar_window);
|
||||
}
|
||||
|
||||
gui_window_calculate_pos_size (window);
|
||||
|
||||
/* destroy Curses windows */
|
||||
gui_window_objects_free (window, 0);
|
||||
|
||||
@@ -505,24 +507,7 @@ gui_window_switch_to_buffer (struct t_gui_window *window,
|
||||
window->win_chat_width,
|
||||
window->win_chat_y,
|
||||
window->win_chat_x);
|
||||
}
|
||||
|
||||
buffer->num_displayed++;
|
||||
|
||||
gui_hotlist_remove_buffer (buffer);
|
||||
|
||||
if (gui_ok && (buffer != old_buffer))
|
||||
{
|
||||
gui_bar_window_remove_unused_bars (window);
|
||||
gui_bar_window_add_missing_bars (window);
|
||||
}
|
||||
|
||||
/* redraw bars in window */
|
||||
for (ptr_bar_window = window->bar_windows; ptr_bar_window;
|
||||
ptr_bar_window = ptr_bar_window->next_bar_window)
|
||||
{
|
||||
gui_bar_window_content_build (ptr_bar_window, window);
|
||||
ptr_bar_window->bar->bar_refresh_needed = 1;
|
||||
gui_buffer_ask_chat_refresh (window->buffer, 2);
|
||||
}
|
||||
|
||||
if (window->buffer->type == GUI_BUFFER_TYPE_FREE)
|
||||
@@ -531,7 +516,11 @@ gui_window_switch_to_buffer (struct t_gui_window *window,
|
||||
window->scroll_lines_after = 0;
|
||||
}
|
||||
|
||||
window->refresh_needed = 1;
|
||||
for (ptr_bar_window = window->bar_windows; ptr_bar_window;
|
||||
ptr_bar_window = ptr_bar_window->next_bar_window)
|
||||
{
|
||||
ptr_bar_window->bar->bar_refresh_needed = 1;
|
||||
}
|
||||
|
||||
hook_signal_send ("buffer_switch",
|
||||
WEECHAT_HOOK_SIGNAL_POINTER, buffer);
|
||||
@@ -927,7 +916,7 @@ gui_window_refresh_windows ()
|
||||
{
|
||||
gui_bar_window_calculate_pos_size (ptr_bar->bar_window, NULL);
|
||||
gui_bar_window_create_win (ptr_bar->bar_window);
|
||||
gui_bar_draw (ptr_bar);
|
||||
gui_bar_ask_refresh (ptr_bar);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -946,15 +935,7 @@ gui_window_refresh_windows ()
|
||||
|
||||
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
|
||||
{
|
||||
gui_window_switch_to_buffer (ptr_win, ptr_win->buffer, 0);
|
||||
gui_window_draw_separator (ptr_win);
|
||||
ptr_win->refresh_needed = 0;
|
||||
}
|
||||
|
||||
for (ptr_buffer = gui_buffers; ptr_buffer;
|
||||
ptr_buffer = ptr_buffer->next_buffer)
|
||||
{
|
||||
gui_window_redraw_buffer (ptr_buffer);
|
||||
ptr_win->refresh_needed = 1;
|
||||
}
|
||||
|
||||
gui_current_window = old_current_window;
|
||||
@@ -995,8 +976,9 @@ gui_window_split_horizontal (struct t_gui_window *window, int percentage)
|
||||
/* assign same buffer for new window (top window) */
|
||||
new_window->buffer->num_displayed++;
|
||||
|
||||
gui_window_switch_to_buffer (window, window->buffer, 1);
|
||||
|
||||
window->refresh_needed = 1;
|
||||
new_window->refresh_needed = 1;
|
||||
|
||||
gui_window_switch (new_window);
|
||||
}
|
||||
}
|
||||
@@ -1038,7 +1020,8 @@ gui_window_split_vertical (struct t_gui_window *window, int percentage)
|
||||
/* assign same buffer for new window (right window) */
|
||||
new_window->buffer->num_displayed++;
|
||||
|
||||
gui_window_switch_to_buffer (window, window->buffer, 1);
|
||||
window->refresh_needed = 1;
|
||||
new_window->refresh_needed = 1;
|
||||
|
||||
gui_window_switch (new_window);
|
||||
|
||||
@@ -1130,7 +1113,6 @@ gui_window_merge (struct t_gui_window *window)
|
||||
gui_window_tree_node_to_leaf (parent, window);
|
||||
|
||||
gui_window_switch_to_buffer (window, window->buffer, 1);
|
||||
window->refresh_needed = 1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
+19
-72
@@ -224,7 +224,8 @@ gui_bar_window_find_pos (struct t_gui_bar *bar, struct t_gui_window *window)
|
||||
for (ptr_bar_window = window->bar_windows; ptr_bar_window;
|
||||
ptr_bar_window = ptr_bar_window->next_bar_window)
|
||||
{
|
||||
if (CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_PRIORITY]) >= CONFIG_INTEGER(ptr_bar_window->bar->options[GUI_BAR_OPTION_PRIORITY]))
|
||||
if (CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_PRIORITY]) >=
|
||||
CONFIG_INTEGER(ptr_bar_window->bar->options[GUI_BAR_OPTION_PRIORITY]))
|
||||
return ptr_bar_window;
|
||||
}
|
||||
|
||||
@@ -685,8 +686,6 @@ gui_bar_window_new (struct t_gui_bar *bar, struct t_gui_window *window)
|
||||
{
|
||||
gui_bar_window_calculate_pos_size (new_bar_window, window);
|
||||
gui_bar_window_create_win (new_bar_window);
|
||||
if (window)
|
||||
window->refresh_needed = 1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -696,43 +695,6 @@ gui_bar_window_new (struct t_gui_bar *bar, struct t_gui_window *window)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_bar_window_recreate_bar_windows: recreate bar windows for all windows
|
||||
*/
|
||||
|
||||
void
|
||||
gui_bar_window_recreate_bar_windows (struct t_gui_bar *bar)
|
||||
{
|
||||
struct t_gui_window *ptr_win;
|
||||
struct t_gui_bar_window *ptr_bar_win;
|
||||
|
||||
if (CONFIG_BOOLEAN(bar->options[GUI_BAR_OPTION_HIDDEN]))
|
||||
return;
|
||||
|
||||
if (CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_TYPE]) == GUI_BAR_TYPE_ROOT)
|
||||
{
|
||||
gui_bar_window_calculate_pos_size (bar->bar_window, NULL);
|
||||
gui_bar_window_create_win (bar->bar_window);
|
||||
gui_window_refresh_needed = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
|
||||
{
|
||||
for (ptr_bar_win = ptr_win->bar_windows; ptr_bar_win;
|
||||
ptr_bar_win = ptr_bar_win->next_bar_window)
|
||||
{
|
||||
if (ptr_bar_win->bar == bar)
|
||||
{
|
||||
gui_bar_window_calculate_pos_size (ptr_bar_win, ptr_win);
|
||||
gui_bar_window_create_win (ptr_bar_win);
|
||||
ptr_win->refresh_needed = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_bar_window_get_current_size: get current size of bar window
|
||||
* return width or height, depending on bar
|
||||
@@ -819,10 +781,9 @@ gui_bar_window_get_max_size (struct t_gui_bar_window *bar_window,
|
||||
*/
|
||||
|
||||
void
|
||||
gui_bar_window_set_current_size (struct t_gui_bar *bar, int size)
|
||||
gui_bar_window_set_current_size (struct t_gui_bar_window *bar_window,
|
||||
struct t_gui_window *window, int size)
|
||||
{
|
||||
struct t_gui_window *ptr_window;
|
||||
struct t_gui_bar_window *ptr_bar_window;
|
||||
int new_size, max_size;
|
||||
|
||||
if (size == 0)
|
||||
@@ -830,42 +791,30 @@ gui_bar_window_set_current_size (struct t_gui_bar *bar, int size)
|
||||
else
|
||||
{
|
||||
new_size = size;
|
||||
if ((size != 0) && (CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_SIZE_MAX]) > 0)
|
||||
&& (size > CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_SIZE_MAX])))
|
||||
if ((size != 0) && (CONFIG_INTEGER(bar_window->bar->options[GUI_BAR_OPTION_SIZE_MAX]) > 0)
|
||||
&& (size > CONFIG_INTEGER(bar_window->bar->options[GUI_BAR_OPTION_SIZE_MAX])))
|
||||
{
|
||||
new_size = CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_SIZE_MAX]);
|
||||
new_size = CONFIG_INTEGER(bar_window->bar->options[GUI_BAR_OPTION_SIZE_MAX]);
|
||||
if (new_size < 1)
|
||||
new_size = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_TYPE]) == GUI_BAR_TYPE_ROOT)
|
||||
if (bar_window->current_size != new_size)
|
||||
{
|
||||
if (bar->bar_window->current_size != new_size)
|
||||
max_size = gui_bar_window_get_max_size (bar_window, window);
|
||||
new_size = (max_size < new_size) ? max_size : new_size;
|
||||
if (bar_window->current_size != new_size)
|
||||
{
|
||||
max_size = gui_bar_window_get_max_size (bar->bar_window, NULL);
|
||||
bar->bar_window->current_size = (max_size < new_size) ?
|
||||
max_size : new_size;
|
||||
gui_bar_window_recreate_bar_windows (bar);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (ptr_window = gui_windows; ptr_window;
|
||||
ptr_window = ptr_window->next_window)
|
||||
{
|
||||
for (ptr_bar_window = ptr_window->bar_windows; ptr_bar_window;
|
||||
ptr_bar_window = ptr_bar_window->next_bar_window)
|
||||
bar_window->current_size = new_size;
|
||||
if (!CONFIG_BOOLEAN(bar_window->bar->options[GUI_BAR_OPTION_HIDDEN]))
|
||||
{
|
||||
if ((ptr_bar_window->bar == bar)
|
||||
&& (ptr_bar_window->current_size != new_size))
|
||||
{
|
||||
max_size = gui_bar_window_get_max_size (ptr_bar_window,
|
||||
ptr_window);
|
||||
ptr_bar_window->current_size = (max_size < new_size) ?
|
||||
max_size : new_size;
|
||||
gui_bar_window_recreate_bar_windows (bar);
|
||||
}
|
||||
gui_bar_window_calculate_pos_size (bar_window, window);
|
||||
gui_bar_window_create_win (bar_window);
|
||||
if (window)
|
||||
window->refresh_needed = 1;
|
||||
else
|
||||
gui_window_refresh_needed = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -890,8 +839,6 @@ gui_bar_window_free (struct t_gui_bar_window *bar_window,
|
||||
window->bar_windows = bar_window->next_bar_window;
|
||||
if (window->last_bar_window == bar_window)
|
||||
window->last_bar_window = bar_window->prev_bar_window;
|
||||
|
||||
window->refresh_needed = 1;
|
||||
}
|
||||
|
||||
/* free data */
|
||||
|
||||
@@ -55,7 +55,9 @@ extern char *gui_bar_window_content_get_with_filling (struct t_gui_bar_window *b
|
||||
extern struct t_gui_bar_window *gui_bar_window_search_bar (struct t_gui_window *window,
|
||||
struct t_gui_bar *bar);
|
||||
extern int gui_bar_window_get_current_size (struct t_gui_bar_window *bar_window);
|
||||
extern void gui_bar_window_set_current_size (struct t_gui_bar *bar, int size);
|
||||
extern void gui_bar_window_set_current_size (struct t_gui_bar_window *bar_window,
|
||||
struct t_gui_window *window,
|
||||
int size);
|
||||
extern int gui_bar_window_get_size (struct t_gui_bar *bar,
|
||||
struct t_gui_window *window,
|
||||
enum t_gui_bar_position position);
|
||||
|
||||
+45
-13
@@ -586,17 +586,51 @@ gui_bar_draw (struct t_gui_bar *bar)
|
||||
struct t_gui_window *ptr_win;
|
||||
struct t_gui_bar_window *ptr_bar_win;
|
||||
|
||||
if (CONFIG_BOOLEAN(bar->options[GUI_BAR_OPTION_HIDDEN]))
|
||||
return;
|
||||
if (!CONFIG_BOOLEAN(bar->options[GUI_BAR_OPTION_HIDDEN]))
|
||||
{
|
||||
if (bar->bar_window)
|
||||
{
|
||||
/* root bar */
|
||||
gui_bar_window_draw (bar->bar_window, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* bar on each window */
|
||||
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
|
||||
{
|
||||
for (ptr_bar_win = ptr_win->bar_windows; ptr_bar_win;
|
||||
ptr_bar_win = ptr_bar_win->next_bar_window)
|
||||
{
|
||||
if (ptr_bar_win->bar == bar)
|
||||
{
|
||||
gui_bar_window_draw (ptr_bar_win, ptr_win);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
bar->bar_refresh_needed = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_bar_apply_current_size: apply new size for all bar windows of bar
|
||||
*/
|
||||
|
||||
void
|
||||
gui_bar_apply_current_size (struct t_gui_bar *bar)
|
||||
{
|
||||
struct t_gui_window *ptr_win;
|
||||
struct t_gui_bar_window *ptr_bar_win;
|
||||
|
||||
if (bar->bar_window)
|
||||
if (CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_TYPE]) == GUI_BAR_TYPE_ROOT)
|
||||
{
|
||||
/* root bar */
|
||||
gui_bar_window_draw (bar->bar_window, NULL);
|
||||
gui_bar_window_set_current_size (bar->bar_window,
|
||||
NULL,
|
||||
CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_SIZE]));
|
||||
gui_window_refresh_needed = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* bar on each window */
|
||||
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
|
||||
{
|
||||
for (ptr_bar_win = ptr_win->bar_windows; ptr_bar_win;
|
||||
@@ -604,13 +638,13 @@ gui_bar_draw (struct t_gui_bar *bar)
|
||||
{
|
||||
if (ptr_bar_win->bar == bar)
|
||||
{
|
||||
gui_bar_window_draw (ptr_bar_win, ptr_win);
|
||||
gui_bar_window_set_current_size (ptr_bar_win,
|
||||
ptr_win,
|
||||
CONFIG_INTEGER(bar->options[GUI_BAR_OPTION_SIZE]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bar->bar_refresh_needed = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -937,9 +971,7 @@ gui_bar_config_change_size (void *data, struct t_config_option *option)
|
||||
ptr_bar = gui_bar_search_with_option_name (option->name);
|
||||
if (ptr_bar)
|
||||
{
|
||||
gui_bar_window_set_current_size (ptr_bar,
|
||||
CONFIG_INTEGER(ptr_bar->options[GUI_BAR_OPTION_SIZE]));
|
||||
gui_window_refresh_needed = 1;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1156,7 +1188,7 @@ gui_bar_set_size (struct t_gui_bar *bar, const char *size)
|
||||
snprintf (value, sizeof (value), "%d", new_size);
|
||||
config_file_option_set (bar->options[GUI_BAR_OPTION_SIZE], value, 1);
|
||||
|
||||
gui_bar_window_set_current_size (bar, new_size);
|
||||
gui_bar_apply_current_size (bar);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user