X-Git-Url: https://git.distorted.org.uk/~mdw/tig/blobdiff_plain/8c317212e3f75826f5c789c29d63d72faccc90f5..d4d8de8fb345853df54a2b3f25a1c9824ee6dedb:/tig.c diff --git a/tig.c b/tig.c index 25c423c..66c5f76 100644 --- a/tig.c +++ b/tig.c @@ -565,6 +565,7 @@ LINE(TREE, "tree ", COLOR_BLUE, COLOR_DEFAULT, 0), \ LINE(AUTHOR, "author ", COLOR_CYAN, COLOR_DEFAULT, 0), \ LINE(COMMITTER, "committer ", COLOR_MAGENTA, COLOR_DEFAULT, 0), \ LINE(SIGNOFF, " Signed-off-by", COLOR_YELLOW, COLOR_DEFAULT, 0), \ +LINE(ACKED, " Acked-by", COLOR_YELLOW, COLOR_DEFAULT, 0), \ LINE(DEFAULT, "", COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL), \ LINE(CURSOR, "", COLOR_WHITE, COLOR_GREEN, A_BOLD), \ LINE(STATUS, "", COLOR_GREEN, COLOR_DEFAULT, 0), \ @@ -1521,8 +1522,9 @@ scroll_view(struct view *view, enum request request) /* Cursor moving */ static void -move_view(struct view *view, enum request request, bool redraw) +move_view(struct view *view, enum request request) { + int scroll_steps = 0; int steps; switch (request) { @@ -1569,34 +1571,40 @@ 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) { + scroll_steps = steps; if (steps < 0 && -steps > view->offset) { - steps = -view->offset; + scroll_steps = -view->offset; } else if (steps > 0) { if (view->lineno == view->lines - 1 && view->lines > view->height) { - steps = view->lines - view->offset - 1; - if (steps >= view->height) - steps -= view->height - 1; + scroll_steps = view->lines - view->offset - 1; + if (scroll_steps >= view->height) + scroll_steps -= view->height - 1; } } + } - do_scroll_view(view, steps); + 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_steps) { + do_scroll_view(view, scroll_steps); return; + } + + /* Draw the current line */ + draw_view_line(view, view->lineno - view->offset); redrawwin(view->win); wrefresh(view->win); @@ -2056,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: @@ -2089,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 */ @@ -2551,7 +2557,7 @@ tree_read(struct view *view, char *text) static bool tree_enter(struct view *view, struct line *line) { - enum open_flags flags = OPEN_DEFAULT; + enum open_flags flags = display[0] == view ? OPEN_SPLIT : OPEN_DEFAULT; char *data = line->data; enum request request; @@ -2586,10 +2592,6 @@ tree_enter(struct view *view, struct line *line) break; case LINE_TREE_FILE: - /* This causes the blob view to become split, and not having it - * in the tree dir case will make the blob view automatically - * disappear when moving to a different directory. */ - flags |= OPEN_SPLIT; request = REQ_VIEW_BLOB; break;