kconfig/lxdialog/yesno.c
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jun 13 23:38:37 2010 +0200 (2010-06-13)
changeset 1983 198a5a6e5239
parent 1 eeea35fbf182
permissions -rw-r--r--
cc/gcc: baremetal requires a two-pass process

Here, we implement a highly ugly hack. I'm not proud of that one...

To build the libstdc++ library, the compiler requires the C library. In
case we build for non-baremetal, this is normally handled by the final
step, later.

But in the case of bare-metal, we never go through the final step (because
it does not work, and it seems complex enough to make it work), so the
baremetal compilers are issued out of the core step.
     1 /*
     2  *  yesno.c -- implements the yes/no box
     3  *
     4  *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
     5  *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
     6  *
     7  *  This program is free software; you can redistribute it and/or
     8  *  modify it under the terms of the GNU General Public License
     9  *  as published by the Free Software Foundation; either version 2
    10  *  of the License, or (at your option) any later version.
    11  *
    12  *  This program is distributed in the hope that it will be useful,
    13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15  *  GNU General Public License for more details.
    16  *
    17  *  You should have received a copy of the GNU General Public License
    18  *  along with this program; if not, write to the Free Software
    19  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    20  */
    21 
    22 #include "dialog.h"
    23 
    24 /*
    25  * Display termination buttons
    26  */
    27 static void print_buttons(WINDOW * dialog, int height, int width, int selected)
    28 {
    29 	int x = width / 2 - 10;
    30 	int y = height - 2;
    31 
    32 	print_button(dialog, gettext(" Yes "), y, x, selected == 0);
    33 	print_button(dialog, gettext("  No  "), y, x + 13, selected == 1);
    34 
    35 	wmove(dialog, y, x + 1 + 13 * selected);
    36 	wrefresh(dialog);
    37 }
    38 
    39 /*
    40  * Display a dialog box with two buttons - Yes and No
    41  */
    42 int dialog_yesno(const char *title, const char *prompt, int height, int width)
    43 {
    44 	int i, x, y, key = 0, button = 0;
    45 	WINDOW *dialog;
    46 
    47 do_resize:
    48 	if (getmaxy(stdscr) < (height + 4))
    49 		return -ERRDISPLAYTOOSMALL;
    50 	if (getmaxx(stdscr) < (width + 4))
    51 		return -ERRDISPLAYTOOSMALL;
    52 
    53 	/* center dialog box on screen */
    54 	x = (COLS - width) / 2;
    55 	y = (LINES - height) / 2;
    56 
    57 	draw_shadow(stdscr, y, x, height, width);
    58 
    59 	dialog = newwin(height, width, y, x);
    60 	keypad(dialog, TRUE);
    61 
    62 	draw_box(dialog, 0, 0, height, width,
    63 		 dlg.dialog.atr, dlg.border.atr);
    64 	wattrset(dialog, dlg.border.atr);
    65 	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
    66 	for (i = 0; i < width - 2; i++)
    67 		waddch(dialog, ACS_HLINE);
    68 	wattrset(dialog, dlg.dialog.atr);
    69 	waddch(dialog, ACS_RTEE);
    70 
    71 	print_title(dialog, title, width);
    72 
    73 	wattrset(dialog, dlg.dialog.atr);
    74 	print_autowrap(dialog, prompt, width - 2, 1, 3);
    75 
    76 	print_buttons(dialog, height, width, 0);
    77 
    78 	while (key != KEY_ESC) {
    79 		key = wgetch(dialog);
    80 		switch (key) {
    81 		case 'Y':
    82 		case 'y':
    83 			delwin(dialog);
    84 			return 0;
    85 		case 'N':
    86 		case 'n':
    87 			delwin(dialog);
    88 			return 1;
    89 
    90 		case TAB:
    91 		case KEY_LEFT:
    92 		case KEY_RIGHT:
    93 			button = ((key == KEY_LEFT ? --button : ++button) < 0) ? 1 : (button > 1 ? 0 : button);
    94 
    95 			print_buttons(dialog, height, width, button);
    96 			wrefresh(dialog);
    97 			break;
    98 		case ' ':
    99 		case '\n':
   100 			delwin(dialog);
   101 			return button;
   102 		case KEY_ESC:
   103 			key = on_key_esc(dialog);
   104 			break;
   105 		case KEY_RESIZE:
   106 			delwin(dialog);
   107 			on_key_resize();
   108 			goto do_resize;
   109 		}
   110 	}
   111 
   112 	delwin(dialog);
   113 	return key;		/* ESC pressed */
   114 }