kconfig/lxdialog/yesno.c
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Mar 29 00:15:32 2010 +0200 (2010-03-29)
changeset 1864 758d5137fe87
parent 1 eeea35fbf182
permissions -rw-r--r--
scripts/populate: optimise search loop

Curently, populate will iterate over all ELF (shared objects|executables)
to look for missing NEEDED DSOs, adding to the list at every iterations
of the search loop.

Instead of looking again at previously handled ELF files, recursively
resolve every ELf files.

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