]> git.eshelyaron.com Git - emacs.git/commitdiff
* window.c (delete_window): Handle the case where a h/vchild has
authorJan Djärv <jan.h.d@swipnet.se>
Mon, 6 Jun 2005 10:38:40 +0000 (10:38 +0000)
committerJan Djärv <jan.h.d@swipnet.se>
Mon, 6 Jun 2005 10:38:40 +0000 (10:38 +0000)
a h/vchild.

src/ChangeLog
src/window.c

index f5bbebbb76020b253873c0582f2c300a16ae220e..308d55187d2558fbc91eadeb82d0fe25397c808f 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-06  Jan Dj\e,Ad\e(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
index faf88c91ffc5defbaa569af236d5d45afb4fe9da..4839830b1774353e2abff1b935a63b42ebd27bd6 100644 (file)
@@ -1452,8 +1452,10 @@ delete_window (window)
   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 @@ delete_window (window)
   /* 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;