]> err.no Git - linux-2.6/commitdiff
kconfig/lxdialog: let <ESC><ESC> behave as expected
authorSam Ravnborg <sam@mars.ravnborg.org>
Fri, 28 Jul 2006 21:57:48 +0000 (23:57 +0200)
committerSam Ravnborg <sam@neptun.ravnborg.org>
Sat, 30 Sep 2006 09:19:20 +0000 (11:19 +0200)
<ESC><ESC> is used to step one back in the dialogs.
When lxdialog became built-in pressing <ESC> once would cause one step back
and pressing <ESC><ESC> would cause two steps back.
This patch - based on concept from Roman Zippel <zippel@linux-m68k.org> -
makes one <ESC> a noop and pressing <ESC><ESC> will cause one step backward.

In addition the final yes/no dialog now has the option to go back to the
the kernel configuration. So if you get too far out you can now go back
to configuring the kernel without saving and starting all over again.

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
scripts/kconfig/lxdialog/checklist.c
scripts/kconfig/lxdialog/dialog.h
scripts/kconfig/lxdialog/inputbox.c
scripts/kconfig/lxdialog/menubox.c
scripts/kconfig/lxdialog/textbox.c
scripts/kconfig/lxdialog/util.c
scripts/kconfig/lxdialog/yesno.c
scripts/kconfig/mconf.c

index 282511020bcb64b9de9f5bf9d100acfce8065fa0..39becb72444a70aedc8132f2a0f078b4fd8bcb0a 100644 (file)
@@ -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 */
 }
index 065ded0a449f2c7c9f3ee8f2ea71a40dccaa3fad..a7cfdecc2409b695cd8cd063b15e3fa8a9a8cd5d 100644 (file)
@@ -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);
index 9c53098d6b741de2e90cccc415471885ac8ec4ea..edb7975dbaa2e2a69b6f9af4503b9ef90971ff73 100644 (file)
@@ -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 */
 }
index f39ae29f4fcc10165b34f421fd07c69eadcb74ac..d3305bad15c7a115b4345b4e83cb8bd7e9675250 100644 (file)
@@ -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 */
 }
index 86b0770b03877313f1cbe56e25ec3672c2354820..a99e1f497d67e54cc4fd1ec63db2b2ec72f88f1f 100644 (file)
@@ -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 */
 }
 
 /*
index 0b3118df50df0ca37cfcce172c8d8386916c51d2..cb21dc4dd9fc21fe697a855f5e5258c07cabb646 100644 (file)
@@ -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;
index 9fc24492c52f3a0c7c406ce9fb130bc59ef16780..8364f9dd01c3340f8676cc9d7c70ad35a599e0f2 100644 (file)
@@ -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 */
 }
index b1ad9a00ab19c9ee3149b379afbd2665ec9697e9..ef75d6c3d3e52806f27c52c8af3ca3d7a697a048 100644 (file)
@@ -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)) {