+void draw_windows (struct Win * win) {
+// Draw contents of all windows in window chain from win on.
+ win->draw(win);
+ if (0 != win->next) {
+ draw_windows (win->next); } }
+
+void draw_all_windows (struct WinMeta * win_meta) {
+// Draw all windows and their borders.
+ erase();
+ wnoutrefresh(win_meta->screen);
+ werase(win_meta->pad);
+ if (win_meta->chain_start) {
+ uint16_t n_wins = 1;
+ struct Win * win_p = win_meta->chain_start;
+ while (0 != win_p->next) {
+ win_p = win_p->next;
+ n_wins++; }
+ struct Corners * all_corners = malloc(sizeof(struct Corners) * n_wins);
+ draw_windows (win_meta->chain_start);
+ draw_windows_borders (win_meta->chain_start, win_meta->active, all_corners, 0);
+ uint16_t i;
+ for (i = 0; i < n_wins; i++) {
+ mvwaddch(win_meta->pad, all_corners[i].tl.y, all_corners[i].tl.x, '+');
+ mvwaddch(win_meta->pad, all_corners[i].tr.y, all_corners[i].tr.x, '+');
+ mvwaddch(win_meta->pad, all_corners[i].bl.y, all_corners[i].bl.x, '+');
+ mvwaddch(win_meta->pad, all_corners[i].br.y, all_corners[i].br.x, '+'); }
+ pnoutrefresh(win_meta->pad, 0, win_meta->pad_offset, 0, 0, win_meta->height, win_meta->width - 1);
+ free(all_corners); }
+ doupdate(); }
+
+void resize_active_window (struct WinMeta * win_meta, uint16_t height, uint16_t width) {