X-Git-Url: https://git.distorted.org.uk/~mdw/tig/blobdiff_plain/a0087dd5e88eff34a7c816cce09a7aa070f1d978..8522ecc7a379df19d79220d555f09d2b36cccb28:/tig.c diff --git a/tig.c b/tig.c index 7dba19d..72d57cc 100644 --- a/tig.c +++ b/tig.c @@ -1432,12 +1432,10 @@ update_display_cursor(void) /* Scrolling backend */ static void -do_scroll_view(struct view *view, int lines, bool redraw) +do_scroll_view(struct view *view, int lines) { bool redraw_current_line = FALSE; - assert(view_is_displayed(view)); - /* The rendering expects the new offset. */ view->offset += lines; @@ -1474,9 +1472,6 @@ do_scroll_view(struct view *view, int lines, bool redraw) draw_view_line(view, view->lineno - view->offset); } - if (!redraw) - return; - redrawwin(view->win); wrefresh(view->win); report(""); @@ -1488,6 +1483,8 @@ scroll_view(struct view *view, enum request request) { int lines = 1; + assert(view_is_displayed(view)); + switch (request) { case REQ_SCROLL_PAGE_DOWN: lines = view->height; @@ -1519,13 +1516,14 @@ scroll_view(struct view *view, enum request request) die("request %d not handled in switch", request); } - do_scroll_view(view, lines, TRUE); + do_scroll_view(view, lines); } /* Cursor moving */ static void -move_view(struct view *view, enum request request, bool redraw) +move_view(struct view *view, enum request request) { + bool scroll = FALSE; int steps; switch (request) { @@ -1572,10 +1570,6 @@ move_view(struct view *view, enum request request, bool redraw) view->lineno += steps; assert(0 <= view->lineno && view->lineno < view->lines); - /* Repaint the old "current" line if we be scrolling */ - if (ABS(steps) < view->height) - draw_view_line(view, view->lineno - steps - view->offset); - /* Check whether the view needs to be scrolled */ if (view->lineno < view->offset || view->lineno >= view->offset + view->height) { @@ -1591,15 +1585,26 @@ move_view(struct view *view, enum request request, bool redraw) } } - do_scroll_view(view, steps, redraw); + scroll = TRUE; + } + + if (!view_is_displayed(view)) { + view->offset += steps; + view->ops->select(view, &view->line[view->lineno]); return; } - /* Draw the current line */ - draw_view_line(view, view->lineno - view->offset); + /* Repaint the old "current" line if we be scrolling */ + if (ABS(steps) < view->height) + draw_view_line(view, view->lineno - steps - view->offset); - if (!redraw) + if (scroll) { + do_scroll_view(view, steps); return; + } + + /* Draw the current line */ + draw_view_line(view, view->lineno - view->offset); redrawwin(view->win); wrefresh(view->win); @@ -2014,7 +2019,7 @@ open_view(struct view *prev, enum request request, enum open_flags flags) /* Scroll the view that was split if the current line is * outside the new limited view. */ - do_scroll_view(prev, lines, TRUE); + do_scroll_view(prev, lines); } if (prev && view != prev) { @@ -2059,7 +2064,7 @@ view_driver(struct view *view, enum request request) case REQ_MOVE_PAGE_DOWN: case REQ_MOVE_FIRST_LINE: case REQ_MOVE_LAST_LINE: - move_view(view, request, TRUE); + move_view(view, request); break; case REQ_SCROLL_LINE_DOWN: @@ -2092,14 +2097,12 @@ view_driver(struct view *view, enum request request) view->parent == VIEW(REQ_VIEW_MAIN)) || (view == VIEW(REQ_VIEW_BLOB) && view->parent == VIEW(REQ_VIEW_TREE))) { - bool redraw = display[1] == view; - view = view->parent; - move_view(view, request, redraw); - if (redraw) + move_view(view, request); + if (view_is_displayed(view)) update_view_title(view); } else { - move_view(view, request, TRUE); + move_view(view, request); break; } /* Fall-through */