diff --git a/term_util.c b/term_util.c index ca16425..f2bf29c 100644 --- a/term_util.c +++ b/term_util.c @@ -59,10 +59,10 @@ void qnav_deinit() { while (qnav_stack.count != 0) qnav_stack_pop(); } -void qnav_stack_push(Qblock_type_tag tag, int height, int width, Qblock* out) { +void qnav_stack_push(Qblock* qb, int height, int width) { #ifndef NDEBUG for (Usz i = 0; i < qnav_stack.count; ++i) { - assert(qnav_stack.blocks[i] != out); + assert(qnav_stack.blocks[i] != qb); } #endif int left; @@ -72,12 +72,10 @@ void qnav_stack_push(Qblock_type_tag tag, int height, int width, Qblock* out) { } else { left = 0; } - qnav_stack.blocks[qnav_stack.count] = out; + qnav_stack.blocks[qnav_stack.count] = qb; ++qnav_stack.count; - out->title = NULL; - out->outer_window = newwin(height + 2, width + 3, 0, left); - out->content_window = derwin(out->outer_window, height, width, 1, 1); - out->tag = tag; + qb->outer_window = newwin(height + 2, width + 3, 0, left); + qb->content_window = derwin(qb->outer_window, height, width, 1, 1); qnav_stack.stack_changed = true; } @@ -86,24 +84,12 @@ Qblock* qnav_top_block() { return NULL; return qnav_stack.blocks[qnav_stack.count - 1]; } -void qnav_free_block(Qblock* qb); -void qnav_stack_pop() { - assert(qnav_stack.count > 0); - if (qnav_stack.count == 0) - return; - Qblock* qb = qnav_stack.blocks[qnav_stack.count - 1]; - WINDOW* content_window = qb->content_window; - WINDOW* outer_window = qb->outer_window; - // erase any stuff underneath where this window is, in case it's outside of - // the grid in an area that isn't actively redraw - werase(outer_window); - wnoutrefresh(outer_window); - qnav_free_block(qb); - delwin(content_window); - delwin(outer_window); - --qnav_stack.count; - qnav_stack.blocks[qnav_stack.count] = NULL; - qnav_stack.stack_changed = true; + +void qblock_init(Qblock* qb, Qblock_type_tag tag) { + qb->tag = tag; + qb->outer_window = NULL; + qb->content_window = NULL; + qb->title = NULL; } void qmenu_free(Qmenu* qm); @@ -124,6 +110,25 @@ void qnav_free_block(Qblock* qb) { } } +void qnav_stack_pop() { + assert(qnav_stack.count > 0); + if (qnav_stack.count == 0) + return; + Qblock* qb = qnav_stack.blocks[qnav_stack.count - 1]; + WINDOW* content_window = qb->content_window; + WINDOW* outer_window = qb->outer_window; + // erase any stuff underneath where this window is, in case it's outside of + // the grid in an area that isn't actively redraw + werase(outer_window); + wnoutrefresh(outer_window); + qnav_free_block(qb); + delwin(content_window); + delwin(outer_window); + --qnav_stack.count; + qnav_stack.blocks[qnav_stack.count] = NULL; + qnav_stack.stack_changed = true; +} + void qblock_print_border(Qblock* qb, unsigned int attr) { wborder(qb->outer_window, ACS_VLINE | attr, ACS_VLINE | attr, ACS_HLINE | attr, ACS_HLINE | attr, ACS_ULCORNER | attr, @@ -165,7 +170,8 @@ void qmsg_set_title(Qmsg* qm, char const* title) { Qmsg* qmsg_push(int height, int width) { Qmsg* qm = malloc(sizeof(Qmsg)); - qnav_stack_push(Qblock_type_qmsg, height, width, &qm->qblock); + qblock_init(&qm->qblock, Qblock_type_qmsg); + qnav_stack_push(&qm->qblock, height, width); return qm; } @@ -185,6 +191,7 @@ Qmsg* qmsg_of(Qblock* qb) { return ORCA_CONTAINER_OF(qb, Qmsg, qblock); } Qmenu* qmenu_create(int id) { Qmenu* qm = (Qmenu*)malloc(sizeof(Qmenu)); + qblock_init(&qm->qblock, Qblock_type_qmenu); qm->ncurses_menu = NULL; qm->ncurses_items[0] = NULL; qm->items_count = 0; @@ -217,7 +224,7 @@ void qmenu_push_to_nav(Qmenu* qm) { set_menu_grey(qm->ncurses_menu, A_DIM); int menu_min_h, menu_min_w; scale_menu(qm->ncurses_menu, &menu_min_h, &menu_min_w); - qnav_stack_push(Qblock_type_qmenu, menu_min_h, menu_min_w, &qm->qblock); + qnav_stack_push(&qm->qblock, menu_min_h, menu_min_w); set_menu_win(qm->ncurses_menu, qm->qblock.outer_window); set_menu_sub(qm->ncurses_menu, qm->qblock.content_window); post_menu(qm->ncurses_menu); @@ -290,6 +297,7 @@ bool qmenu_top_is_menu(int id) { Qform* qform_create(int id) { Qform* qf = (Qform*)malloc(sizeof(Qform)); + qblock_init(&qf->qblock, Qblock_type_qform); qf->ncurses_form = NULL; qf->ncurses_fields[0] = NULL; qf->fields_count = 0; @@ -315,7 +323,7 @@ void qform_push_to_nav(Qform* qf) { qf->ncurses_form = new_form(qf->ncurses_fields); int form_min_h, form_min_w; scale_form(qf->ncurses_form, &form_min_h, &form_min_w); - qnav_stack_push(Qblock_type_qform, form_min_h, form_min_w, &qf->qblock); + qnav_stack_push(&qf->qblock, form_min_h, form_min_w); set_form_win(qf->ncurses_form, qf->qblock.outer_window); set_form_sub(qf->ncurses_form, qf->qblock.content_window); post_form(qf->ncurses_form);