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;