Fix spurious resizing of the display (take 2)
[tig] / tig.c
diff --git a/tig.c b/tig.c
index 4ab9434..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
@@ -1261,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);
@@ -1285,7 +1287,10 @@ open_view(struct view *prev, enum request request, enum open_flags flags)
                display[current_view] = view;
        }
 
-       if (nviews == 1 || display[1] == NULL)
+       /* 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) {
@@ -1389,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) {