diff --git a/term_util.c b/term_util.c index 534b8f2..d9d7c1a 100644 --- a/term_util.c +++ b/term_util.c @@ -136,12 +136,20 @@ bool qmsg_drive(Qmsg* qm, int key) { Qmsg* qmsg_of(Qnav_block* qb) { return ORCA_CONTAINER_OF(qb, Qmsg, nav_block); } -void qmenu_start(Qmenu* qm) { memset(qm, 0, sizeof(Qmenu)); } +Qmenu* qmenu_create(int id) { + Qmenu* qm = (Qmenu*)malloc(sizeof(Qmenu)); + qm->ncurses_menu = NULL; + qm->ncurses_items[0] = NULL; + qm->items_count = 0; + qm->id = id; + return qm; +} void qmenu_add_choice(Qmenu* qm, char const* text, int id) { ITEM* item = new_item(text, NULL); set_item_userptr(item, (void*)(intptr_t)(id)); qm->ncurses_items[qm->items_count] = item; ++qm->items_count; + qm->ncurses_items[qm->items_count] = NULL; } void qmenu_add_spacer(Qmenu* qm) { ITEM* item = new_item(" ", NULL); @@ -149,6 +157,7 @@ void qmenu_add_spacer(Qmenu* qm) { set_item_userptr(item, &qmenu_spacer_user_unique); qm->ncurses_items[qm->items_count] = item; ++qm->items_count; + qm->ncurses_items[qm->items_count] = NULL; } void qmenu_push_to_nav(Qmenu* qm) { qm->ncurses_menu = new_menu(qm->ncurses_items); @@ -168,6 +177,7 @@ void qmenu_free(Qmenu* qm) { for (Usz i = 0; i < qm->items_count; ++i) { free_item(qm->ncurses_items[i]); } + free(qm); } void qnav_free_block(Qnav_block* qb) { diff --git a/term_util.h b/term_util.h index 0cf7358..afd2ef2 100644 --- a/term_util.h +++ b/term_util.h @@ -66,6 +66,7 @@ typedef struct { MENU* ncurses_menu; ITEM* ncurses_items[32]; Usz items_count; + int id; } Qmenu; typedef enum { @@ -100,7 +101,7 @@ void qmsg_set_title(Qmsg* qm, char const* title); bool qmsg_drive(Qmsg* qm, int key); Qmsg* qmsg_of(Qnav_block* qb); -void qmenu_start(Qmenu* qm); +Qmenu* qmenu_create(); void qmenu_add_choice(Qmenu* qm, char const* text, int id); void qmenu_add_spacer(Qmenu* qm); void qmenu_push_to_nav(Qmenu* qm); diff --git a/tui_main.c b/tui_main.c index 0d6ad04..558df99 100644 --- a/tui_main.c +++ b/tui_main.c @@ -1438,6 +1438,10 @@ bool hacky_try_save(Field* field, char const* filename) { // menu stuff // +enum { + Main_menu_id = 1, +}; + enum { Main_menu_quit = 1, Main_menu_controls, @@ -1445,13 +1449,8 @@ enum { Main_menu_save_as, }; -struct { - Qmenu qmenu; -} g_main_menu; - void push_main_menu() { - Qmenu* qm = &g_main_menu.qmenu; - qmenu_start(qm); + Qmenu* qm = qmenu_create(Main_menu_id); qmenu_add_choice(qm, "Save", Main_menu_save); // qmenu_add_choice(qm, "Save As...", Main_menu_save_as); qmenu_add_spacer(qm); @@ -1841,7 +1840,7 @@ int main(int argc, char** argv) { qnav_stack_pop(); } break; case Qmenu_action_type_picked: { - if (qm == &g_main_menu.qmenu) { + if (qm->id == Main_menu_id) { switch (act.picked.id) { case Main_menu_quit: goto quit;