diff options
Diffstat (limited to 'scripts/kconfig/lxdialog')
-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 |
7 files changed, 62 insertions, 19 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 */ } |