diff options
-rw-r--r-- | src/calcurse.h | 1 | ||||
-rw-r--r-- | src/utils.c | 42 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/calcurse.h b/src/calcurse.h index f2e6991..4b54549 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -896,6 +896,7 @@ void fatalbox (const char *); void warnbox (const char *); void status_mesg (const char *, const char *); void status_mesg_yesno (const char *); +int status_ask_choice (const char *, const char[], int); void erase_window_part (WINDOW *, int, int, int, int); WINDOW *popup (int, int, int, int, const char *, const char *, int); void print_in_middle (WINDOW *, int, int, int, const char *); diff --git a/src/utils.c b/src/utils.c index 8ddbe59..92c9d2b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -191,6 +191,48 @@ status_mesg_yesno (const char *msg) status_mesg (msg, "[y/n] "); } +/* + * Prompts the user to make a choice between named alternatives. + * + * The available choices are described by a string of the form + * "[ynp]". The first and last char are ignored (they are only here to + * make the translators' life easier), and every other char indicates + * a key the user is allowed to press. + * + * Returns the index of the key pressed by the user (starting from 1), + * or -1 if the user doesn't want to answer (e.g. by escaping). + */ +int +status_ask_choice(const char *message, const char choice[], int nb_choice) +{ + int i, ch; + char tmp[BUFSIZ]; + /* "[4/2/f/t/w/.../Z] " */ + char avail_choice[2 * nb_choice + 3]; + + avail_choice[0] = '['; + avail_choice[1] = '\0'; + + for (i = 1; i <= nb_choice; i++) + { + sprintf (tmp, (i == nb_choice) ? "%c] " : "%c/", choice[i]); + strcat (avail_choice, tmp); + } + + status_mesg (message, avail_choice); + + for (;;) + { + ch = wgetch (win[STA].p); + for (i = 1; i <= nb_choice; i++) + if (ch == choice[i]) + return i; + if (ch == ESCAPE) + return (-1); + /* TODO: handle resize events. */ + } +} + /* Erase part of a window. */ void erase_window_part (WINDOW *win, int first_col, int first_row, int last_col, |