From 676d45b3139bcaab1a032addc24645d8055cb2ca Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Thu, 13 Jun 2013 00:47:41 +0200 Subject: [PATCH] Added startx attribute to Win struct to allow for less pad refitting code. --- windows.c | 35 ++++++++++++++++------------------- windows.h | 1 + 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/windows.c b/windows.c index ef2e25f..5ab8371 100644 --- a/windows.c +++ b/windows.c @@ -14,6 +14,7 @@ struct Corners { struct yx bl; struct yx br; }; +static void refit_pad (struct WinMeta *); static struct yx place_window (struct WinMeta *, struct Win *); static void update_windows (struct WinMeta *, struct Win *); static void destroy_window (struct Win *); @@ -59,6 +60,17 @@ extern void append_window (struct WinMeta * win_meta, struct Win * win) { win_meta->chain_end = win; update_windows(win_meta, win); } +static void refit_pad (struct WinMeta * win_meta) { +// Fit pad width to minimum width demanded by current windows' geometries. + uint16_t lastwincol = 0; + struct Win * win_p = win_meta->chain_start; + while (win_p != 0) { + if (win_p->startx + win_p->width > lastwincol + 1) + lastwincol = win_p->startx + win_p->width - 1; + win_p = win_p->next; } + if (getmaxx(win_meta->pad) != lastwincol) + wresize(win_meta->pad, getmaxy(win_meta->pad), lastwincol + 2); } + extern void suspend_window (struct WinMeta * win_meta, struct Win * win) { // Destroy win, suspend from chain. Update geometry of following rows and pad, as well as activity selection. destroy_window(win); @@ -79,15 +91,8 @@ extern void suspend_window (struct WinMeta * win_meta, struct Win * win) { win_meta->active = win->prev; } win->prev = 0; win->next = 0; - if (0 == pad_refitted) { // Refit pad if necessary. - uint16_t lastwincol = 0; - struct Win * win_p = win_meta->chain_start; - while (win_p != 0) { - if (getbegx(win_p->curses) + win_p->width > lastwincol + 1) - lastwincol = getbegx(win_p->curses) + win_p->width - 1; - win_p = win_p->next; } - if (getmaxx(win_meta->pad) != lastwincol) - wresize(win_meta->pad, getmaxy(win_meta->pad), lastwincol + 2); } } + if (0 == pad_refitted) // Refit pad if necessary. + refit_pad(win_meta); } static struct yx place_window (struct WinMeta * win_meta, struct Win * win) { // Based on position and sizes of previous window, find fitting place for current window. @@ -127,16 +132,8 @@ static void update_windows (struct WinMeta * win_meta, struct Win * win) { if (0 != win->curses) destroy_window (win); struct yx startyx = place_window(win_meta, win); - uint16_t lastwincol = 0; - struct Win * win_p = win_meta->chain_start; - while (win_p != 0) { - if (win_p != win && getbegx(win_p->curses) + win_p->width > lastwincol + 1) - lastwincol = getbegx(win_p->curses) + win_p->width - 1; - else if (win_p == win && startyx.x + win->width > lastwincol + 1) - lastwincol = startyx.x + win->width - 1; - win_p = win_p->next; } - if (getmaxx(win_meta->pad) != lastwincol) - wresize(win_meta->pad, getmaxy(win_meta->pad), lastwincol + 2); + win->startx = startyx.x; + refit_pad(win_meta); win->curses = subpad(win_meta->pad, win->height, win->width, startyx.y, startyx.x); if (0 != win->next) update_windows (win_meta, win->next); } diff --git a/windows.h b/windows.h index 3518c37..ab03812 100644 --- a/windows.h +++ b/windows.h @@ -11,6 +11,7 @@ struct WinMeta { struct Win { struct Win * prev; struct Win * next; + uint16_t startx; uint16_t width; uint16_t height; WINDOW * curses; -- 2.30.2