From: Jan Djärv Date: Sun, 14 Nov 2004 11:59:21 +0000 (+0000) Subject: * window.c (shrink_windows): Handle special case of one window left X-Git-Tag: ttn-vms-21-2-B4~3936 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ef614e04c32f6b7f4e17bc3203bb0f809097a6f8;p=emacs.git * 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. --- diff --git a/src/ChangeLog b/src/ChangeLog index 7977fd9c9a1..f9ffecff3bc 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,9 @@ 2004-11-14 Jan Dj,Ad(Brv + * 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. + * xmenu.c (pop_down_menu): Remove global variable current_menu, extract pointer from arg with XSAVE_VALUE. (create_and_show_popup_menu, create_and_show_dialog, diff --git a/src/window.c b/src/window.c index 24be93a3943..7c2fbc60612 100644 --- a/src/window.c +++ b/src/window.c @@ -2657,6 +2657,9 @@ shrink_windows (total, size, nchildren, shrinkable, --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 @@ shrink_windows (total, size, nchildren, shrinkable, 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 @@ shrink_windows (total, size, nchildren, shrinkable, 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;