changeset 63045:872de430453e

* window.c (delete_window): Handle the case where a h/vchild has a h/vchild.
author Jan Djärv <jan.h.d@swipnet.se>
date Mon, 06 Jun 2005 10:38:40 +0000
parents c0b03fb8ef01
children da1f81e3345e
files src/ChangeLog src/window.c
diffstat 2 files changed, 53 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Mon Jun 06 06:19:52 2005 +0000
+++ b/src/ChangeLog	Mon Jun 06 10:38:40 2005 +0000
@@ -1,3 +1,8 @@
+2005-06-06  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* window.c (delete_window): Handle the case where a h/vchild has
+	a h/vchild.
+
 2005-06-05  Eli Zaretskii  <eliz@gnu.org>
 
 	* w32.c (sys_setsockopt): Change arg 4 to `const void *'.  In the
--- a/src/window.c	Mon Jun 06 06:19:52 2005 +0000
+++ b/src/window.c	Mon Jun 06 10:38:40 2005 +0000
@@ -1452,8 +1452,10 @@
   tem = par->hchild;
   if (NILP (tem))
     tem = par->vchild;
-  if (NILP (XWINDOW (tem)->next))
+  if (NILP (XWINDOW (tem)->next)) {
     replace_window (parent, tem);
+    par = XWINDOW (tem);
+  }
 
   /* Since we may be deleting combination windows, we must make sure that
      not only p but all its children have been marked as deleted.  */
@@ -1465,6 +1467,51 @@
   /* Mark this window as deleted.  */
   p->buffer = p->hchild = p->vchild = Qnil;
 
+  if (! NILP (par->parent))
+    par = XWINDOW (par->parent);
+
+  /* Check if we have a v/hchild with a v/hchild.  In that case remove
+     one of them.  */
+  
+  if (! NILP (par->vchild) && ! NILP (XWINDOW (par->vchild)->vchild))
+    {
+      p = XWINDOW (par->vchild);
+      par->vchild = p->vchild;
+      tem = p->vchild;
+    }
+  else if (! NILP (par->hchild) && ! NILP (XWINDOW (par->hchild)->hchild))
+    {
+      p = XWINDOW (par->hchild);
+      par->hchild = p->hchild;
+      tem = p->hchild;
+    }
+  else
+    p = 0;
+
+  if (p)
+    {
+      while (! NILP (tem)) {
+        XWINDOW (tem)->parent = p->parent;
+        if (NILP (XWINDOW (tem)->next))
+          break;
+        tem = XWINDOW (tem)->next;
+      }
+      if (! NILP (tem)) {
+        /* The next of the v/hchild we are removing is now the next of the
+           last child for the v/hchild:
+           Before v/hchild -> v/hchild -> next1 -> next2
+                    |
+                     -> next3
+           After:  v/hchild -> next1 -> next2 -> next3
+        */
+        XWINDOW (tem)->next = p->next;
+        if (! NILP (p->next))
+          XWINDOW (p->next)->prev = tem;
+      }
+      p->next = p->prev = p->vchild = p->hchild = p->buffer = Qnil;
+    }
+
+
   /* Adjust glyph matrices. */
   adjust_glyphs (f);
   UNBLOCK_INPUT;