X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=tig.c;h=e58a6b65f2f3e3c5e50f15c7c275f569fbdd11aa;hb=28e376e2624f6dd5fa20caacec996e3468d7f45d;hp=9745f2c3dca5ffe9a3a0af4193aba4cd86fd5c05;hpb=cbc5ebaaf7f082f334d06d770efddd37dea91e7f;p=tig.git diff --git a/tig.c b/tig.c index 9745f2c..e58a6b6 100644 --- a/tig.c +++ b/tig.c @@ -1429,13 +1429,19 @@ struct view { time_t update_secs; }; +enum open_flags { + OPEN_DEFAULT = 0, /* Use default view switching. */ + OPEN_SPLIT = 1, /* Split current view. */ + OPEN_RELOAD = 4, /* Reload view even if it is the current. */ + OPEN_REFRESH = 16, /* Refresh view using previous command. */ + OPEN_PREPARED = 32, /* Open already prepared command. */ +}; + struct view_ops { /* What type of content being displayed. Used in the title bar. */ const char *type; - /* Default command arguments. */ - const char **argv; /* Open and reads in all view content. */ - bool (*open)(struct view *view); + bool (*open)(struct view *view, enum open_flags flags); /* Read one line; updates view->line. */ bool (*read)(struct view *view, char *data); /* Draw one line; @lineno must be < view->height. */ @@ -1446,8 +1452,6 @@ struct view_ops { bool (*grep)(struct view *view, struct line *line); /* Select line */ void (*select)(struct view *view, struct line *line); - /* Prepare view for loading */ - bool (*prepare)(struct view *view); }; static struct view_ops blame_ops; @@ -1513,7 +1517,9 @@ set_view_attr(struct view *view, enum line_type type) } } -static int +#define VIEW_MAX_LEN(view) ((view)->width + (view)->yoffset - (view)->col) + +static bool draw_chars(struct view *view, enum line_type type, const char *string, int max_len, bool use_tilde) { @@ -1524,7 +1530,7 @@ draw_chars(struct view *view, enum line_type type, const char *string, size_t skip = view->yoffset > view->col ? view->yoffset - view->col : 0; if (max_len <= 0) - return 0; + return VIEW_MAX_LEN(view) <= 0; len = utf8_length(&string, skip, &col, max_len, &trimmed, use_tilde, opt_tab_size); @@ -1555,25 +1561,26 @@ draw_chars(struct view *view, enum line_type type, const char *string, } } - return col; + view->col += col; + return VIEW_MAX_LEN(view) <= 0; } -static int +static bool draw_space(struct view *view, enum line_type type, int max, int spaces) { static char space[] = " "; - int col = 0; spaces = MIN(max, spaces); while (spaces > 0) { int len = MIN(spaces, sizeof(space) - 1); - col += draw_chars(view, type, space, len, FALSE); + if (draw_chars(view, type, space, len, FALSE)) + return TRUE; spaces -= len; } - return col; + return VIEW_MAX_LEN(view) <= 0; } static bool @@ -1584,18 +1591,19 @@ draw_text(struct view *view, enum line_type type, const char *string) do { size_t pos = string_expand(text, sizeof(text), string, opt_tab_size); - view->col += draw_chars(view, type, text, view->width + view->yoffset - view->col, TRUE); + if (draw_chars(view, type, text, VIEW_MAX_LEN(view), TRUE)) + return TRUE; string += pos; - } while (*string && view->width + view->yoffset > view->col); + } while (*string); - return view->width + view->yoffset <= view->col; + return VIEW_MAX_LEN(view) <= 0; } static bool draw_graphic(struct view *view, enum line_type type, const chtype graphic[], size_t size, bool separator) { size_t skip = view->yoffset > view->col ? view->yoffset - view->col : 0; - int max = view->width + view->yoffset - view->col; + int max = VIEW_MAX_LEN(view); int i; if (max < size) @@ -1614,23 +1622,20 @@ draw_graphic(struct view *view, enum line_type type, const chtype graphic[], siz view->col++; } - return view->width + view->yoffset <= view->col; + return VIEW_MAX_LEN(view) <= 0; } static bool draw_field(struct view *view, enum line_type type, const char *text, int len, bool trim) { - int max = MIN(view->width + view->yoffset - view->col, len); - int col; + int max = MIN(VIEW_MAX_LEN(view), len); + int col = view->col; - if (text) - col = draw_chars(view, type, text, max - 1, trim); - else - col = draw_space(view, type, max - 1, max - 1); + if (!text) + return draw_space(view, type, max, max); - view->col += col; - view->col += draw_space(view, LINE_DEFAULT, max - col, max - col); - return view->width + view->yoffset <= view->col; + return draw_chars(view, type, text, max - 1, trim) + || draw_space(view, LINE_DEFAULT, max - (view->col - col), max); } static bool @@ -1680,7 +1685,7 @@ draw_lineno(struct view *view, unsigned int lineno) { char number[10]; int digits3 = view->digits < 3 ? 3 : view->digits; - int max = MIN(view->width + view->yoffset - view->col, digits3); + int max = MIN(VIEW_MAX_LEN(view), digits3); char *text = NULL; chtype separator = opt_line_graphics ? ACS_VLINE : '|'; @@ -1693,9 +1698,9 @@ draw_lineno(struct view *view, unsigned int lineno) text = number; } if (text) - view->col += draw_chars(view, LINE_LINE_NUMBER, text, max, TRUE); + draw_chars(view, LINE_LINE_NUMBER, text, max, TRUE); else - view->col += draw_space(view, LINE_LINE_NUMBER, max, digits3); + draw_space(view, LINE_LINE_NUMBER, max, digits3); return draw_graphic(view, LINE_DEFAULT, &separator, 1, TRUE); } @@ -2520,18 +2525,20 @@ prepare_update_file(struct view *view, const char *name) } static bool -begin_update(struct view *view, bool refresh) +begin_update(struct view *view, const char *dir, const char **argv, enum open_flags flags) { + bool reload = !!(flags & (OPEN_RELOAD | OPEN_REFRESH | OPEN_PREPARED)); + bool refresh = flags & (OPEN_REFRESH | OPEN_PREPARED); + + if (!reload && !strcmp(view->vid, view->id)) + return TRUE; + if (view->pipe) end_update(view, TRUE); if (!refresh) { - if (view->ops->prepare) { - if (!view->ops->prepare(view)) - return FALSE; - } else if (!prepare_io(view, NULL, view->ops->argv, TRUE)) { + if (!prepare_io(view, dir, argv, TRUE)) return FALSE; - } /* Put the current ref_* value to the view title ref * member. This is needed by the blob view. Most other @@ -2549,6 +2556,12 @@ begin_update(struct view *view, bool refresh) return TRUE; } +static bool +view_open(struct view *view, enum open_flags flags) +{ + return begin_update(view, NULL, NULL, flags); +} + static bool update_view(struct view *view) { @@ -2685,14 +2698,6 @@ add_line_format(struct view *view, enum line_type type, const char *fmt, ...) * View opening */ -enum open_flags { - OPEN_DEFAULT = 0, /* Use default view switching. */ - OPEN_SPLIT = 1, /* Split current view. */ - OPEN_RELOAD = 4, /* Reload view even if it is the current. */ - OPEN_REFRESH = 16, /* Refresh view using previous command. */ - OPEN_PREPARED = 32, /* Open already prepared command. */ -}; - static void open_view(struct view *prev, enum request request, enum open_flags flags) { @@ -2738,16 +2743,11 @@ open_view(struct view *prev, enum request request, enum open_flags flags) if (view->ops->open) { if (view->pipe) end_update(view, TRUE); - if (!view->ops->open(view)) { + if (!view->ops->open(view, flags)) { report("Failed to load %s view", view->name); return; } restore_view_position(view); - - } else if ((reload || strcmp(view->vid, view->id)) && - !begin_update(view, flags & (OPEN_REFRESH | OPEN_PREPARED))) { - report("Failed to load %s view", view->name); - return; } if (split && prev->lineno - prev->offset >= prev->height) { @@ -3331,8 +3331,7 @@ pager_select(struct view *view, struct line *line) static struct view_ops pager_ops = { "line", - NULL, - NULL, + view_open, pager_read, pager_draw, pager_request, @@ -3340,9 +3339,15 @@ static struct view_ops pager_ops = { pager_select, }; -static const char *log_argv[SIZEOF_ARG] = { - "git", "log", "--no-color", "--cc", "--stat", "-n100", "%(head)", NULL -}; +static bool +log_open(struct view *view, enum open_flags flags) +{ + static const char *log_argv[] = { + "git", "log", "--no-color", "--cc", "--stat", "-n100", "%(head)", NULL + }; + + return begin_update(view, NULL, log_argv, flags); +} static enum request log_request(struct view *view, enum request request, struct line *line) @@ -3359,8 +3364,7 @@ log_request(struct view *view, enum request request, struct line *line) static struct view_ops log_ops = { "line", - log_argv, - NULL, + log_open, pager_read, pager_draw, log_request, @@ -3368,11 +3372,17 @@ static struct view_ops log_ops = { pager_select, }; -static const char *diff_argv[SIZEOF_ARG] = { - "git", "show", "--pretty=fuller", "--no-color", "--root", - "--patch-with-stat", "--find-copies-harder", "-C", - "%(diffargs)", "%(commit)", "--", "%(fileargs)", NULL -}; +static bool +diff_open(struct view *view, enum open_flags flags) +{ + static const char *diff_argv[] = { + "git", "show", "--pretty=fuller", "--no-color", "--root", + "--patch-with-stat", "--find-copies-harder", "-C", + "%(diffargs)", "%(commit)", "--", "%(fileargs)", NULL + }; + + return begin_update(view, NULL, diff_argv, flags); +} static bool diff_read(struct view *view, char *data) @@ -3403,8 +3413,7 @@ diff_read(struct view *view, char *data) static struct view_ops diff_ops = { "line", - diff_argv, - NULL, + diff_open, diff_read, pager_draw, pager_request, @@ -3500,7 +3509,7 @@ help_open_keymap(struct view *view, enum keymap keymap) } static bool -help_open(struct view *view) +help_open(struct view *view, enum open_flags flags) { enum keymap keymap; @@ -3534,7 +3543,6 @@ help_request(struct view *view, enum request request, struct line *line) static struct view_ops help_ops = { "line", - NULL, help_open, NULL, pager_draw, @@ -3971,8 +3979,12 @@ tree_select(struct view *view, struct line *line) } static bool -tree_prepare(struct view *view) +tree_open(struct view *view, enum open_flags flags) { + static const char *tree_argv[] = { + "git", "ls-tree", "%(commit)", "%(directory)", NULL + }; + if (view->lines == 0 && opt_prefix[0]) { char *pos = opt_prefix; @@ -3993,25 +4005,29 @@ tree_prepare(struct view *view) opt_path[0] = 0; } - return prepare_io(view, opt_cdup, view->ops->argv, TRUE); + return begin_update(view, opt_cdup, tree_argv, flags); } -static const char *tree_argv[SIZEOF_ARG] = { - "git", "ls-tree", "%(commit)", "%(directory)", NULL -}; - static struct view_ops tree_ops = { "file", - tree_argv, - NULL, + tree_open, tree_read, tree_draw, tree_request, tree_grep, tree_select, - tree_prepare, }; +static bool +blob_open(struct view *view, enum open_flags flags) +{ + static const char *blob_argv[] = { + "git", "cat-file", "blob", "%(blob)", NULL + }; + + return begin_update(view, NULL, blob_argv, flags); +} + static bool blob_read(struct view *view, char *line) { @@ -4032,14 +4048,9 @@ blob_request(struct view *view, enum request request, struct line *line) } } -static const char *blob_argv[SIZEOF_ARG] = { - "git", "cat-file", "blob", "%(blob)", NULL -}; - static struct view_ops blob_ops = { "line", - blob_argv, - NULL, + blob_open, blob_read, pager_draw, blob_request, @@ -4075,7 +4086,7 @@ struct blame { }; static bool -blame_open(struct view *view) +blame_open(struct view *view, enum open_flags flags) { char path[SIZEOF_STR]; size_t i; @@ -4483,7 +4494,6 @@ blame_select(struct view *view, struct line *line) static struct view_ops blame_ops = { "line", - NULL, blame_open, blame_read, blame_draw, @@ -4640,7 +4650,7 @@ branch_open_visitor(void *data, const struct ref *ref) } static bool -branch_open(struct view *view) +branch_open(struct view *view, enum open_flags flags) { const char *branch_log[] = { "git", "log", "--no-color", "--pretty=raw", @@ -4686,7 +4696,6 @@ branch_select(struct view *view, struct line *line) static struct view_ops branch_ops = { "branch", - NULL, branch_open, branch_read, branch_draw, @@ -4938,7 +4947,7 @@ status_update_onbranch(void) * info using git-diff-files(1), and finally untracked files using * git-ls-files(1). */ static bool -status_open(struct view *view) +status_open(struct view *view, enum open_flags flags) { reset_view(view); @@ -5453,7 +5462,6 @@ status_grep(struct view *view, struct line *line) static struct view_ops status_ops = { "file", - NULL, status_open, NULL, status_draw, @@ -5691,8 +5699,7 @@ stage_request(struct view *view, enum request request, struct line *line) static struct view_ops stage_ops = { "line", - NULL, - NULL, + view_open, pager_read, pager_draw, stage_request, @@ -5783,11 +5790,17 @@ struct commit { struct graph_canvas graph; /* Ancestry chain graphics. */ }; -static const char *main_argv[SIZEOF_ARG] = { - "git", "log", "--no-color", "--pretty=raw", "--parents", - "--topo-order", "%(diffargs)", "%(revargs)", - "--", "%(fileargs)", NULL -}; +static bool +main_open(struct view *view, enum open_flags flags) +{ + static const char *main_argv[] = { + "git", "log", "--no-color", "--pretty=raw", "--parents", + "--topo-order", "%(diffargs)", "%(revargs)", + "--", "%(fileargs)", NULL + }; + + return begin_update(view, NULL, main_argv, flags); +} static bool main_draw(struct view *view, struct line *line, unsigned int lineno) @@ -5990,8 +6003,7 @@ main_select(struct view *view, struct line *line) static struct view_ops main_ops = { "commit", - main_argv, - NULL, + main_open, main_read, main_draw, main_request,