X-Git-Url: https://git.distorted.org.uk/~mdw/tig/blobdiff_plain/d4d8de8fb345853df54a2b3f25a1c9824ee6dedb..f7ffec0647ba2b0cfd171dd81f0d620038f690f0:/tig.c diff --git a/tig.c b/tig.c index 66c5f76..de85ca1 100644 --- a/tig.c +++ b/tig.c @@ -59,6 +59,7 @@ static size_t utf8_length(const char *string, size_t max_width, int *coloffset, #define SIZEOF_STR 1024 /* Default string size. */ #define SIZEOF_REF 256 /* Size of symbolic or SHA1 ID. */ +#define SIZEOF_REV 41 /* Holds a SHA-1 and an ending NUL */ #define SIZEOF_REVGRAPH 19 /* Size of revision ancestry graphics. */ /* This color name can be used to refer to the default term colors. */ @@ -109,7 +110,7 @@ static size_t utf8_length(const char *string, size_t max_width, int *coloffset, struct ref { char *name; /* Ref name; tag or head names are shortened. */ - char id[41]; /* Commit SHA1 ID */ + char id[SIZEOF_REV]; /* Commit SHA1 ID */ unsigned int tag:1; /* Is it a tag? */ unsigned int next:1; /* For ref lists: are there more refs? */ }; @@ -1264,6 +1265,7 @@ draw_view_line(struct view *view, unsigned int lineno) { struct line *line; bool selected = (view->offset + lineno == view->lineno); + bool draw_ok; assert(view_is_displayed(view)); @@ -1281,7 +1283,11 @@ draw_view_line(struct view *view, unsigned int lineno) wclrtoeol(view->win); } - return view->ops->draw(view, line, lineno, selected); + scrollok(view->win, FALSE); + draw_ok = view->ops->draw(view, line, lineno, selected); + scrollok(view->win, TRUE); + + return draw_ok; } static void @@ -1309,20 +1315,11 @@ redraw_view(struct view *view) static void update_view_title(struct view *view) { - assert(view_is_displayed(view)); - - if (view == display[current_view]) - wbkgdset(view->title, get_line_attr(LINE_TITLE_FOCUS)); - else - wbkgdset(view->title, get_line_attr(LINE_TITLE_BLUR)); - - werase(view->title); - wmove(view->title, 0, 0); + char buf[SIZEOF_STR]; + char state[SIZEOF_STR]; + size_t bufpos = 0, statelen = 0; - if (*view->ref) - wprintw(view->title, "[%s] %s", view->name, view->ref); - else - wprintw(view->title, "[%s]", view->name); + assert(view_is_displayed(view)); if (view->lines || view->pipe) { unsigned int view_lines = view->offset + view->height; @@ -1330,21 +1327,42 @@ update_view_title(struct view *view) ? MIN(view_lines, view->lines) * 100 / view->lines : 0; - wprintw(view->title, " - %s %d of %d (%d%%)", - view->ops->type, - view->lineno + 1, - view->lines, - lines); + string_format_from(state, &statelen, "- %s %d of %d (%d%%)", + view->ops->type, + view->lineno + 1, + view->lines, + lines); + + if (view->pipe) { + time_t secs = time(NULL) - view->start_time; + + /* Three git seconds are a long time ... */ + if (secs > 2) + string_format_from(state, &statelen, " %lds", secs); + } } - if (view->pipe) { - time_t secs = time(NULL) - view->start_time; + string_format_from(buf, &bufpos, "[%s]", view->name); + if (*view->ref && bufpos < view->width) { + size_t refsize = strlen(view->ref); + size_t minsize = bufpos + 1 + /* abbrev= */ 7 + 1 + statelen; - /* Three git seconds are a long time ... */ - if (secs > 2) - wprintw(view->title, " %lds", secs); + if (minsize < view->width) + refsize = view->width - minsize + 7; + string_format_from(buf, &bufpos, " %.*s", refsize, view->ref); } + if (statelen && bufpos < view->width) { + string_format_from(buf, &bufpos, " %s", state); + } + + if (view == display[current_view]) + wbkgdset(view->title, get_line_attr(LINE_TITLE_FOCUS)); + else + wbkgdset(view->title, get_line_attr(LINE_TITLE_BLUR)); + + werase(view->title); + mvwaddnstr(view->title, 0, 0, buf, bufpos); wmove(view->title, 0, view->width - 1); wrefresh(view->title); } @@ -1413,10 +1431,8 @@ redraw_display(void) } static void -update_display_cursor(void) +update_display_cursor(struct view *view) { - struct view *view = display[current_view]; - /* Move the cursor to the right-most column of the cursor line. * * XXX: This could turn out to be a bit expensive, but it ensures that @@ -2447,7 +2463,7 @@ static struct view_ops pager_ops = { * Tree backend */ -/* Parse output from git ls-tree: +/* Parse output from git-ls-tree(1): * * 100644 blob fb0e31ea6cc679b7379631188190e975f5789c26 Makefile * 100644 blob 5304ca4260aaddaee6498f9630e7d471b8591ea6 README @@ -2558,7 +2574,6 @@ static bool tree_enter(struct view *view, struct line *line) { enum open_flags flags = display[0] == view ? OPEN_SPLIT : OPEN_DEFAULT; - char *data = line->data; enum request request; switch (line->type) { @@ -2577,6 +2592,7 @@ tree_enter(struct view *view, struct line *line) } else { size_t pathlen = strlen(opt_path); size_t origlen = pathlen; + char *data = line->data; char *basename = data + SIZEOF_TREE_ATTR; if (!string_format_from(opt_path, &pathlen, "%s/", basename)) { @@ -2601,29 +2617,27 @@ tree_enter(struct view *view, struct line *line) open_view(view, request, flags); - if (!VIEW(request)->pipe) - return TRUE; - - /* For tree views insert the path to the parent as the first line. */ - if (request == REQ_VIEW_BLOB) { - /* Mirror what is showed in the title bar. */ - string_ncopy(ref_blob, data + STRING_SIZE("100644 blob "), 40); - string_copy(VIEW(REQ_VIEW_BLOB)->ref, ref_blob); - return TRUE; - } - return TRUE; } static void tree_select(struct view *view, struct line *line) { - if (line->type == LINE_TREE_DIR || line->type == LINE_TREE_FILE) { - char *text = line->data; + char *text = line->data; + + text += STRING_SIZE("100644 blob "); - string_ncopy(view->ref, text + STRING_SIZE("100644 blob "), 40); - string_copy(ref_blob, view->ref); + if (line->type == LINE_TREE_FILE) { + string_ncopy(ref_blob, text, 40); + /* Also update the blob view's ref, since all there must always + * be in sync. */ + string_copy(VIEW(REQ_VIEW_BLOB)->ref, ref_blob); + + } else if (line->type != LINE_TREE_DIR) { + return; } + + string_ncopy(view->ref, text, 40); } static struct view_ops tree_ops = { @@ -2661,7 +2675,7 @@ static struct view_ops blob_ops = { */ struct commit { - char id[41]; /* SHA1 ID. */ + char id[SIZEOF_REV]; /* SHA1 ID. */ char title[75]; /* First line of the commit message. */ char author[75]; /* Author of the commit. */ struct tm time; /* Date from the author ident. */ @@ -3133,7 +3147,7 @@ report(const char *msg, ...) } update_view_title(view); - update_display_cursor(); + update_display_cursor(view); } /* Controls when nodelay should be in effect when polling user input. */