summaryrefslogtreecommitdiff
path: root/src/gui/curses
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2013-07-20 11:54:52 +0200
committerSebastien Helleu <flashcode@flashtux.org>2013-07-20 11:54:52 +0200
commit765297c038ec20668210eea69aa327e7aad60a34 (patch)
tree88af7e49adf45a9b864b0f598dc6df453be17081 /src/gui/curses
parent94b9104d14c1aee0e95ce1f9a69f7da01bf5e0d6 (diff)
parent27882ee74e7f77e143ae0df2656ae3b845aff5cd (diff)
downloadweechat-765297c038ec20668210eea69aa327e7aad60a34.zip
Merge branch 'scroll-beyond-end'
Diffstat (limited to 'src/gui/curses')
-rw-r--r--src/gui/curses/gui-curses-chat.c61
-rw-r--r--src/gui/curses/gui-curses-window.c26
2 files changed, 64 insertions, 23 deletions
diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c
index 85b4901cf..aa75ac4c1 100644
--- a/src/gui/curses/gui-curses-chat.c
+++ b/src/gui/curses/gui-curses-chat.c
@@ -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 = gui_line_get_next_displayed (ptr_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 = gui_line_get_next_displayed (ptr_line);
+ }
+ else
+ ptr_line = window->buffer->lines->first_line;
+
if (ptr_line)
{
if (!ptr_line->data->displayed)
diff --git a/src/gui/curses/gui-curses-window.c b/src/gui/curses/gui-curses-window.c
index d205d8232..920e18324 100644
--- a/src/gui/curses/gui-curses-window.c
+++ b/src/gui/curses/gui-curses-window.c
@@ -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:
@@ -1495,6 +1488,25 @@ 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;
+
+ if (window->buffer->lines->last_line)
+ {
+ 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.
*
* This function is called after a terminal resize.