aboutsummaryrefslogtreecommitdiffstats
path: root/src/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c51
1 files changed, 49 insertions, 2 deletions
diff --git a/src/window.c b/src/window.c
index 83d99cf67ba..5bfff27f976 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1454,8 +1454,10 @@ delete_window (window)
1454 tem = par->hchild; 1454 tem = par->hchild;
1455 if (NILP (tem)) 1455 if (NILP (tem))
1456 tem = par->vchild; 1456 tem = par->vchild;
1457 if (NILP (XWINDOW (tem)->next)) 1457 if (NILP (XWINDOW (tem)->next)) {
1458 replace_window (parent, tem); 1458 replace_window (parent, tem);
1459 par = XWINDOW (tem);
1460 }
1459 1461
1460 /* Since we may be deleting combination windows, we must make sure that 1462 /* Since we may be deleting combination windows, we must make sure that
1461 not only p but all its children have been marked as deleted. */ 1463 not only p but all its children have been marked as deleted. */
@@ -1467,6 +1469,51 @@ delete_window (window)
1467 /* Mark this window as deleted. */ 1469 /* Mark this window as deleted. */
1468 p->buffer = p->hchild = p->vchild = Qnil; 1470 p->buffer = p->hchild = p->vchild = Qnil;
1469 1471
1472 if (! NILP (par->parent))
1473 par = XWINDOW (par->parent);
1474
1475 /* Check if we have a v/hchild with a v/hchild. In that case remove
1476 one of them. */
1477
1478 if (! NILP (par->vchild) && ! NILP (XWINDOW (par->vchild)->vchild))
1479 {
1480 p = XWINDOW (par->vchild);
1481 par->vchild = p->vchild;
1482 tem = p->vchild;
1483 }
1484 else if (! NILP (par->hchild) && ! NILP (XWINDOW (par->hchild)->hchild))
1485 {
1486 p = XWINDOW (par->hchild);
1487 par->hchild = p->hchild;
1488 tem = p->hchild;
1489 }
1490 else
1491 p = 0;
1492
1493 if (p)
1494 {
1495 while (! NILP (tem)) {
1496 XWINDOW (tem)->parent = p->parent;
1497 if (NILP (XWINDOW (tem)->next))
1498 break;
1499 tem = XWINDOW (tem)->next;
1500 }
1501 if (! NILP (tem)) {
1502 /* The next of the v/hchild we are removing is now the next of the
1503 last child for the v/hchild:
1504 Before v/hchild -> v/hchild -> next1 -> next2
1505 |
1506 -> next3
1507 After: v/hchild -> next1 -> next2 -> next3
1508 */
1509 XWINDOW (tem)->next = p->next;
1510 if (! NILP (p->next))
1511 XWINDOW (p->next)->prev = tem;
1512 }
1513 p->next = p->prev = p->vchild = p->hchild = p->buffer = Qnil;
1514 }
1515
1516
1470 /* Adjust glyph matrices. */ 1517 /* Adjust glyph matrices. */
1471 adjust_glyphs (f); 1518 adjust_glyphs (f);
1472 UNBLOCK_INPUT; 1519 UNBLOCK_INPUT;
@@ -3189,7 +3236,7 @@ selects the buffer of the selected window before each command. */)
3189 so that FRAME_FOCUS_FRAME is moved appropriately as we 3236 so that FRAME_FOCUS_FRAME is moved appropriately as we
3190 move around in the state where a minibuffer in a separate 3237 move around in the state where a minibuffer in a separate
3191 frame is active. */ 3238 frame is active. */
3192 Fselect_frame (WINDOW_FRAME (w), Qnil); 3239 Fselect_frame (WINDOW_FRAME (w));
3193 } 3240 }
3194 else 3241 else
3195 sf->selected_window = window; 3242 sf->selected_window = window;