X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fwindows.c;h=64251aec7e4389b90e28c260be82247573a528e0;hb=6b2ad52fe945a3c9cacea6cbdfc7fbf6d783ccaf;hp=b62bfc5b7af2bb5cb5d431e1e63840c060d4b07c;hpb=0dabaa36270dbe843f1da82e4d325b280e6d8e91;p=plomrogue diff --git a/src/windows.c b/src/windows.c index b62bfc5..64251ae 100644 --- a/src/windows.c +++ b/src/windows.c @@ -1,7 +1,7 @@ /* windows.c */ #include "windows.h" -#include /* for uint8_t, uint16_t, uint32_t */ +#include /* for uint8_t, uint16_t, uint32_t, UINT16_MAX */ #include /* for typedefs WINDOW, chtype, wresize(), getmaxx(), */ /* getmaxy(), supbad(), delwin(), mvwaddch(), */ /* mvwaddstr(), newpad(), wnoutrefres(), erase(), */ @@ -13,7 +13,7 @@ /* Fit virtual screen's width to minimum width demanded by current windows' - * geometries. Returns 0 on success, 1 on (pad memory allocation) error. + * geometries. */ static uint8_t refit_pad(struct WinMeta * wmeta); @@ -21,15 +21,13 @@ static uint8_t refit_pad(struct WinMeta * wmeta); /* Update geometry (sizes, positions) of window "w" and its successors in the * window chain. For the positioning algorithm place_win() is used. - * - * update_wins() returns 0 on success, 1 on (pad/window memory alloc.) error. */ static uint8_t update_wins(struct WinMeta * wmeta, struct Win * w); static void place_win(struct WinMeta * wmeta, struct Win * w); -/* Destroy window "w"'s ncurses window (and set w.Frame.curses_win to 0). */ +/* Destroy window "w"'s ncurses WINDOW (and set w.Frame.curses_win to 0). */ static void destroy_win(struct Win * w); @@ -42,13 +40,13 @@ static void draw_wins(struct Win * w); /* draw_win_borderlines() draws the vertical and horizontal borders of window * "w" sans corners into the virtual screen "pad", and draws the top border * line as the windows' title bar (highlighted if the window is described - * active by "active" being set). draw_wins_borderlines(). + * active by "active" being == 1). * * draw_wins_borderlines() calls draw_win_borderlines() recursively on all * windows from "w" on. "w_active" is a pointer to the one window that * draw_win_borderlines() is supposed to handle as the active window. * - * Finally, draw_wins_bordercorners draws into "pad" the borders of window "w" + * Finally, draw_wins_bordercorners() draws into "pad" the borders of window "w" * and all its successors. */ static void draw_win_borderlines(struct Win * w, char active, WINDOW * pad); @@ -67,13 +65,15 @@ static void shift_win_backward(struct WinMeta * wmeta); static uint8_t refit_pad(struct WinMeta * wmeta) { /* Determine rightmost window column. */ - uint16_t lastwincol = 0; + uint32_t lastwincol = 0; struct Win * w_p = wmeta->_chain_start; while (w_p != 0) { - if (w_p->_start.x + w_p->frame.size.x > lastwincol + 1) + if ((uint32_t) w_p->_start.x + (uint32_t) w_p->frame.size.x + > lastwincol + 1) { - lastwincol = w_p->_start.x + w_p->frame.size.x - 1; + lastwincol = (uint32_t) w_p->_start.x + + (uint32_t) w_p->frame.size.x - 1; } w_p = w_p->_next; } @@ -81,6 +81,10 @@ static uint8_t refit_pad(struct WinMeta * wmeta) /* Only resize the pad if the rightmost window column has changed. */ if (getmaxx(wmeta->padframe.curses_win) != lastwincol) { + if (lastwincol + 2 > UINT16_MAX) /* Abort if pad would grow beyond */ + { /* yx_uint16 confines. */ + return 2; + } return (ERR == wresize(wmeta->padframe.curses_win, getmaxy(wmeta->padframe.curses_win), lastwincol + 2)); @@ -97,18 +101,19 @@ static uint8_t update_wins(struct WinMeta * wmeta, struct Win * w) destroy_win(w); } place_win(wmeta, w); - if (0 != refit_pad(wmeta)) + uint8_t test_refit = refit_pad(wmeta); + if (0 != test_refit) { - return 1; + return test_refit; } - WINDOW * test = subpad(wmeta->padframe.curses_win, - w->frame.size.y, w->frame.size.x, - w->_start.y, w->_start.x); - if (NULL == test) + WINDOW * subpad_test = subpad(wmeta->padframe.curses_win, + w->frame.size.y, w->frame.size.x, + w->_start.y, w->_start.x); + if (NULL == subpad_test) { return 1; } - w->frame.curses_win = test; + w->frame.curses_win = subpad_test; if (0 != w->_next) { return update_wins(wmeta, w->_next); @@ -362,6 +367,11 @@ extern uint8_t init_win_meta(WINDOW * screen, struct WinMeta * wmeta) wmeta->_screen = screen; wmeta->padframe.size.y = getmaxy(screen); wmeta->padframe.size.x = getmaxx(screen); + if ( wmeta->padframe.size.y > UINT16_MAX + || wmeta->padframe.size.x > UINT16_MAX) + { + return 2; + } wmeta->_chain_start = 0; wmeta->_chain_end = 0; wmeta->pad_offset = 0; @@ -448,12 +458,13 @@ extern uint8_t suspend_win(struct WinMeta * wmeta, struct Win * w) { wmeta->active = w->_next; } - if (0 != update_wins(wmeta, w->_next)) /* Positioning of successor */ - { /* windows may be affected / */ - return 1; /* need correction. Note that */ - } /* update_wins() already */ - pad_refitted = 1; /* refits the pad, voiding */ - } /* later need for that. */ + uint8_t test = update_wins(wmeta, w->_next);/* Positioning of */ + if (0 != test) /* successor windows may */ + { /* be affected / need */ + return test; /* correction. Note that */ + } /* update_wins() already */ + pad_refitted = 1; /* refits the pad, voiding*/ + } /* later need for that. */ else { wmeta->_chain_end = w->_prev; @@ -535,7 +546,7 @@ extern void cycle_active_win(struct WinMeta * wmeta, char dir) extern uint8_t shift_active_win(struct WinMeta * wmeta, char dir) { - if ( 0 == wmeta->active /* No shifting with <2 */ + if ( 0 == wmeta->active /* No shifting with < 2 */ || wmeta->_chain_start == wmeta->_chain_end /* windows visible or */ || (dir != 'f' && dir != 'b')) /* wrong direction char. */ {