Mercurial > emacs
diff src/window.c @ 58217:72149deebe89
* window.c (shrink_windows): Handle special case of one window left
when trying to shrink the final reminder. Grow windows if
total_removed is less than total_shrink.
| author | Jan Dj?rv <jan.h.d@swipnet.se> |
|---|---|
| date | Sun, 14 Nov 2004 11:59:21 +0000 |
| parents | eeb5474ef89f |
| children | 491080266027 |
line wrap: on
line diff
--- a/src/window.c Sun Nov 14 10:59:31 2004 +0000 +++ b/src/window.c Sun Nov 14 11:59:21 2004 +0000 @@ -2657,6 +2657,9 @@ --shrinkable; total_removed += smallest; + /* We don't know what the smallest is now. */ + smallest = total; + /* Out of for, just remove one window at the time and check again if we have enough space. */ break; @@ -2681,6 +2684,16 @@ that are left and still can be shrunk. */ while (total_shrink > total_removed) { + int nonzero_sizes = 0; + int nonzero_idx = -1; + + for (i = 0; i < nchildren; ++i) + if (new_sizes[i] > 0) + { + ++nonzero_sizes; + nonzero_idx = i; + } + for (i = 0; i < nchildren; ++i) if (new_sizes[i] > min_size) { @@ -2691,6 +2704,25 @@ check again if we have enough space. */ break; } + + + /* Special case, only one window left. */ + if (nonzero_sizes == 1) + break; + } + + /* Any surplus due to rounding, we add to windows that are left. */ + while (total_shrink < total_removed) + { + for (i = 0; i < nchildren; ++i) + { + if (new_sizes[i] != 0 && total_shrink < total_removed) + { + ++new_sizes[i]; + --total_removed; + break; + } + } } return new_sizes;
