# HG changeset patch # User Jan Dj¸«£rv # Date 1100433561 0 # Node ID 72149deebe8916a8a5cbfee06619a1dc60cebe01 # Parent 7f6d41c2adbe83df2abf0c66d7c0a26a6129fcb1 * 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 -r 7f6d41c2adbe -r 72149deebe89 src/ChangeLog --- a/src/ChangeLog Sun Nov 14 10:59:31 2004 +0000 +++ b/src/ChangeLog Sun Nov 14 11:59:21 2004 +0000 @@ -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 -r 7f6d41c2adbe -r 72149deebe89 src/window.c --- 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;