X-Git-Url: https://git.distorted.org.uk/~mdw/tig/blobdiff_plain/95d7ddcdaaff5fd6f0a05e3d515c436d9a3605e3..4f774851c65e0660b48ba639b47262e6283fe497:/tig.c diff --git a/tig.c b/tig.c index 0981593..efea6f4 100644 --- a/tig.c +++ b/tig.c @@ -699,6 +699,10 @@ struct view { unsigned long offset; /* Offset of the window top */ unsigned long lineno; /* Current line number */ + /* If non-NULL, points to the view that opened this view. If this view + * is closed tig will switch back to the parent view. */ + struct view *parent; + /* Buffering */ unsigned long lines; /* Total number of lines */ void **line; /* Line index; each line contains user data */ @@ -1256,21 +1260,7 @@ open_view(struct view *prev, enum request request, enum open_flags flags) bool split = !!(flags & OPEN_SPLIT); bool reload = !!(flags & OPEN_RELOAD); struct view *view = VIEW(request); - struct view *displayed; - int nviews; - - /* Cycle between displayed views and count the views. */ - foreach_view (displayed, nviews) { - if (prev != view && - view == displayed && - !strcmp(view->vid, prev->vid)) { - current_view = nviews; - /* Blur out the title of the previous view. */ - update_view_title(prev); - report(""); - return; - } - } + int nviews = display[1] ? 2 : 1; if (view == prev && nviews == 1 && !reload) { report("Already in %s view", view->name); @@ -1313,6 +1303,7 @@ open_view(struct view *prev, enum request request, enum open_flags flags) /* Continue loading split views in the background. */ if (!split) end_update(prev); + view->parent = prev; } if (view->pipe) { @@ -1431,11 +1422,11 @@ view_driver(struct view *view, enum request request) return TRUE; case REQ_VIEW_CLOSE: - if (display[1]) { - view = display[(current_view + 1) % ARRAY_SIZE(display)]; + if (view->parent) { memset(display, 0, sizeof(display)); current_view = 0; - display[current_view] = view; + display[current_view] = view->parent; + view->parent = NULL; resize_display(); redraw_display(); break; @@ -1821,7 +1812,9 @@ static struct keymap keymap[] = { * h:: * Show man page. * q:: - * Close view if multiple views are open, else quit. + * Close view, if multiple views are open it will jump back to the + * previous view in the view stack. If it is the last open view it + * will quit. Use 'Q' to quit all views at once. * Enter:: * This key is "context sensitive" depending on what view you are * currently in. When in log view on a commit line or in the main