diff options
-rw-r--r-- | scripts/kconfig/lxdialog/checklist.c | 10 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/dialog.h | 4 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/inputbox.c | 10 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/menubox.c | 10 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/textbox.c | 7 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/util.c | 33 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/yesno.c | 7 | ||||
-rw-r--r-- | scripts/kconfig/mconf.c | 25 |
8 files changed, 76 insertions, 30 deletions
diff --git a/scripts/kconfig/lxdialog/checklist.c b/scripts/kconfig/lxdialog/checklist.c index 282511020bc..39becb72444 100644 --- a/scripts/kconfig/lxdialog/checklist.c +++ b/scripts/kconfig/lxdialog/checklist.c @@ -192,7 +192,7 @@ int dialog_checklist(const char *title, const char *prompt, int height, wnoutrefresh(list); doupdate(); - while (key != ESC) { + while (key != KEY_ESC) { key = wgetch(dialog); for (i = 0; i < max_choice; i++) { @@ -298,8 +298,10 @@ int dialog_checklist(const char *title, const char *prompt, int height, break; case 'X': case 'x': - key = ESC; - case ESC: + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(dialog); break; } @@ -308,5 +310,5 @@ int dialog_checklist(const char *title, const char *prompt, int height, } delwin(list); delwin(dialog); - return 255; /* ESC pressed */ + return key; /* ESC pressed */ } diff --git a/scripts/kconfig/lxdialog/dialog.h b/scripts/kconfig/lxdialog/dialog.h index 065ded0a449..a7cfdecc240 100644 --- a/scripts/kconfig/lxdialog/dialog.h +++ b/scripts/kconfig/lxdialog/dialog.h @@ -48,7 +48,7 @@ #define TR(params) _tracef params -#define ESC 27 +#define KEY_ESC 27 #define TAB 9 #define MAX_LEN 2048 #define BUF_SIZE (10*1024) @@ -179,6 +179,8 @@ int item_is_tag(char tag); for (item_cur = item_head ? item_head: item_cur; \ item_cur && (item_cur != &item_nil); item_cur = item_cur->next) +/* generic key handlers */ +int on_key_esc(WINDOW *win); void init_dialog(const char *backtitle); void reset_dialog(void); diff --git a/scripts/kconfig/lxdialog/inputbox.c b/scripts/kconfig/lxdialog/inputbox.c index 9c53098d6b7..edb7975dbaa 100644 --- a/scripts/kconfig/lxdialog/inputbox.c +++ b/scripts/kconfig/lxdialog/inputbox.c @@ -106,7 +106,7 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width wrefresh(dialog); - while (key != ESC) { + while (key != KEY_ESC) { key = wgetch(dialog); if (button == -1) { /* Input box selected */ @@ -215,12 +215,14 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width return (button == -1 ? 0 : button); case 'X': case 'x': - key = ESC; - case ESC: + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(dialog); break; } } delwin(dialog); - return 255; /* ESC pressed */ + return KEY_ESC; /* ESC pressed */ } diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c index f39ae29f4fc..d3305bad15c 100644 --- a/scripts/kconfig/lxdialog/menubox.c +++ b/scripts/kconfig/lxdialog/menubox.c @@ -263,7 +263,7 @@ int dialog_menu(const char *title, const char *prompt, int height, int width, wmove(menu, choice, item_x + 1); wrefresh(menu); - while (key != ESC) { + while (key != KEY_ESC) { key = wgetch(menu); if (key < 256 && isalpha(key)) @@ -402,12 +402,14 @@ int dialog_menu(const char *title, const char *prompt, int height, int width, return button; case 'e': case 'x': - key = ESC; - case ESC: + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(menu); break; } } delwin(menu); delwin(dialog); - return 255; /* ESC pressed */ + return key; /* ESC pressed */ } diff --git a/scripts/kconfig/lxdialog/textbox.c b/scripts/kconfig/lxdialog/textbox.c index 86b0770b038..a99e1f497d6 100644 --- a/scripts/kconfig/lxdialog/textbox.c +++ b/scripts/kconfig/lxdialog/textbox.c @@ -92,7 +92,7 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) wmove(dialog, cur_y, cur_x); /* Restore cursor position */ wrefresh(dialog); - while ((key != ESC) && (key != '\n')) { + while ((key != KEY_ESC) && (key != '\n')) { key = wgetch(dialog); switch (key) { case 'E': /* Exit */ @@ -228,13 +228,14 @@ int dialog_textbox(const char *title, const char *tbuf, int height, int width) wmove(dialog, cur_y, cur_x); wrefresh(dialog); break; - case ESC: + case KEY_ESC: + key = on_key_esc(dialog); break; } } delwin(text); delwin(dialog); - return 255; /* ESC pressed */ + return key; /* ESC pressed */ } /* diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c index 0b3118df50d..cb21dc4dd9f 100644 --- a/scripts/kconfig/lxdialog/util.c +++ b/scripts/kconfig/lxdialog/util.c @@ -477,6 +477,39 @@ int first_alpha(const char *string, const char *exempt) return 0; } +/* + * ncurses uses ESC to detect escaped char sequences. This resutl in + * a small timeout before ESC is actually delivered to the application. + * lxdialog suggest <ESC> <ESC> which is correctly translated to two + * times esc. But then we need to ignore the second esc to avoid stepping + * out one menu too much. Filter away all escaped key sequences since + * keypad(FALSE) turn off ncurses support for escape sequences - and thats + * needed to make notimeout() do as expected. + */ +int on_key_esc(WINDOW *win) +{ + int key; + int key2; + int key3; + + nodelay(win, TRUE); + keypad(win, FALSE); + key = wgetch(win); + key2 = wgetch(win); + do { + key3 = wgetch(win); + } while (key3 != ERR); + nodelay(win, FALSE); + keypad(win, TRUE); + if (key == KEY_ESC && key2 == ERR) + return KEY_ESC; + else if (key != ERR && key != KEY_ESC && key2 == ERR) + ungetch(key); + + return -1; +} + + struct dialog_list *item_cur; struct dialog_list item_nil; struct dialog_list *item_head; diff --git a/scripts/kconfig/lxdialog/yesno.c b/scripts/kconfig/lxdialog/yesno.c index 9fc24492c52..8364f9dd01c 100644 --- a/scripts/kconfig/lxdialog/yesno.c +++ b/scripts/kconfig/lxdialog/yesno.c @@ -69,7 +69,7 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width) print_buttons(dialog, height, width, 0); - while (key != ESC) { + while (key != KEY_ESC) { key = wgetch(dialog); switch (key) { case 'Y': @@ -93,11 +93,12 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width) case '\n': delwin(dialog); return button; - case ESC: + case KEY_ESC: + key = on_key_esc(dialog); break; } } delwin(dialog); - return 255; /* ESC pressed */ + return key; /* ESC pressed */ } diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index b1ad9a00ab1..ef75d6c3d3e 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -608,7 +608,7 @@ static void conf(struct menu *menu) _(menu_instructions), rows, cols, rows - 10, active_menu, &s_scroll); - if (res == 1 || res == 255) + if (res == 1 || res == KEY_ESC) break; if (!item_activate_selected()) continue; @@ -754,7 +754,7 @@ static void conf_choice(struct menu *menu) } else show_help(menu); break; - case 255: + case KEY_ESC: return; } } @@ -794,7 +794,7 @@ static void conf_string(struct menu *menu) case 1: show_help(menu); break; - case 255: + case KEY_ESC: return; } } @@ -819,7 +819,7 @@ static void conf_load(void) case 1: show_helptext(_("Load Alternate Configuration"), load_config_help); break; - case 255: + case KEY_ESC: return; } } @@ -843,7 +843,7 @@ static void conf_save(void) case 1: show_helptext(_("Save Alternate Configuration"), save_config_help); break; - case 255: + case KEY_ESC: return; } } @@ -883,12 +883,15 @@ int main(int ac, char **av) init_wsize(); reset_dialog(); init_dialog(menu_backtitle); - conf(&rootmenu); - reset_dialog(); - res = dialog_yesno(NULL, - _("Do you wish to save your " - "new kernel configuration?"), - 5, 60); + do { + conf(&rootmenu); + reset_dialog(); + res = dialog_yesno(NULL, + _("Do you wish to save your " + "new kernel configuration?\n" + "<ESC><ESC> to continue."), + 6, 60); + } while (res == KEY_ESC); end_dialog(); if (res == 0) { if (conf_write(NULL)) { |