diff options
Diffstat (limited to 'src/window.c')
| -rw-r--r-- | src/window.c | 51 |
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; |