xref: /rk3399_rockchip-uboot/scripts/kconfig/lxdialog/yesno.c (revision 5b8031ccb4ed6e84457d883198d77efc307085dc)
10a9064fbSMasahiro Yamada /*
20a9064fbSMasahiro Yamada  *  yesno.c -- implements the yes/no box
30a9064fbSMasahiro Yamada  *
40a9064fbSMasahiro Yamada  *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
50a9064fbSMasahiro Yamada  *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
60a9064fbSMasahiro Yamada  *
7*5b8031ccSTom Rini  * SPDX-License-Identifier:	GPL-2.0+
80a9064fbSMasahiro Yamada  */
90a9064fbSMasahiro Yamada 
100a9064fbSMasahiro Yamada #include "dialog.h"
110a9064fbSMasahiro Yamada 
120a9064fbSMasahiro Yamada /*
130a9064fbSMasahiro Yamada  * Display termination buttons
140a9064fbSMasahiro Yamada  */
print_buttons(WINDOW * dialog,int height,int width,int selected)150a9064fbSMasahiro Yamada static void print_buttons(WINDOW * dialog, int height, int width, int selected)
160a9064fbSMasahiro Yamada {
170a9064fbSMasahiro Yamada 	int x = width / 2 - 10;
180a9064fbSMasahiro Yamada 	int y = height - 2;
190a9064fbSMasahiro Yamada 
200a9064fbSMasahiro Yamada 	print_button(dialog, gettext(" Yes "), y, x, selected == 0);
210a9064fbSMasahiro Yamada 	print_button(dialog, gettext("  No  "), y, x + 13, selected == 1);
220a9064fbSMasahiro Yamada 
230a9064fbSMasahiro Yamada 	wmove(dialog, y, x + 1 + 13 * selected);
240a9064fbSMasahiro Yamada 	wrefresh(dialog);
250a9064fbSMasahiro Yamada }
260a9064fbSMasahiro Yamada 
270a9064fbSMasahiro Yamada /*
280a9064fbSMasahiro Yamada  * Display a dialog box with two buttons - Yes and No
290a9064fbSMasahiro Yamada  */
dialog_yesno(const char * title,const char * prompt,int height,int width)300a9064fbSMasahiro Yamada int dialog_yesno(const char *title, const char *prompt, int height, int width)
310a9064fbSMasahiro Yamada {
320a9064fbSMasahiro Yamada 	int i, x, y, key = 0, button = 0;
330a9064fbSMasahiro Yamada 	WINDOW *dialog;
340a9064fbSMasahiro Yamada 
350a9064fbSMasahiro Yamada do_resize:
360a9064fbSMasahiro Yamada 	if (getmaxy(stdscr) < (height + YESNO_HEIGTH_MIN))
370a9064fbSMasahiro Yamada 		return -ERRDISPLAYTOOSMALL;
380a9064fbSMasahiro Yamada 	if (getmaxx(stdscr) < (width + YESNO_WIDTH_MIN))
390a9064fbSMasahiro Yamada 		return -ERRDISPLAYTOOSMALL;
400a9064fbSMasahiro Yamada 
410a9064fbSMasahiro Yamada 	/* center dialog box on screen */
420a9064fbSMasahiro Yamada 	x = (getmaxx(stdscr) - width) / 2;
430a9064fbSMasahiro Yamada 	y = (getmaxy(stdscr) - height) / 2;
440a9064fbSMasahiro Yamada 
450a9064fbSMasahiro Yamada 	draw_shadow(stdscr, y, x, height, width);
460a9064fbSMasahiro Yamada 
470a9064fbSMasahiro Yamada 	dialog = newwin(height, width, y, x);
480a9064fbSMasahiro Yamada 	keypad(dialog, TRUE);
490a9064fbSMasahiro Yamada 
500a9064fbSMasahiro Yamada 	draw_box(dialog, 0, 0, height, width,
510a9064fbSMasahiro Yamada 		 dlg.dialog.atr, dlg.border.atr);
520a9064fbSMasahiro Yamada 	wattrset(dialog, dlg.border.atr);
530a9064fbSMasahiro Yamada 	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
540a9064fbSMasahiro Yamada 	for (i = 0; i < width - 2; i++)
550a9064fbSMasahiro Yamada 		waddch(dialog, ACS_HLINE);
560a9064fbSMasahiro Yamada 	wattrset(dialog, dlg.dialog.atr);
570a9064fbSMasahiro Yamada 	waddch(dialog, ACS_RTEE);
580a9064fbSMasahiro Yamada 
590a9064fbSMasahiro Yamada 	print_title(dialog, title, width);
600a9064fbSMasahiro Yamada 
610a9064fbSMasahiro Yamada 	wattrset(dialog, dlg.dialog.atr);
620a9064fbSMasahiro Yamada 	print_autowrap(dialog, prompt, width - 2, 1, 3);
630a9064fbSMasahiro Yamada 
640a9064fbSMasahiro Yamada 	print_buttons(dialog, height, width, 0);
650a9064fbSMasahiro Yamada 
660a9064fbSMasahiro Yamada 	while (key != KEY_ESC) {
670a9064fbSMasahiro Yamada 		key = wgetch(dialog);
680a9064fbSMasahiro Yamada 		switch (key) {
690a9064fbSMasahiro Yamada 		case 'Y':
700a9064fbSMasahiro Yamada 		case 'y':
710a9064fbSMasahiro Yamada 			delwin(dialog);
720a9064fbSMasahiro Yamada 			return 0;
730a9064fbSMasahiro Yamada 		case 'N':
740a9064fbSMasahiro Yamada 		case 'n':
750a9064fbSMasahiro Yamada 			delwin(dialog);
760a9064fbSMasahiro Yamada 			return 1;
770a9064fbSMasahiro Yamada 
780a9064fbSMasahiro Yamada 		case TAB:
790a9064fbSMasahiro Yamada 		case KEY_LEFT:
800a9064fbSMasahiro Yamada 		case KEY_RIGHT:
810a9064fbSMasahiro Yamada 			button = ((key == KEY_LEFT ? --button : ++button) < 0) ? 1 : (button > 1 ? 0 : button);
820a9064fbSMasahiro Yamada 
830a9064fbSMasahiro Yamada 			print_buttons(dialog, height, width, button);
840a9064fbSMasahiro Yamada 			wrefresh(dialog);
850a9064fbSMasahiro Yamada 			break;
860a9064fbSMasahiro Yamada 		case ' ':
870a9064fbSMasahiro Yamada 		case '\n':
880a9064fbSMasahiro Yamada 			delwin(dialog);
890a9064fbSMasahiro Yamada 			return button;
900a9064fbSMasahiro Yamada 		case KEY_ESC:
910a9064fbSMasahiro Yamada 			key = on_key_esc(dialog);
920a9064fbSMasahiro Yamada 			break;
930a9064fbSMasahiro Yamada 		case KEY_RESIZE:
940a9064fbSMasahiro Yamada 			delwin(dialog);
950a9064fbSMasahiro Yamada 			on_key_resize();
960a9064fbSMasahiro Yamada 			goto do_resize;
970a9064fbSMasahiro Yamada 		}
980a9064fbSMasahiro Yamada 	}
990a9064fbSMasahiro Yamada 
1000a9064fbSMasahiro Yamada 	delwin(dialog);
1010a9064fbSMasahiro Yamada 	return key;		/* ESC pressed */
1020a9064fbSMasahiro Yamada }
103