diff --git a/term_util.c b/term_util.c index 3e74800..c9a297d 100644 --- a/term_util.c +++ b/term_util.c @@ -35,6 +35,7 @@ void term_util_init_colors() { struct Qmsg { Qblock qblock; + Qmsg_dismiss_mode dismiss_mode; }; struct Qmenu_item_extra { @@ -212,9 +213,16 @@ void qmsg_set_title(Qmsg *qm, char const *title) { qblock_set_title(&qm->qblock, title); } +void qmsg_set_dismiss_mode(Qmsg *qm, Qmsg_dismiss_mode mode) { + if (qm->dismiss_mode == mode) + return; + qm->dismiss_mode = mode; +} + Qmsg *qmsg_push(int height, int width) { Qmsg *qm = malloc(sizeof(Qmsg)); qblock_init(&qm->qblock, Qblock_type_qmsg); + qm->dismiss_mode = Qmsg_dismiss_mode_explicitly; qnav_stack_push(&qm->qblock, height, width); return qm; } @@ -270,13 +278,26 @@ Qmsg *qmsg_printf_push(char const *title, char const *fmt, ...) { return msg; } -bool qmsg_drive(Qmsg *qm, int key) { - (void)qm; +bool qmsg_drive(Qmsg *qm, int key, Qmsg_action *out_action) { + memset(out_action, 0, sizeof(Qmsg_action)); + Qmsg_dismiss_mode dm = qm->dismiss_mode; + switch (dm) { + case Qmsg_dismiss_mode_explicitly: + break; + case Qmsg_dismiss_mode_easily: + out_action->dismiss = true; + return true; + case Qmsg_dismiss_mode_passthrough: + out_action->dismiss = true; + out_action->passthrough = true; + return true; + } switch (key) { case ' ': case 27: case '\r': case KEY_ENTER: + out_action->dismiss = true; return true; } return false; diff --git a/term_util.h b/term_util.h index 6ea7c8a..a376c36 100644 --- a/term_util.h +++ b/term_util.h @@ -106,6 +106,16 @@ typedef union { Qform_action_any any; } Qform_action; +typedef enum { + Qmsg_dismiss_mode_explicitly, // Space, return, escape dismiss. Default. + Qmsg_dismiss_mode_easily, // Any key dismisses. + Qmsg_dismiss_mode_passthrough, // Easily, and pass through key event. +} Qmsg_dismiss_mode; + +typedef struct { + bool dismiss : 1, passthrough : 1; +} Qmsg_action; + void qnav_init(void); void qnav_deinit(void); Qblock *qnav_top_block(void); @@ -119,7 +129,8 @@ Qmsg *qmsg_printf_push(char const *title, char const *fmt, ...) ORCA_TERM_UTIL_PRINTF(2, 3); WINDOW *qmsg_window(Qmsg *qm); void qmsg_set_title(Qmsg *qm, char const *title); -bool qmsg_drive(Qmsg *qm, int key); +void qmsg_set_dismiss_mode(Qmsg *qm, Qmsg_dismiss_mode mode); +bool qmsg_drive(Qmsg *qm, int key, Qmsg_action *out_action); Qmsg *qmsg_of(Qblock *qb); Qmenu *qmenu_create(int id); diff --git a/tui_main.c b/tui_main.c index 78192b6..381ba9d 100644 --- a/tui_main.c +++ b/tui_main.c @@ -2176,7 +2176,8 @@ bool try_save_with_msg(Field *field, oso const *str) { return false; bool ok = hacky_try_save(field, osoc(str)); if (ok) { - qmsg_printf_push(NULL, "Saved to:\n%s", osoc(str)); + Qmsg *qm = qmsg_printf_push(NULL, "Saved to:\n%s", osoc(str)); + qmsg_set_dismiss_mode(qm, Qmsg_dismiss_mode_passthrough); } else { qmsg_printf_push("Error Saving File", "Unable to save file to:\n%s", osoc(str)); @@ -3163,8 +3164,13 @@ int main(int argc, char **argv) { switch (qb->tag) { case Qblock_type_qmsg: { Qmsg *qm = qmsg_of(qb); - if (qmsg_drive(qm, key)) - qnav_stack_pop(); + Qmsg_action act; + if (qmsg_drive(qm, key, &act)) { + if (act.dismiss) + qnav_stack_pop(); + if (act.passthrough) + ungetch(key); + } } break; case Qblock_type_qmenu: { Qmenu *qm = qmenu_of(qb);