$NetBSD: patch-aj,v 1.1 2009/10/22 22:01:26 wiz Exp $ --- src/prompt.c.orig 2009-01-23 16:10:39.000000000 +0100 +++ src/prompt.c @@ -44,6 +44,7 @@ static char *prompt_slk_message; /* prompt message for prompt_slk_redraw */ +static char *prompt_yn_message; /* * Local prototypes @@ -163,7 +164,7 @@ prompt_yn( { char *keyprompt; char keyno[MAXKEYLEN], keyyes[MAXKEYLEN]; - int keyyes_len = 0, keyno_len = 0, maxlen; + int keyyes_len = 0, keyno_len = 0, maxlen, prompt_len; t_function func; #if defined (MULTIBYTE_ABLE) && !defined(NO_LOCALE) wint_t yes, no, prompt_ch, ch; @@ -194,21 +195,17 @@ prompt_yn( keyno_len = (int) strlen(keyno); #endif /* MULTIBYTE_ABLE && !NO_LOCALE */ maxlen = MAX(keyyes_len, keyno_len); + prompt_len = (int) strlen(prompt) + keyyes_len + keyno_len + maxlen + 6; + prompt_yn_message = my_malloc(prompt_len + 1); + + input_context = cPromptYN; do { prompt_ch = (default_answer ? yes : no); keyprompt = (default_answer ? keyyes : keyno); - if (!cmd_line) { - MoveCursor(cLINES, 0); - CleartoEOLN(); - } - my_printf("%s (%s/%s) %-*s", prompt, keyyes, keyno, maxlen, keyprompt); - if (!cmd_line) - cursoron(); - my_flush(); - if (!cmd_line) - MoveCursor(cLINES, (int) strlen(prompt) + keyyes_len + keyno_len + 5); + snprintf(prompt_yn_message, prompt_len, "%s (%s/%s) %-*s", prompt, keyyes, keyno, maxlen, keyprompt); + prompt_yn_redraw(); #if defined (MULTIBYTE_ABLE) && !defined(NO_LOCALE) if (((ch = ReadWch()) == '\n') || (ch == '\r')) @@ -248,6 +245,9 @@ prompt_yn( func = key_to_func(ch, prompt_keys); } while (func == NOT_ASSIGNED); + input_context = cNone; + FreeAndNull(prompt_yn_message); + if (!cmd_line) { clear_message(); my_flush(); @@ -256,6 +256,24 @@ prompt_yn( } +/* (Re)draws the prompt message for prompt_yn() */ +void +prompt_yn_redraw( + void) +{ + if (!cmd_line) { + MoveCursor(cLINES, 0); + CleartoEOLN(); + } + my_printf("%s", prompt_yn_message); + if (!cmd_line) + cursoron(); + my_flush(); + if (!cmd_line) + MoveCursor(cLINES, (int) strlen(prompt_yn_message) -1); +} + + /* * help_text is displayed near the bottom of the screen. * var is an index into a list containing size elements. @@ -745,11 +763,14 @@ prompt_continue( void) { int ch; + int save_signal_context = signal_context; #ifdef USE_CURSES cmd_line = TRUE; #endif /* USE_CURSES */ info_message(_(txt_return_key)); + signal_context = cMain; + input_context = cPromptCONT; switch ((ch = ReadCh())) { case ESC: @@ -763,6 +784,10 @@ prompt_continue( break; } + input_context = cNone; + signal_context = save_signal_context; + my_fputc('\n', stdout); + #ifdef USE_CURSES cmd_line = FALSE; my_retouch();