menuconfig: dont use obsolete index() function in lxdialog
[linux-2.6.git] / scripts / kconfig / lxdialog / menubox.c
index f39ae29f4fcc10165b34f421fd07c69eadcb74ac..0d83159d90127a1dad38be99edff1a0973353a33 100644 (file)
@@ -63,19 +63,19 @@ static int menu_width, item_x;
 /*
  * Print menu item
  */
-static void do_print_item(WINDOW * win, const char *item, int choice,
+static void do_print_item(WINDOW * win, const char *item, int line_y,
                           int selected, int hotkey)
 {
        int j;
        char *menu_item = malloc(menu_width + 1);
 
        strncpy(menu_item, item, menu_width - item_x);
-       menu_item[menu_width] = 0;
+       menu_item[menu_width - item_x] = '\0';
        j = first_alpha(menu_item, "YyNnMmHh");
 
        /* Clear 'residue' of last item */
        wattrset(win, dlg.menubox.atr);
-       wmove(win, choice, 0);
+       wmove(win, line_y, 0);
 #if OLD_NCURSES
        {
                int i;
@@ -86,14 +86,14 @@ static void do_print_item(WINDOW * win, const char *item, int choice,
        wclrtoeol(win);
 #endif
        wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
-       mvwaddstr(win, choice, item_x, menu_item);
+       mvwaddstr(win, line_y, item_x, menu_item);
        if (hotkey) {
                wattrset(win, selected ? dlg.tag_key_selected.atr
                         : dlg.tag_key.atr);
-               mvwaddch(win, choice, item_x + j, menu_item[j]);
+               mvwaddch(win, line_y, item_x + j, menu_item[j]);
        }
        if (selected) {
-               wmove(win, choice, item_x + 1);
+               wmove(win, line_y, item_x + 1);
        }
        free(menu_item);
        wrefresh(win);
@@ -179,14 +179,25 @@ static void do_scroll(WINDOW *win, int *scroll, int n)
 /*
  * Display a menu for choosing among a number of options
  */
-int dialog_menu(const char *title, const char *prompt, int height, int width,
-                int menu_height, const void *selected, int *s_scroll)
+int dialog_menu(const char *title, const char *prompt,
+                const void *selected, int *s_scroll)
 {
        int i, j, x, y, box_x, box_y;
+       int height, width, menu_height;
        int key = 0, button = 0, scroll = 0, choice = 0;
        int first_item =  0, max_choice;
        WINDOW *dialog, *menu;
 
+do_resize:
+       height = getmaxy(stdscr);
+       width = getmaxx(stdscr);
+       if (height < 15 || width < 65)
+               return -ERRDISPLAYTOOSMALL;
+
+       height -= 4;
+       width  -= 5;
+       menu_height = height - 10;
+
        max_choice = MIN(menu_height, item_count());
 
        /* center dialog box on screen */
@@ -226,7 +237,10 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
        draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2,
                 dlg.menubox_border.atr, dlg.menubox.atr);
 
-       item_x = (menu_width - 70) / 2;
+       if (menu_width >= 80)
+               item_x = (menu_width - 70) / 2;
+       else
+               item_x = 4;
 
        /* Set choice to default item */
        item_foreach()
@@ -263,7 +277,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 +416,19 @@ 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;
+               case KEY_RESIZE:
+                       on_key_resize();
+                       delwin(menu);
+                       delwin(dialog);
+                       goto do_resize;
                }
        }
        delwin(menu);
        delwin(dialog);
-       return 255;             /* ESC pressed */
+       return key;             /* ESC pressed */
 }