void glk_stream_close(stream_t *str, stream_result_t *result) { if (!str) { gli_strict_warning("stream_close: invalid ref"); return; } if (str->type == strtype_Window) { gli_strict_warning("stream_close: cannot close window stream"); return; } gli_stream_fill_result(str, result); gli_stream_close(str); }
void glk_window_close(window_t *win, stream_result_t *result) { if (!win) { gli_strict_warning("window_close: invalid ref"); return; } if (win == gli_rootwin || win->parent == NULL) { /* close the root window, which means all windows. */ gli_rootwin = 0; /* begin (simpler) closation */ geometry_changed = TRUE; gli_stream_fill_result(win->str, result); gli_window_close(win, TRUE); } else { /* have to jigger parent */ grect_t box; window_t *pairwin, *sibwin, *grandparwin, *wx; window_pair_t *dpairwin, *dgrandparwin; int keydamage_flag; pairwin = win->parent; dpairwin = pairwin->data; if (win == dpairwin->child1) { sibwin = dpairwin->child2; } else if (win == dpairwin->child2) { sibwin = dpairwin->child1; } else { gli_strict_warning("window_close: window tree is corrupted"); return; } box = pairwin->bbox; grandparwin = pairwin->parent; if (!grandparwin) { gli_rootwin = sibwin; sibwin->parent = NULL; } else { dgrandparwin = grandparwin->data; if (dgrandparwin->child1 == pairwin) dgrandparwin->child1 = sibwin; else dgrandparwin->child2 = sibwin; sibwin->parent = grandparwin; } /* Begin closation */ gli_stream_fill_result(win->str, result); /* Close the child window (and descendants), so that key-deletion can crawl up the tree to the root window. */ gli_window_close(win, TRUE); /* This probably isn't necessary, but the child *is* gone, so just in case. */ if (win == dpairwin->child1) { dpairwin->child1 = NULL; } else if (win == dpairwin->child2) { dpairwin->child2 = NULL; } /* Now we can delete the parent pair. */ gli_window_close(pairwin, FALSE); keydamage_flag = FALSE; for (wx=sibwin; wx; wx=wx->parent) { if (wx->type == wintype_Pair) { window_pair_t *dwx = wx->data; if (dwx->keydamage) { keydamage_flag = TRUE; dwx->keydamage = FALSE; } } } if (keydamage_flag) { compute_content_box(&box); gli_window_rearrange(gli_rootwin, &box, &metrics); } else { gli_window_rearrange(sibwin, &box, &metrics); } } }