1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-09 19:23:13 +02:00

core: add option "scroll_beyond_end" for command /window (task #6745)

This commit is contained in:
Sebastien Helleu
2013-07-17 18:04:44 +02:00
parent 7389514c09
commit bee56c3b7f
10 changed files with 73 additions and 36 deletions
+45 -16
View File
@@ -1390,6 +1390,12 @@ gui_chat_calculate_line_diff (struct t_gui_window *window,
backward = (difference < 0);
if (*line && (*line_pos < 0))
{
*line = (*line)->next_line;
*line_pos = 0;
}
if (!(*line))
{
/* if looking backward, start at last line of buffer */
@@ -1480,20 +1486,44 @@ gui_chat_calculate_line_diff (struct t_gui_window *window,
void
gui_chat_draw_formatted_buffer (struct t_gui_window *window)
{
struct t_gui_line *ptr_line;
int line_pos, count, old_scrolling, old_lines_after;
struct t_gui_line *ptr_line, *ptr_line2;
int auto_search_first_line, line_pos, line_pos2, count;
int old_scrolling, old_lines_after;
/* display at position of scrolling */
auto_search_first_line = 1;
ptr_line = NULL;
line_pos = 0;
if (window->scroll->start_line)
{
auto_search_first_line = 0;
ptr_line = window->scroll->start_line;
line_pos = window->scroll->start_line_pos;
if (line_pos < 0)
{
ptr_line = ptr_line->next_line;
line_pos = 0;
if (ptr_line)
{
ptr_line2 = ptr_line;
line_pos2 = 0;
gui_chat_calculate_line_diff (window, &ptr_line2, &line_pos2,
window->win_chat_height);
if (ptr_line2)
{
auto_search_first_line = 1;
window->scroll->start_line = NULL;
window->scroll->start_line_pos = 0;
ptr_line = NULL;
line_pos = 0;
}
}
}
}
else
if (auto_search_first_line)
{
/* look for first line to display, starting from last line */
ptr_line = NULL;
line_pos = 0;
gui_chat_calculate_line_diff (window, &ptr_line, &line_pos,
(-1) * (window->win_chat_height - 1));
}
@@ -1563,21 +1593,12 @@ gui_chat_draw_formatted_buffer (struct t_gui_window *window)
WEECHAT_HOOK_SIGNAL_POINTER, window);
}
if (!window->scroll->scrolling
&& window->scroll->reset_allowed)
{
window->scroll->start_line = NULL;
window->scroll->start_line_pos = 0;
}
/* cursor is below end line of chat window? */
if (window->win_chat_cursor_y > window->win_chat_height - 1)
{
window->win_chat_cursor_x = 0;
window->win_chat_cursor_y = window->win_chat_height - 1;
}
window->scroll->reset_allowed = 0;
}
/*
@@ -1590,8 +1611,16 @@ gui_chat_draw_free_buffer (struct t_gui_window *window, int clear_chat)
struct t_gui_line *ptr_line;
int y_start, y_end, y;
ptr_line = (window->scroll->start_line) ?
window->scroll->start_line : window->buffer->lines->first_line;
ptr_line = NULL;
if (window->scroll->start_line)
{
ptr_line = window->scroll->start_line;
if (window->scroll->start_line_pos < 0)
ptr_line = ptr_line->next_line;
}
else
ptr_line = window->buffer->lines->first_line;
if (ptr_line)
{
if (!ptr_line->data->displayed)
+16 -7
View File
@@ -1095,7 +1095,6 @@ gui_window_switch_to_buffer (struct t_gui_window *window,
window->scroll->start_line = NULL;
window->scroll->start_line_pos = 0;
window->scroll->scrolling = 0;
window->scroll->reset_allowed = 1;
}
if (!gui_buffers_visited_frozen)
{
@@ -1252,7 +1251,6 @@ gui_window_page_up (struct t_gui_window *window)
(window->scroll->start_line) ?
(-1) * (num_lines) :
(-1) * (num_lines + window->win_chat_height - 1));
window->scroll->reset_allowed = 1;
gui_buffer_ask_chat_refresh (window->buffer, 2);
}
break;
@@ -1311,7 +1309,6 @@ gui_window_page_down (struct t_gui_window *window)
window->scroll->start_line = NULL;
window->scroll->start_line_pos = 0;
}
window->scroll->reset_allowed = 1;
gui_buffer_ask_chat_refresh (window->buffer, 2);
}
break;
@@ -1350,7 +1347,6 @@ gui_window_scroll_up (struct t_gui_window *window)
(-1) * CONFIG_INTEGER(config_look_scroll_amount) :
(-1) * ( (window->win_chat_height - 1) +
CONFIG_INTEGER(config_look_scroll_amount)));
window->scroll->reset_allowed = 1;
gui_buffer_ask_chat_refresh (window->buffer, 2);
}
break;
@@ -1403,7 +1399,6 @@ gui_window_scroll_down (struct t_gui_window *window)
window->scroll->start_line = NULL;
window->scroll->start_line_pos = 0;
}
window->scroll->reset_allowed = 1;
gui_buffer_ask_chat_refresh (window->buffer, 2);
}
break;
@@ -1436,7 +1431,6 @@ gui_window_scroll_top (struct t_gui_window *window)
{
window->scroll->start_line = gui_line_get_first_displayed (window->buffer);
window->scroll->start_line_pos = 0;
window->scroll->reset_allowed = 1;
gui_buffer_ask_chat_refresh (window->buffer, 2);
}
break;
@@ -1471,7 +1465,6 @@ gui_window_scroll_bottom (struct t_gui_window *window)
case GUI_BUFFER_TYPE_FORMATTED:
window->scroll->start_line = NULL;
window->scroll->start_line_pos = 0;
window->scroll->reset_allowed = 1;
gui_buffer_ask_chat_refresh (window->buffer, 2);
break;
case GUI_BUFFER_TYPE_FREE:
@@ -1494,6 +1487,22 @@ gui_window_scroll_bottom (struct t_gui_window *window)
}
}
/*
* Scrolls beyond the end of buffer (so that all lines become "hidden" above the
* top of window).
*/
void
gui_window_scroll_beyond_end (struct t_gui_window *window)
{
if (!gui_init_ok)
return;
window->scroll->start_line = window->buffer->lines->last_line;
window->scroll->start_line_pos = -1;
gui_buffer_ask_chat_refresh (window->buffer, 2);
}
/*
* Auto-resizes all windows, according to % of global size.
*