Mercurial > emacs
changeset 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 | 7f6d41c2adbe |
children | 63c796a99b3e |
files | src/ChangeLog src/window.c |
diffstat | 2 files changed, 36 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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 <jan.h.d@swipnet.se> + * 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,
--- 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;