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 */
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);
/* Continue loading split views in the background. */
if (!split)
end_update(prev);
+ view->parent = prev;
}
if (view->pipe) {
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;
int split = 0;
if ((view == VIEW(REQ_VIEW_LOG) ||
- view == VIEW(REQ_VIEW_LOG)) &&
+ view == VIEW(REQ_VIEW_PAGER)) &&
get_line_type(line) == LINE_COMMIT) {
open_view(view, REQ_VIEW_DIFF, OPEN_SPLIT);
split = 1;
* 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