11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  menubox.c -- implements the menu box
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  This program is free software; you can redistribute it and/or
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  modify it under the terms of the GNU General Public License
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  as published by the Free Software Foundation; either version 2
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  of the License, or (at your option) any later version.
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  This program is distributed in the hope that it will be useful,
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  but WITHOUT ANY WARRANTY; without even the implied warranty of
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  GNU General Public License for more details.
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  You should have received a copy of the GNU General Public License
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  along with this program; if not, write to the Free Software
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Changes by Clifford Wolf (god@clifford.at)
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  [ 1998-06-13 ]
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    *)  A bugfix for the Page-Down problem
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    *)  Formerly when I used Page Down and Page Up, the cursor would be set
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        to the first position in the menu box.  Now lxdialog is a bit
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        smarter and works more like other menu systems (just have a look at
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        it).
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    *)  Formerly if I selected something my scrolling would be broken because
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        lxdialog is re-invoked by the Menuconfig shell script, can't
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        remember the last scrolling position, and just sets it so that the
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        cursor is at the bottom of the box.  Now it writes the temporary file
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        lxdialog.scrltmp which contains this information. The file is
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        deleted by lxdialog if the user leaves a submenu or enters a new
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        one, but it would be nice if Menuconfig could make another "rm -f"
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        just to be sure.  Just try it out - you will recognise a difference!
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  [ 1998-06-14 ]
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    *)  Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        and menus change their size on the fly.
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    *)  If for some reason the last scrolling position is not saved by
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        lxdialog, it sets the scrolling so that the selected item is in the
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        middle of the menu box, not at the bottom.
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus.
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This fixes a bug in Menuconfig where using ' ' to descend into menus
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * would leave mis-synchronized lxdialog.scrltmp files lying around,
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fscanf would read in 'scroll', and eventually that value would get used.
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "dialog.h"
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6194f2505be3b6afaf50129e949b1840bc4dd0b3e8Roman Zippelstatic int menu_width, item_x;
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Print menu item
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
66737ecae264bc759e2033d99e99138f690f3beabfSam Ravnborgstatic void do_print_item(WINDOW * win, const char *item, int line_y,
6759d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg                          int selected, int hotkey)
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
69b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	int j;
70a06104af7dcf2f5bafaf18f373c8b2554cbfe014Sam Ravnborg	char *menu_item = malloc(menu_width + 1);
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7294f2505be3b6afaf50129e949b1840bc4dd0b3e8Roman Zippel	strncpy(menu_item, item, menu_width - item_x);
73737ecae264bc759e2033d99e99138f690f3beabfSam Ravnborg	menu_item[menu_width - item_x] = '\0';
74b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	j = first_alpha(menu_item, "YyNnMmHh");
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	/* Clear 'residue' of last item */
7798e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg	wattrset(win, dlg.menubox.atr);
78737ecae264bc759e2033d99e99138f690f3beabfSam Ravnborg	wmove(win, line_y, 0);
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if OLD_NCURSES
80b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	{
81b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		int i;
82b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		for (i = 0; i < menu_width; i++)
83b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			waddch(win, ' ');
84b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	}
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
86b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	wclrtoeol(win);
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8898e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg	wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
89737ecae264bc759e2033d99e99138f690f3beabfSam Ravnborg	mvwaddstr(win, line_y, item_x, menu_item);
90b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	if (hotkey) {
9198e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg		wattrset(win, selected ? dlg.tag_key_selected.atr
9298e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg			 : dlg.tag_key.atr);
93737ecae264bc759e2033d99e99138f690f3beabfSam Ravnborg		mvwaddch(win, line_y, item_x + j, menu_item[j]);
94b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	}
95b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	if (selected) {
96737ecae264bc759e2033d99e99138f690f3beabfSam Ravnborg		wmove(win, line_y, item_x + 1);
97b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	}
98a06104af7dcf2f5bafaf18f373c8b2554cbfe014Sam Ravnborg	free(menu_item);
997c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg	wrefresh(win);
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1022982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg#define print_item(index, choice, selected)				\
1032982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborgdo {									\
1042982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	item_set(index);						\
1052982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	do_print_item(menu, item_str(), choice, selected, !item_is_tag(':')); \
10659d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg} while (0)
10759d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Print the scroll indicators.
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
111dec69da856653772d7ee7b2f98dc69da27274a22Sam Ravnborgstatic void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x,
112dec69da856653772d7ee7b2f98dc69da27274a22Sam Ravnborg			 int height)
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
114b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	int cur_y, cur_x;
115b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
116b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	getyx(win, cur_y, cur_x);
117b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
118b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	wmove(win, y, x);
119b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
120b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	if (scroll > 0) {
12198e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg		wattrset(win, dlg.uarrow.atr);
122b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_UARROW);
123b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddstr(win, "(-)");
124b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	} else {
12598e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg		wattrset(win, dlg.menubox.atr);
126b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_HLINE);
127b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_HLINE);
128b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_HLINE);
129b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_HLINE);
130b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	}
131b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
132b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	y = y + height + 1;
133b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	wmove(win, y, x);
1347c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg	wrefresh(win);
135b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
136b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	if ((height < item_no) && (scroll + height < item_no)) {
13798e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg		wattrset(win, dlg.darrow.atr);
138b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_DARROW);
139b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddstr(win, "(+)");
140b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	} else {
14198e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg		wattrset(win, dlg.menubox_border.atr);
142b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_HLINE);
143b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_HLINE);
144b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_HLINE);
145b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(win, ACS_HLINE);
146b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	}
147b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
148b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	wmove(win, cur_y, cur_x);
1497c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg	wrefresh(win);
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Display the termination buttons.
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
155b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborgstatic void print_buttons(WINDOW * win, int height, int width, int selected)
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
157b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	int x = width / 2 - 16;
158b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	int y = height - 2;
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16075c0a8a55c31c0a21f7e9e64bc45e87e228a98f6EGRY Gabor	print_button(win, gettext("Select"), y, x, selected == 0);
16175c0a8a55c31c0a21f7e9e64bc45e87e228a98f6EGRY Gabor	print_button(win, gettext(" Exit "), y, x + 12, selected == 1);
16275c0a8a55c31c0a21f7e9e64bc45e87e228a98f6EGRY Gabor	print_button(win, gettext(" Help "), y, x + 24, selected == 2);
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
164b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	wmove(win, y, x + 1 + 12 * selected);
165b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	wrefresh(win);
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1687c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg/* scroll up n lines (n may be negative) */
1697c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborgstatic void do_scroll(WINDOW *win, int *scroll, int n)
1707c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg{
1717c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg	/* Scroll menu up */
1727c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg	scrollok(win, TRUE);
1737c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg	wscrl(win, n);
1747c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg	scrollok(win, FALSE);
1757c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg	*scroll = *scroll + n;
1767c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg	wrefresh(win);
1777c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg}
1787c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Display a menu for choosing among a number of options
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
182c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborgint dialog_menu(const char *title, const char *prompt,
183c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg                const void *selected, int *s_scroll)
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
185b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	int i, j, x, y, box_x, box_y;
186c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg	int height, width, menu_height;
187e067e1f98d54d62fd598126f95e7684e5b63e67fSam Ravnborg	int key = 0, button = 0, scroll = 0, choice = 0;
188e067e1f98d54d62fd598126f95e7684e5b63e67fSam Ravnborg	int first_item =  0, max_choice;
189b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	WINDOW *dialog, *menu;
190b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
191c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborgdo_resize:
192c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg	height = getmaxy(stdscr);
193c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg	width = getmaxx(stdscr);
194c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg	if (height < 15 || width < 65)
195c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg		return -ERRDISPLAYTOOSMALL;
196c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg
197c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg	height -= 4;
198c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg	width  -= 5;
199c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg	menu_height = height - 10;
200c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg
2012982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	max_choice = MIN(menu_height, item_count());
202b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
203b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	/* center dialog box on screen */
204b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	x = (COLS - width) / 2;
205b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	y = (LINES - height) / 2;
206b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
207b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	draw_shadow(stdscr, y, x, height, width);
208b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
209b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	dialog = newwin(height, width, y, x);
210b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	keypad(dialog, TRUE);
211b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
21298e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg	draw_box(dialog, 0, 0, height, width,
21398e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg		 dlg.dialog.atr, dlg.border.atr);
21498e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg	wattrset(dialog, dlg.border.atr);
215b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
216b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	for (i = 0; i < width - 2; i++)
217b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		waddch(dialog, ACS_HLINE);
21898e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg	wattrset(dialog, dlg.dialog.atr);
21998e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg	wbkgdset(dialog, dlg.dialog.atr & A_COLOR);
220b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	waddch(dialog, ACS_RTEE);
221b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
222fa7009d5b59b8acd8071f7b3057d36eeeaf08146Sam Ravnborg	print_title(dialog, title, width);
223b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
22498e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg	wattrset(dialog, dlg.dialog.atr);
225b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	print_autowrap(dialog, prompt, width - 2, 1, 3);
226b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
227b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	menu_width = width - 6;
228b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	box_y = height - menu_height - 5;
229b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	box_x = (width - menu_width) / 2 - 1;
230b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
231b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	/* create new window for the menu */
232b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	menu = subwin(dialog, menu_height, menu_width,
233b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		      y + box_y + 1, x + box_x + 1);
234b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	keypad(menu, TRUE);
235b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
236b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	/* draw a box around the menu items */
237b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2,
23898e5a1579e7d34fe3803240750a1c48efcd9cb15Sam Ravnborg		 dlg.menubox_border.atr, dlg.menubox.atr);
239b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
240c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg	if (menu_width >= 80)
241c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg		item_x = (menu_width - 70) / 2;
242c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg	else
243c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg		item_x = 4;
24494f2505be3b6afaf50129e949b1840bc4dd0b3e8Roman Zippel
2450e175d05a4e72f85918da3ea4bd9f5d3d78face4Sam Ravnborg	/* Set choice to default item */
2462982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	item_foreach()
2472982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg		if (selected && (selected == item_data()))
2482982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg			choice = item_n();
2492982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	/* get the saved scroll info */
2502982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	scroll = *s_scroll;
2512982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	if ((scroll <= choice) && (scroll + max_choice > choice) &&
2522982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	   (scroll >= 0) && (scroll + max_choice <= item_count())) {
2532982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg		first_item = scroll;
2542982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg		choice = choice - scroll;
2552982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	} else {
2562982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg		scroll = 0;
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2582982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	if ((choice >= max_choice)) {
2592982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg		if (choice >= item_count() - max_choice / 2)
2602982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg			scroll = first_item = item_count() - max_choice;
261b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		else
262b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			scroll = first_item = choice - max_choice / 2;
263b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		choice = choice - scroll;
264b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	}
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
266b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	/* Print the menu */
267b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	for (i = 0; i < max_choice; i++) {
26859d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg		print_item(first_item + i, i, i == choice);
269b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	}
270b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
271b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	wnoutrefresh(menu);
272b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
2732982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	print_arrows(dialog, item_count(), scroll,
27494f2505be3b6afaf50129e949b1840bc4dd0b3e8Roman Zippel		     box_y, box_x + item_x + 1, menu_height);
275b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
276b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	print_buttons(dialog, height, width, 0);
27794f2505be3b6afaf50129e949b1840bc4dd0b3e8Roman Zippel	wmove(menu, choice, item_x + 1);
278b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	wrefresh(menu);
279b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
280f3cbcdc955d0d2c8b4c52d6b73fc536b01b68c64Sam Ravnborg	while (key != KEY_ESC) {
281b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		key = wgetch(menu);
282b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
283b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		if (key < 256 && isalpha(key))
284b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			key = tolower(key);
285b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
286b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		if (strchr("ynmh", key))
287b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			i = max_choice;
288b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		else {
289b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			for (i = choice + 1; i < max_choice; i++) {
2902982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg				item_set(scroll + i);
2912982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg				j = first_alpha(item_str(), "YyNnMmHh");
2922982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg				if (key == tolower(item_str()[j]))
293b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg					break;
294b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			}
295b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			if (i == max_choice)
296b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				for (i = 0; i < max_choice; i++) {
2972982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg					item_set(scroll + i);
2982982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg					j = first_alpha(item_str(), "YyNnMmHh");
2992982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg					if (key == tolower(item_str()[j]))
300b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg						break;
301b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				}
302b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		}
303b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
304b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		if (i < max_choice ||
305b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		    key == KEY_UP || key == KEY_DOWN ||
306b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		    key == '-' || key == '+' ||
307b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		    key == KEY_PPAGE || key == KEY_NPAGE) {
3080e175d05a4e72f85918da3ea4bd9f5d3d78face4Sam Ravnborg			/* Remove highligt of current item */
30959d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg			print_item(scroll + choice, choice, FALSE);
310b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
311b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			if (key == KEY_UP || key == '-') {
312b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				if (choice < 2 && scroll) {
313b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg					/* Scroll menu down */
3147c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg					do_scroll(menu, &scroll, -1);
315b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
31659d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg					print_item(scroll, 0, FALSE);
317b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				} else
318b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg					choice = MAX(choice - 1, 0);
319b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
320b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			} else if (key == KEY_DOWN || key == '+') {
32159d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg				print_item(scroll+choice, choice, FALSE);
322b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
323b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				if ((choice > max_choice - 3) &&
3242982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg				    (scroll + max_choice < item_count())) {
325b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg					/* Scroll menu up */
3267c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg					do_scroll(menu, &scroll, 1);
327b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
32859d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg					print_item(scroll+max_choice - 1,
32959d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg						   max_choice - 1, FALSE);
330b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				} else
331dec69da856653772d7ee7b2f98dc69da27274a22Sam Ravnborg					choice = MIN(choice + 1, max_choice - 1);
332b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
333b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			} else if (key == KEY_PPAGE) {
334b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				scrollok(menu, TRUE);
335b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				for (i = 0; (i < max_choice); i++) {
336b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg					if (scroll > 0) {
3377c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg						do_scroll(menu, &scroll, -1);
33859d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg						print_item(scroll, 0, FALSE);
339b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg					} else {
340b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg						if (choice > 0)
341b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg							choice--;
342b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg					}
343b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				}
344b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
345b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			} else if (key == KEY_NPAGE) {
346b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				for (i = 0; (i < max_choice); i++) {
3472982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg					if (scroll + max_choice < item_count()) {
3487c3badf96e0dc8aa89ebf8919653339a5ee8e035Sam Ravnborg						do_scroll(menu, &scroll, 1);
34959d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg						print_item(scroll+max_choice-1,
35059d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg							   max_choice - 1, FALSE);
351b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg					} else {
352b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg						if (choice + 1 < max_choice)
353b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg							choice++;
354b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg					}
355b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				}
356b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			} else
357b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				choice = i;
358b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
35959d3cf7a40dfdbb8e86758ade172831c19630050Sam Ravnborg			print_item(scroll + choice, choice, TRUE);
360b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
3612982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg			print_arrows(dialog, item_count(), scroll,
36294f2505be3b6afaf50129e949b1840bc4dd0b3e8Roman Zippel				     box_y, box_x + item_x + 1, menu_height);
363b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
364b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			wnoutrefresh(dialog);
365b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			wrefresh(menu);
366b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
367b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			continue;	/* wait for another key press */
368b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		}
369b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
370b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		switch (key) {
371b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case KEY_LEFT:
372b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case TAB:
373b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case KEY_RIGHT:
374b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			button = ((key == KEY_LEFT ? --button : ++button) < 0)
375b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			    ? 2 : (button > 2 ? 0 : button);
376b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg
377b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			print_buttons(dialog, height, width, button);
378b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			wrefresh(menu);
379b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			break;
380b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case ' ':
381b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case 's':
382b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case 'y':
383b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case 'n':
384b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case 'm':
385b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case '/':
38622c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan		case 'h':
38722c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan		case '?':
38822c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan		case 'z':
38922c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan		case '\n':
390b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			/* save scroll info */
3912982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg			*s_scroll = scroll;
3922982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg			delwin(menu);
393b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			delwin(dialog);
3942982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg			item_set(scroll + choice);
3952982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg			item_set_selected(1);
396b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			switch (key) {
39722c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan			case 'h':
39822c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan			case '?':
39922c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan				return 2;
400b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			case 's':
401b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			case 'y':
402b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				return 3;
403b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			case 'n':
404b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				return 4;
405b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			case 'm':
406b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				return 5;
407b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			case ' ':
408b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				return 6;
409b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			case '/':
410b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg				return 7;
41122c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan			case 'z':
41222c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan				return 8;
41322c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan			case '\n':
41422c7eca61e51296643bb0a379fc726fda8f3b015Li Zefan				return button;
415b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			}
416b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			return 0;
417b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case 'e':
418b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		case 'x':
419f3cbcdc955d0d2c8b4c52d6b73fc536b01b68c64Sam Ravnborg			key = KEY_ESC;
420f3cbcdc955d0d2c8b4c52d6b73fc536b01b68c64Sam Ravnborg			break;
421f3cbcdc955d0d2c8b4c52d6b73fc536b01b68c64Sam Ravnborg		case KEY_ESC:
422f3cbcdc955d0d2c8b4c52d6b73fc536b01b68c64Sam Ravnborg			key = on_key_esc(menu);
423b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg			break;
424c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg		case KEY_RESIZE:
425c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg			on_key_resize();
426c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg			delwin(menu);
427c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg			delwin(dialog);
428c8dc68ad0fbd934e78e913b8a8d7b45945db4930Sam Ravnborg			goto do_resize;
429b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg		}
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4312982de6993e6d9944f2215d7cb9b558b465a0c99Sam Ravnborg	delwin(menu);
432b1c5f1c635f4a821f834ed51ccd8a2a1515fffd2Sam Ravnborg	delwin(dialog);
433f3cbcdc955d0d2c8b4c52d6b73fc536b01b68c64Sam Ravnborg	return key;		/* ESC pressed */
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
435