X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=tig.c;h=3ae55f23d78d87b0f2ad3bcec9d9f8591862913f;hb=c77942d3d053415bcf1a09f79e8b05a7b76f6de2;hp=cc9b084dc1c2b1b15b10d7bbf8f5bcb22bafddc0;hpb=85980cd0ed05bd2ffc18765f70c3c9b50fb50a71;p=tig.git diff --git a/tig.c b/tig.c index cc9b084..3ae55f2 100644 --- a/tig.c +++ b/tig.c @@ -1977,14 +1977,16 @@ toggle_option(enum request request) } static void -maximize_view(struct view *view) +maximize_view(struct view *view, bool redraw) { memset(display, 0, sizeof(display)); current_view = 0; display[current_view] = view; resize_display(); - redraw_display(FALSE); - report(""); + if (redraw) { + redraw_display(FALSE); + report(""); + } } @@ -2388,7 +2390,7 @@ format_arg(const char *name) } static bool -format_argv(const char ***dst_argv, const char *src_argv[], bool replace, bool first) +format_argv(const char ***dst_argv, const char *src_argv[], bool first) { char buf[SIZEOF_STR]; int argc; @@ -2426,7 +2428,7 @@ format_argv(const char ***dst_argv, const char *src_argv[], bool replace, bool f int len = next - arg; const char *value; - if (!next || !replace) { + if (!next) { len = strlen(arg); value = ""; @@ -2441,7 +2443,7 @@ format_argv(const char ***dst_argv, const char *src_argv[], bool replace, bool f if (!string_format_from(buf, &bufpos, "%.*s%s", len, arg, value)) return FALSE; - arg = next && replace ? strchr(next, ')') + 1 : NULL; + arg = next ? strchr(next, ')') + 1 : NULL; } if (!argv_append(dst_argv, buf)) @@ -2498,18 +2500,18 @@ setup_update(struct view *view, const char *vid) } static bool -prepare_io(struct view *view, const char *dir, const char *argv[], bool replace) +prepare_update(struct view *view, const char *dir, const char *argv[]) { + if (view->pipe) + io_done(view->pipe); view->dir = dir; - return format_argv(&view->argv, argv, replace, !view->prev); + return argv_copy(&view->argv, argv); } static bool start_update(struct view *view, const char **argv, const char *dir) { - if (view->pipe) - io_done(view->pipe); - return prepare_io(view, dir, argv, FALSE) && + return prepare_update(view, dir, argv) && io_run(&view->io, IO_RD, dir, view->argv); } @@ -2526,7 +2528,8 @@ begin_update(struct view *view, const char *dir, const char **argv, enum open_fl end_update(view, TRUE); if (!refresh) { - if (!prepare_io(view, dir, argv, TRUE)) + view->dir = dir; + if (!format_argv(&view->argv, argv, !view->prev)) return FALSE; /* Put the current ref_* value to the view title ref @@ -2539,9 +2542,6 @@ begin_update(struct view *view, const char *dir, const char **argv, enum open_fl if (view->argv && view->argv[0] && !io_run(&view->io, IO_RD, view->dir, view->argv)) return FALSE; - else if (view->argv && !strcmp(view->argv[0], opt_cdup) && - !io_open(&view->io, "%s%s", opt_cdup, view->argv[1])) - return FALSE; setup_update(view, view->id); @@ -2713,15 +2713,40 @@ load_view(struct view *view, enum open_flags flags) } } +#define refresh_view(view) load_view(view, OPEN_REFRESH) + +static void +split_view(struct view *prev, struct view *view) +{ + display[1] = view; + current_view = 1; + view->parent = prev; + resize_display(); + + if (prev->lineno - prev->offset >= prev->height) { + /* Take the title line into account. */ + int lines = prev->lineno - prev->offset - prev->height + 1; + + /* Scroll the view that was split if the current line is + * outside the new limited view. */ + do_scroll_view(prev, lines); + } + + if (view != prev && view_is_displayed(prev)) { + /* "Blur" the previous view. */ + update_view_title(prev); + } +} + static void open_view(struct view *prev, enum request request, enum open_flags flags) { bool split = !!(flags & OPEN_SPLIT); - bool reload = !!(flags & (OPEN_RELOAD | OPEN_REFRESH | OPEN_PREPARED)); - bool nomaximize = !!(flags & OPEN_REFRESH); + bool reload = !!(flags & (OPEN_RELOAD | OPEN_PREPARED)); struct view *view = VIEW(request); int nviews = displayed_views(); - struct view *base_view = display[0]; + + assert(flags ^ OPEN_REFRESH); if (view == prev && nviews == 1 && !reload) { report("Already in %s view", view->name); @@ -2734,14 +2759,9 @@ open_view(struct view *prev, enum request request, enum open_flags flags) } if (split) { - display[1] = view; - current_view = 1; - view->parent = prev; - } else if (!nomaximize) { - /* Maximize the current view. */ - memset(display, 0, sizeof(display)); - current_view = 0; - display[current_view] = view; + split_view(prev, view); + } else { + maximize_view(view, FALSE); } /* No prev signals that this is the first loaded view. */ @@ -2749,26 +2769,6 @@ open_view(struct view *prev, enum request request, enum open_flags flags) view->prev = prev; } - /* Resize the view when switching between split- and full-screen, - * or when switching between two different full-screen views. */ - if (nviews != displayed_views() || - (nviews == 1 && base_view != display[0])) - resize_display(); - - if (split && prev->lineno - prev->offset >= prev->height) { - /* Take the title line into account. */ - int lines = prev->lineno - prev->offset - prev->height + 1; - - /* Scroll the view that was split if the current line is - * outside the new limited view. */ - do_scroll_view(prev, lines); - } - - if (prev && view != prev && split && view_is_displayed(prev)) { - /* "Blur" the previous view. */ - update_view_title(prev); - } - load_view(view, flags); } @@ -2777,9 +2777,7 @@ open_argv(struct view *prev, struct view *view, const char *argv[], const char * { enum request request = view - views + REQ_OFFSET + 1; - if (view->pipe) - end_update(view, TRUE); - if (!prepare_io(view, dir, argv, FALSE)) { + if (!prepare_update(view, dir, argv)) { report("Failed to open %s view: %s", view->name, io_strerror(&view->io)); } else { open_view(prev, request, flags | OPEN_PREPARED); @@ -2794,6 +2792,7 @@ open_file(struct view *prev, struct view *view, const char *file, enum open_flag if (view->pipe) end_update(view, TRUE); + view->dir = opt_cdup; if (!argv_copy(&view->argv, file_argv)) { report("Failed to load %s: out of memory", file); } else { @@ -2852,7 +2851,7 @@ open_run_request(enum request request) return; } - if (format_argv(&argv, req->argv, TRUE, FALSE)) + if (format_argv(&argv, req->argv, FALSE)) open_external_viewer(argv, NULL); if (argv) argv_free(argv); @@ -3002,7 +3001,7 @@ view_driver(struct view *view, enum request request) case REQ_MAXIMIZE: if (displayed_views() == 2) - maximize_view(view); + maximize_view(view, TRUE); break; case REQ_OPTIONS: @@ -3059,7 +3058,7 @@ view_driver(struct view *view, enum request request) * view itself. Parents to closed view should never be * followed. */ if (view->prev && view->prev != view) { - maximize_view(view->prev); + maximize_view(view->prev, TRUE); view->prev = view; break; } @@ -3380,7 +3379,7 @@ log_request(struct view *view, enum request request, struct line *line) switch (request) { case REQ_REFRESH: load_refs(); - open_view(view, REQ_VIEW_LOG, OPEN_REFRESH); + refresh_view(view); return REQ_NONE; default: return pager_request(view, request, line); @@ -3556,8 +3555,7 @@ help_request(struct view *view, enum request request, struct line *line) if (line->type == LINE_HELP_KEYMAP) { help_keymap_hidden[line->other] = !help_keymap_hidden[line->other]; - view->p_restore = TRUE; - open_view(view, REQ_VIEW_HELP, OPEN_REFRESH); + refresh_view(view); } return REQ_NONE; @@ -4427,7 +4425,7 @@ blame_request(struct view *view, enum request request, struct line *line) string_copy(opt_file, blame->commit->filename); if (blame->lineno) view->lineno = blame->lineno; - open_view(view, REQ_VIEW_BLAME, OPEN_REFRESH); + refresh_view(view); } break; @@ -4440,7 +4438,7 @@ blame_request(struct view *view, enum request request, struct line *line) string_copy_rev(opt_ref, blame->commit->parent_id); string_copy(opt_file, blame->commit->parent_filename); setup_blame_parent_line(view, blame); - open_view(view, REQ_VIEW_BLAME, OPEN_REFRESH); + refresh_view(view); } break; @@ -4583,7 +4581,7 @@ branch_request(struct view *view, enum request request, struct line *line) switch (request) { case REQ_REFRESH: load_refs(); - open_view(view, REQ_VIEW_BRANCH, OPEN_REFRESH); + refresh_view(view); return REQ_NONE; case REQ_TOGGLE_SORT_FIELD: @@ -5394,7 +5392,7 @@ status_request(struct view *view, enum request request, struct line *line) return request; } - open_view(view, REQ_VIEW_STATUS, OPEN_RELOAD); + refresh_view(view); return REQ_NONE; } @@ -5674,8 +5672,7 @@ stage_request(struct view *view, enum request request, struct line *line) return request; } - VIEW(REQ_VIEW_STATUS)->p_restore = TRUE; - open_view(view, REQ_VIEW_STATUS, OPEN_REFRESH); + refresh_view(view->parent); /* Check whether the staged entry still exists, and close the * stage view if it doesn't. */ @@ -5684,7 +5681,7 @@ stage_request(struct view *view, enum request request, struct line *line) return REQ_VIEW_CLOSE; } - open_view(view, REQ_VIEW_STAGE, OPEN_REFRESH); + refresh_view(view); return REQ_NONE; } @@ -5939,12 +5936,12 @@ main_request(struct view *view, enum request request, struct line *line) switch (request) { case REQ_ENTER: if (view_is_displayed(view) && display[0] != view) - maximize_view(view); + maximize_view(view, TRUE); open_view(view, REQ_VIEW_DIFF, flags); break; case REQ_REFRESH: load_refs(); - open_view(view, REQ_VIEW_MAIN, OPEN_REFRESH); + refresh_view(view); break; default: return request;