Fix spurious resizing of the display (take 2)
[tig] / tig.c
diff --git a/tig.c b/tig.c
index bf53092..4a65031 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -646,6 +646,7 @@ static unsigned int current_view;
 #define foreach_view(view, i) \
        for (i = 0; i < ARRAY_SIZE(display) && (view = display[i]); i++)
 
+#define displayed_views()      (display[1] != NULL ? 2 : 1)
 
 /**
  * Current head and commit ID
@@ -1075,11 +1076,27 @@ move_view(struct view *view, enum request request, bool redraw)
  * Incremental updating
  */
 
+static void
+end_update(struct view *view)
+{
+       if (!view->pipe)
+               return;
+       set_nonblocking_input(FALSE);
+       if (view->pipe == stdin)
+               fclose(view->pipe);
+       else
+               pclose(view->pipe);
+       view->pipe = NULL;
+}
+
 static bool
 begin_update(struct view *view)
 {
        const char *id = view->id;
 
+       if (view->pipe)
+               end_update(view);
+
        if (opt_cmd[0]) {
                string_copy(view->cmd, opt_cmd);
                opt_cmd[0] = 0;
@@ -1128,19 +1145,6 @@ begin_update(struct view *view)
        return TRUE;
 }
 
-static void
-end_update(struct view *view)
-{
-       if (!view->pipe)
-               return;
-       set_nonblocking_input(FALSE);
-       if (view->pipe == stdin)
-               fclose(view->pipe);
-       else
-               pclose(view->pipe);
-       view->pipe = NULL;
-}
-
 static bool
 update_view(struct view *view)
 {
@@ -1258,7 +1262,8 @@ 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);
-       int nviews = display[1] ? 2 : 1;
+       int nviews = displayed_views();
+       struct view *base_view = display[0];
 
        if (view == prev && nviews == 1 && !reload) {
                report("Already in %s view", view->name);
@@ -1282,7 +1287,11 @@ open_view(struct view *prev, enum request request, enum open_flags flags)
                display[current_view] = view;
        }
 
-       resize_display();
+       /* 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. */
@@ -1294,13 +1303,13 @@ open_view(struct view *prev, enum request request, enum open_flags flags)
        }
 
        if (prev && view != prev) {
-               /* "Blur" the previous view. */
-               if (!backgrounded)
-                       update_view_title(prev);
-
                /* Continue loading split views in the background. */
                if (!split)
                        end_update(prev);
+               else if (!backgrounded)
+                       /* "Blur" the previous view. */
+                       update_view_title(prev);
+
                view->parent = prev;
        }
 
@@ -1364,11 +1373,12 @@ view_driver(struct view *view, enum request request)
 
                if (view == VIEW(REQ_VIEW_DIFF) &&
                    view->parent == VIEW(REQ_VIEW_MAIN)) {
-                       bool redraw = display[0] == VIEW(REQ_VIEW_MAIN);
+                       bool redraw = display[1] == view;
 
                        view = view->parent;
                        move_view(view, request, redraw);
-                       update_view_title(view);
+                       if (redraw)
+                               update_view_title(view);
                } else {
                        move_view(view, request, TRUE);
                        break;
@@ -1384,7 +1394,7 @@ view_driver(struct view *view, enum request request)
 
        case REQ_VIEW_NEXT:
        {
-               int nviews = display[1] ? 2 : 1;
+               int nviews = displayed_views();
                int next_view = (current_view + 1) % nviews;
 
                if (next_view == current_view) {