diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2013-07-20 11:54:52 +0200 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2013-07-20 11:54:52 +0200 |
commit | 765297c038ec20668210eea69aa327e7aad60a34 (patch) | |
tree | 88af7e49adf45a9b864b0f598dc6df453be17081 /src/gui/curses | |
parent | 94b9104d14c1aee0e95ce1f9a69f7da01bf5e0d6 (diff) | |
parent | 27882ee74e7f77e143ae0df2656ae3b845aff5cd (diff) | |
download | weechat-765297c038ec20668210eea69aa327e7aad60a34.zip |
Merge branch 'scroll-beyond-end'
Diffstat (limited to 'src/gui/curses')
-rw-r--r-- | src/gui/curses/gui-curses-chat.c | 61 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-window.c | 26 |
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. |