xref: /aosp_15_r20/external/toybox/kconfig/lxdialog/util.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /*
2*cf5a6c84SAndroid Build Coastguard Worker  *  util.c
3*cf5a6c84SAndroid Build Coastguard Worker  *
4*cf5a6c84SAndroid Build Coastguard Worker  *  ORIGINAL AUTHOR: Savio Lam ([email protected])
5*cf5a6c84SAndroid Build Coastguard Worker  *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap ([email protected])
6*cf5a6c84SAndroid Build Coastguard Worker  *
7*cf5a6c84SAndroid Build Coastguard Worker  *  This program is free software; you can redistribute it and/or
8*cf5a6c84SAndroid Build Coastguard Worker  *  modify it under the terms of the GNU General Public License
9*cf5a6c84SAndroid Build Coastguard Worker  *  as published by the Free Software Foundation; either version 2
10*cf5a6c84SAndroid Build Coastguard Worker  *  of the License, or (at your option) any later version.
11*cf5a6c84SAndroid Build Coastguard Worker  *
12*cf5a6c84SAndroid Build Coastguard Worker  *  This program is distributed in the hope that it will be useful,
13*cf5a6c84SAndroid Build Coastguard Worker  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14*cf5a6c84SAndroid Build Coastguard Worker  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*cf5a6c84SAndroid Build Coastguard Worker  *  GNU General Public License for more details.
16*cf5a6c84SAndroid Build Coastguard Worker  *
17*cf5a6c84SAndroid Build Coastguard Worker  *  You should have received a copy of the GNU General Public License
18*cf5a6c84SAndroid Build Coastguard Worker  *  along with this program; if not, write to the Free Software
19*cf5a6c84SAndroid Build Coastguard Worker  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20*cf5a6c84SAndroid Build Coastguard Worker  */
21*cf5a6c84SAndroid Build Coastguard Worker 
22*cf5a6c84SAndroid Build Coastguard Worker #include "dialog.h"
23*cf5a6c84SAndroid Build Coastguard Worker 
24*cf5a6c84SAndroid Build Coastguard Worker struct dialog_info dlg;
25*cf5a6c84SAndroid Build Coastguard Worker 
set_mono_theme(void)26*cf5a6c84SAndroid Build Coastguard Worker static void set_mono_theme(void)
27*cf5a6c84SAndroid Build Coastguard Worker {
28*cf5a6c84SAndroid Build Coastguard Worker 	dlg.screen.atr = A_NORMAL;
29*cf5a6c84SAndroid Build Coastguard Worker 	dlg.shadow.atr = A_NORMAL;
30*cf5a6c84SAndroid Build Coastguard Worker 	dlg.dialog.atr = A_NORMAL;
31*cf5a6c84SAndroid Build Coastguard Worker 	dlg.title.atr = A_BOLD;
32*cf5a6c84SAndroid Build Coastguard Worker 	dlg.border.atr = A_NORMAL;
33*cf5a6c84SAndroid Build Coastguard Worker 	dlg.button_active.atr = A_REVERSE;
34*cf5a6c84SAndroid Build Coastguard Worker 	dlg.button_inactive.atr = A_DIM;
35*cf5a6c84SAndroid Build Coastguard Worker 	dlg.button_key_active.atr = A_REVERSE;
36*cf5a6c84SAndroid Build Coastguard Worker 	dlg.button_key_inactive.atr = A_BOLD;
37*cf5a6c84SAndroid Build Coastguard Worker 	dlg.button_label_active.atr = A_REVERSE;
38*cf5a6c84SAndroid Build Coastguard Worker 	dlg.button_label_inactive.atr = A_NORMAL;
39*cf5a6c84SAndroid Build Coastguard Worker 	dlg.inputbox.atr = A_NORMAL;
40*cf5a6c84SAndroid Build Coastguard Worker 	dlg.inputbox_border.atr = A_NORMAL;
41*cf5a6c84SAndroid Build Coastguard Worker 	dlg.searchbox.atr = A_NORMAL;
42*cf5a6c84SAndroid Build Coastguard Worker 	dlg.searchbox_title.atr = A_BOLD;
43*cf5a6c84SAndroid Build Coastguard Worker 	dlg.searchbox_border.atr = A_NORMAL;
44*cf5a6c84SAndroid Build Coastguard Worker 	dlg.position_indicator.atr = A_BOLD;
45*cf5a6c84SAndroid Build Coastguard Worker 	dlg.menubox.atr = A_NORMAL;
46*cf5a6c84SAndroid Build Coastguard Worker 	dlg.menubox_border.atr = A_NORMAL;
47*cf5a6c84SAndroid Build Coastguard Worker 	dlg.item.atr = A_NORMAL;
48*cf5a6c84SAndroid Build Coastguard Worker 	dlg.item_selected.atr = A_REVERSE;
49*cf5a6c84SAndroid Build Coastguard Worker 	dlg.tag.atr = A_BOLD;
50*cf5a6c84SAndroid Build Coastguard Worker 	dlg.tag_selected.atr = A_REVERSE;
51*cf5a6c84SAndroid Build Coastguard Worker 	dlg.tag_key.atr = A_BOLD;
52*cf5a6c84SAndroid Build Coastguard Worker 	dlg.tag_key_selected.atr = A_REVERSE;
53*cf5a6c84SAndroid Build Coastguard Worker 	dlg.check.atr = A_BOLD;
54*cf5a6c84SAndroid Build Coastguard Worker 	dlg.check_selected.atr = A_REVERSE;
55*cf5a6c84SAndroid Build Coastguard Worker 	dlg.uarrow.atr = A_BOLD;
56*cf5a6c84SAndroid Build Coastguard Worker 	dlg.darrow.atr = A_BOLD;
57*cf5a6c84SAndroid Build Coastguard Worker }
58*cf5a6c84SAndroid Build Coastguard Worker 
59*cf5a6c84SAndroid Build Coastguard Worker #define DLG_COLOR(dialog, f, b, h) \
60*cf5a6c84SAndroid Build Coastguard Worker do {                               \
61*cf5a6c84SAndroid Build Coastguard Worker 	dlg.dialog.fg = (f);       \
62*cf5a6c84SAndroid Build Coastguard Worker 	dlg.dialog.bg = (b);       \
63*cf5a6c84SAndroid Build Coastguard Worker 	dlg.dialog.hl = (h);       \
64*cf5a6c84SAndroid Build Coastguard Worker } while (0)
65*cf5a6c84SAndroid Build Coastguard Worker 
set_classic_theme(void)66*cf5a6c84SAndroid Build Coastguard Worker static void set_classic_theme(void)
67*cf5a6c84SAndroid Build Coastguard Worker {
68*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(screen,                COLOR_CYAN,   COLOR_BLUE,   true);
69*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(shadow,                COLOR_BLACK,  COLOR_BLACK,  true);
70*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(dialog,                COLOR_BLACK,  COLOR_WHITE,  false);
71*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(title,                 COLOR_YELLOW, COLOR_WHITE,  true);
72*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(border,                COLOR_WHITE,  COLOR_WHITE,  true);
73*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_active,         COLOR_WHITE,  COLOR_BLUE,   true);
74*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_inactive,       COLOR_BLACK,  COLOR_WHITE,  false);
75*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_key_active,     COLOR_WHITE,  COLOR_BLUE,   true);
76*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_key_inactive,   COLOR_RED,    COLOR_WHITE,  false);
77*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_label_active,   COLOR_YELLOW, COLOR_BLUE,   true);
78*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_label_inactive, COLOR_BLACK,  COLOR_WHITE,  true);
79*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(inputbox,              COLOR_BLACK,  COLOR_WHITE,  false);
80*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(inputbox_border,       COLOR_BLACK,  COLOR_WHITE,  false);
81*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(searchbox,             COLOR_BLACK,  COLOR_WHITE,  false);
82*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(searchbox_title,       COLOR_YELLOW, COLOR_WHITE,  true);
83*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(searchbox_border,      COLOR_WHITE,  COLOR_WHITE,  true);
84*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(position_indicator,    COLOR_YELLOW, COLOR_WHITE,  true);
85*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(menubox,               COLOR_BLACK,  COLOR_WHITE,  false);
86*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(menubox_border,        COLOR_WHITE,  COLOR_WHITE,  true);
87*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(item,                  COLOR_BLACK,  COLOR_WHITE,  false);
88*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(item_selected,         COLOR_WHITE,  COLOR_BLUE,   true);
89*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag,                   COLOR_YELLOW, COLOR_WHITE,  true);
90*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag_selected,          COLOR_YELLOW, COLOR_BLUE,   true);
91*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag_key,               COLOR_YELLOW, COLOR_WHITE,  true);
92*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag_key_selected,      COLOR_YELLOW, COLOR_BLUE,   true);
93*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(check,                 COLOR_BLACK,  COLOR_WHITE,  false);
94*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(check_selected,        COLOR_WHITE,  COLOR_BLUE,   true);
95*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(uarrow,                COLOR_GREEN,  COLOR_WHITE,  true);
96*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(darrow,                COLOR_GREEN,  COLOR_WHITE,  true);
97*cf5a6c84SAndroid Build Coastguard Worker }
98*cf5a6c84SAndroid Build Coastguard Worker 
set_blackbg_theme(void)99*cf5a6c84SAndroid Build Coastguard Worker static void set_blackbg_theme(void)
100*cf5a6c84SAndroid Build Coastguard Worker {
101*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(screen, COLOR_RED,   COLOR_BLACK, true);
102*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, false);
103*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(dialog, COLOR_WHITE, COLOR_BLACK, false);
104*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(title,  COLOR_RED,   COLOR_BLACK, false);
105*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(border, COLOR_BLACK, COLOR_BLACK, true);
106*cf5a6c84SAndroid Build Coastguard Worker 
107*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_active,         COLOR_YELLOW, COLOR_RED,   false);
108*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_inactive,       COLOR_YELLOW, COLOR_BLACK, false);
109*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_key_active,     COLOR_YELLOW, COLOR_RED,   true);
110*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_key_inactive,   COLOR_RED,    COLOR_BLACK, false);
111*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_label_active,   COLOR_WHITE,  COLOR_RED,   false);
112*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_label_inactive, COLOR_BLACK,  COLOR_BLACK, true);
113*cf5a6c84SAndroid Build Coastguard Worker 
114*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(inputbox,         COLOR_YELLOW, COLOR_BLACK, false);
115*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(inputbox_border,  COLOR_YELLOW, COLOR_BLACK, false);
116*cf5a6c84SAndroid Build Coastguard Worker 
117*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(searchbox,        COLOR_YELLOW, COLOR_BLACK, false);
118*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(searchbox_title,  COLOR_YELLOW, COLOR_BLACK, true);
119*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(searchbox_border, COLOR_BLACK,  COLOR_BLACK, true);
120*cf5a6c84SAndroid Build Coastguard Worker 
121*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK,  false);
122*cf5a6c84SAndroid Build Coastguard Worker 
123*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(menubox,          COLOR_YELLOW, COLOR_BLACK, false);
124*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(menubox_border,   COLOR_BLACK,  COLOR_BLACK, true);
125*cf5a6c84SAndroid Build Coastguard Worker 
126*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(item,             COLOR_WHITE, COLOR_BLACK, false);
127*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(item_selected,    COLOR_WHITE, COLOR_RED,   false);
128*cf5a6c84SAndroid Build Coastguard Worker 
129*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag,              COLOR_RED,    COLOR_BLACK, false);
130*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag_selected,     COLOR_YELLOW, COLOR_RED,   true);
131*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag_key,          COLOR_RED,    COLOR_BLACK, false);
132*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_RED,   true);
133*cf5a6c84SAndroid Build Coastguard Worker 
134*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(check,            COLOR_YELLOW, COLOR_BLACK, false);
135*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(check_selected,   COLOR_YELLOW, COLOR_RED,   true);
136*cf5a6c84SAndroid Build Coastguard Worker 
137*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(uarrow, COLOR_RED, COLOR_BLACK, false);
138*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(darrow, COLOR_RED, COLOR_BLACK, false);
139*cf5a6c84SAndroid Build Coastguard Worker }
140*cf5a6c84SAndroid Build Coastguard Worker 
set_bluetitle_theme(void)141*cf5a6c84SAndroid Build Coastguard Worker static void set_bluetitle_theme(void)
142*cf5a6c84SAndroid Build Coastguard Worker {
143*cf5a6c84SAndroid Build Coastguard Worker 	set_classic_theme();
144*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(title,               COLOR_BLUE,   COLOR_WHITE, true);
145*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_key_active,   COLOR_YELLOW, COLOR_BLUE,  true);
146*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(button_label_active, COLOR_WHITE,  COLOR_BLUE,  true);
147*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(searchbox_title,     COLOR_BLUE,   COLOR_WHITE, true);
148*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(position_indicator,  COLOR_BLUE,   COLOR_WHITE, true);
149*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag,                 COLOR_BLUE,   COLOR_WHITE, true);
150*cf5a6c84SAndroid Build Coastguard Worker 	DLG_COLOR(tag_key,             COLOR_BLUE,   COLOR_WHITE, true);
151*cf5a6c84SAndroid Build Coastguard Worker 
152*cf5a6c84SAndroid Build Coastguard Worker }
153*cf5a6c84SAndroid Build Coastguard Worker 
154*cf5a6c84SAndroid Build Coastguard Worker /*
155*cf5a6c84SAndroid Build Coastguard Worker  * Select color theme
156*cf5a6c84SAndroid Build Coastguard Worker  */
set_theme(const char * theme)157*cf5a6c84SAndroid Build Coastguard Worker static int set_theme(const char *theme)
158*cf5a6c84SAndroid Build Coastguard Worker {
159*cf5a6c84SAndroid Build Coastguard Worker 	int use_color = 1;
160*cf5a6c84SAndroid Build Coastguard Worker 	if (!theme)
161*cf5a6c84SAndroid Build Coastguard Worker 		set_bluetitle_theme();
162*cf5a6c84SAndroid Build Coastguard Worker 	else if (strcmp(theme, "classic") == 0)
163*cf5a6c84SAndroid Build Coastguard Worker 		set_classic_theme();
164*cf5a6c84SAndroid Build Coastguard Worker 	else if (strcmp(theme, "bluetitle") == 0)
165*cf5a6c84SAndroid Build Coastguard Worker 		set_bluetitle_theme();
166*cf5a6c84SAndroid Build Coastguard Worker 	else if (strcmp(theme, "blackbg") == 0)
167*cf5a6c84SAndroid Build Coastguard Worker 		set_blackbg_theme();
168*cf5a6c84SAndroid Build Coastguard Worker 	else if (strcmp(theme, "mono") == 0)
169*cf5a6c84SAndroid Build Coastguard Worker 		use_color = 0;
170*cf5a6c84SAndroid Build Coastguard Worker 
171*cf5a6c84SAndroid Build Coastguard Worker 	return use_color;
172*cf5a6c84SAndroid Build Coastguard Worker }
173*cf5a6c84SAndroid Build Coastguard Worker 
init_one_color(struct dialog_color * color)174*cf5a6c84SAndroid Build Coastguard Worker static void init_one_color(struct dialog_color *color)
175*cf5a6c84SAndroid Build Coastguard Worker {
176*cf5a6c84SAndroid Build Coastguard Worker 	static int pair = 0;
177*cf5a6c84SAndroid Build Coastguard Worker 
178*cf5a6c84SAndroid Build Coastguard Worker 	pair++;
179*cf5a6c84SAndroid Build Coastguard Worker 	init_pair(pair, color->fg, color->bg);
180*cf5a6c84SAndroid Build Coastguard Worker 	if (color->hl)
181*cf5a6c84SAndroid Build Coastguard Worker 		color->atr = A_BOLD | COLOR_PAIR(pair);
182*cf5a6c84SAndroid Build Coastguard Worker 	else
183*cf5a6c84SAndroid Build Coastguard Worker 		color->atr = COLOR_PAIR(pair);
184*cf5a6c84SAndroid Build Coastguard Worker }
185*cf5a6c84SAndroid Build Coastguard Worker 
init_dialog_colors(void)186*cf5a6c84SAndroid Build Coastguard Worker static void init_dialog_colors(void)
187*cf5a6c84SAndroid Build Coastguard Worker {
188*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.screen);
189*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.shadow);
190*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.dialog);
191*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.title);
192*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.border);
193*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.button_active);
194*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.button_inactive);
195*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.button_key_active);
196*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.button_key_inactive);
197*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.button_label_active);
198*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.button_label_inactive);
199*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.inputbox);
200*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.inputbox_border);
201*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.searchbox);
202*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.searchbox_title);
203*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.searchbox_border);
204*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.position_indicator);
205*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.menubox);
206*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.menubox_border);
207*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.item);
208*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.item_selected);
209*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.tag);
210*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.tag_selected);
211*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.tag_key);
212*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.tag_key_selected);
213*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.check);
214*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.check_selected);
215*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.uarrow);
216*cf5a6c84SAndroid Build Coastguard Worker 	init_one_color(&dlg.darrow);
217*cf5a6c84SAndroid Build Coastguard Worker }
218*cf5a6c84SAndroid Build Coastguard Worker 
219*cf5a6c84SAndroid Build Coastguard Worker /*
220*cf5a6c84SAndroid Build Coastguard Worker  * Setup for color display
221*cf5a6c84SAndroid Build Coastguard Worker  */
color_setup(const char * theme)222*cf5a6c84SAndroid Build Coastguard Worker static void color_setup(const char *theme)
223*cf5a6c84SAndroid Build Coastguard Worker {
224*cf5a6c84SAndroid Build Coastguard Worker 	if (set_theme(theme)) {
225*cf5a6c84SAndroid Build Coastguard Worker 		if (has_colors()) {	/* Terminal supports color? */
226*cf5a6c84SAndroid Build Coastguard Worker 			start_color();
227*cf5a6c84SAndroid Build Coastguard Worker 			init_dialog_colors();
228*cf5a6c84SAndroid Build Coastguard Worker 		}
229*cf5a6c84SAndroid Build Coastguard Worker 	}
230*cf5a6c84SAndroid Build Coastguard Worker 	else
231*cf5a6c84SAndroid Build Coastguard Worker 	{
232*cf5a6c84SAndroid Build Coastguard Worker 		set_mono_theme();
233*cf5a6c84SAndroid Build Coastguard Worker 	}
234*cf5a6c84SAndroid Build Coastguard Worker }
235*cf5a6c84SAndroid Build Coastguard Worker 
236*cf5a6c84SAndroid Build Coastguard Worker /*
237*cf5a6c84SAndroid Build Coastguard Worker  * Set window to attribute 'attr'
238*cf5a6c84SAndroid Build Coastguard Worker  */
attr_clear(WINDOW * win,int height,int width,chtype attr)239*cf5a6c84SAndroid Build Coastguard Worker void attr_clear(WINDOW * win, int height, int width, chtype attr)
240*cf5a6c84SAndroid Build Coastguard Worker {
241*cf5a6c84SAndroid Build Coastguard Worker 	int i, j;
242*cf5a6c84SAndroid Build Coastguard Worker 
243*cf5a6c84SAndroid Build Coastguard Worker 	wattrset(win, attr);
244*cf5a6c84SAndroid Build Coastguard Worker 	for (i = 0; i < height; i++) {
245*cf5a6c84SAndroid Build Coastguard Worker 		wmove(win, i, 0);
246*cf5a6c84SAndroid Build Coastguard Worker 		for (j = 0; j < width; j++)
247*cf5a6c84SAndroid Build Coastguard Worker 			waddch(win, ' ');
248*cf5a6c84SAndroid Build Coastguard Worker 	}
249*cf5a6c84SAndroid Build Coastguard Worker 	touchwin(win);
250*cf5a6c84SAndroid Build Coastguard Worker }
251*cf5a6c84SAndroid Build Coastguard Worker 
dialog_clear(void)252*cf5a6c84SAndroid Build Coastguard Worker void dialog_clear(void)
253*cf5a6c84SAndroid Build Coastguard Worker {
254*cf5a6c84SAndroid Build Coastguard Worker 	attr_clear(stdscr, LINES, COLS, dlg.screen.atr);
255*cf5a6c84SAndroid Build Coastguard Worker 	/* Display background title if it exists ... - SLH */
256*cf5a6c84SAndroid Build Coastguard Worker 	if (dlg.backtitle != NULL) {
257*cf5a6c84SAndroid Build Coastguard Worker 		int i;
258*cf5a6c84SAndroid Build Coastguard Worker 
259*cf5a6c84SAndroid Build Coastguard Worker 		wattrset(stdscr, dlg.screen.atr);
260*cf5a6c84SAndroid Build Coastguard Worker 		mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle);
261*cf5a6c84SAndroid Build Coastguard Worker 		wmove(stdscr, 1, 1);
262*cf5a6c84SAndroid Build Coastguard Worker 		for (i = 1; i < COLS - 1; i++)
263*cf5a6c84SAndroid Build Coastguard Worker 			waddch(stdscr, ACS_HLINE);
264*cf5a6c84SAndroid Build Coastguard Worker 	}
265*cf5a6c84SAndroid Build Coastguard Worker 	wnoutrefresh(stdscr);
266*cf5a6c84SAndroid Build Coastguard Worker }
267*cf5a6c84SAndroid Build Coastguard Worker 
268*cf5a6c84SAndroid Build Coastguard Worker /*
269*cf5a6c84SAndroid Build Coastguard Worker  * Do some initialization for dialog
270*cf5a6c84SAndroid Build Coastguard Worker  */
init_dialog(const char * backtitle)271*cf5a6c84SAndroid Build Coastguard Worker void init_dialog(const char *backtitle)
272*cf5a6c84SAndroid Build Coastguard Worker {
273*cf5a6c84SAndroid Build Coastguard Worker 	dlg.backtitle = backtitle;
274*cf5a6c84SAndroid Build Coastguard Worker 	color_setup(getenv("MENUCONFIG_COLOR"));
275*cf5a6c84SAndroid Build Coastguard Worker }
276*cf5a6c84SAndroid Build Coastguard Worker 
reset_dialog(void)277*cf5a6c84SAndroid Build Coastguard Worker void reset_dialog(void)
278*cf5a6c84SAndroid Build Coastguard Worker {
279*cf5a6c84SAndroid Build Coastguard Worker 	initscr();		/* Init curses */
280*cf5a6c84SAndroid Build Coastguard Worker 	keypad(stdscr, TRUE);
281*cf5a6c84SAndroid Build Coastguard Worker 	cbreak();
282*cf5a6c84SAndroid Build Coastguard Worker 	noecho();
283*cf5a6c84SAndroid Build Coastguard Worker 	dialog_clear();
284*cf5a6c84SAndroid Build Coastguard Worker }
285*cf5a6c84SAndroid Build Coastguard Worker 
286*cf5a6c84SAndroid Build Coastguard Worker /*
287*cf5a6c84SAndroid Build Coastguard Worker  * End using dialog functions.
288*cf5a6c84SAndroid Build Coastguard Worker  */
end_dialog(void)289*cf5a6c84SAndroid Build Coastguard Worker void end_dialog(void)
290*cf5a6c84SAndroid Build Coastguard Worker {
291*cf5a6c84SAndroid Build Coastguard Worker 	endwin();
292*cf5a6c84SAndroid Build Coastguard Worker }
293*cf5a6c84SAndroid Build Coastguard Worker 
294*cf5a6c84SAndroid Build Coastguard Worker /* Print the title of the dialog. Center the title and truncate
295*cf5a6c84SAndroid Build Coastguard Worker  * tile if wider than dialog (- 2 chars).
296*cf5a6c84SAndroid Build Coastguard Worker  **/
print_title(WINDOW * dialog,const char * title,int width)297*cf5a6c84SAndroid Build Coastguard Worker void print_title(WINDOW *dialog, const char *title, int width)
298*cf5a6c84SAndroid Build Coastguard Worker {
299*cf5a6c84SAndroid Build Coastguard Worker 	if (title) {
300*cf5a6c84SAndroid Build Coastguard Worker 		int tlen = MIN(width - 2, strlen(title));
301*cf5a6c84SAndroid Build Coastguard Worker 		wattrset(dialog, dlg.title.atr);
302*cf5a6c84SAndroid Build Coastguard Worker 		mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' ');
303*cf5a6c84SAndroid Build Coastguard Worker 		mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen);
304*cf5a6c84SAndroid Build Coastguard Worker 		waddch(dialog, ' ');
305*cf5a6c84SAndroid Build Coastguard Worker 	}
306*cf5a6c84SAndroid Build Coastguard Worker }
307*cf5a6c84SAndroid Build Coastguard Worker 
308*cf5a6c84SAndroid Build Coastguard Worker /*
309*cf5a6c84SAndroid Build Coastguard Worker  * Print a string of text in a window, automatically wrap around to the
310*cf5a6c84SAndroid Build Coastguard Worker  * next line if the string is too long to fit on one line. Newline
311*cf5a6c84SAndroid Build Coastguard Worker  * characters '\n' are replaced by spaces.  We start on a new line
312*cf5a6c84SAndroid Build Coastguard Worker  * if there is no room for at least 4 nonblanks following a double-space.
313*cf5a6c84SAndroid Build Coastguard Worker  */
print_autowrap(WINDOW * win,const char * prompt,int width,int y,int x)314*cf5a6c84SAndroid Build Coastguard Worker void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
315*cf5a6c84SAndroid Build Coastguard Worker {
316*cf5a6c84SAndroid Build Coastguard Worker 	int newl, cur_x, cur_y;
317*cf5a6c84SAndroid Build Coastguard Worker 	int i, prompt_len, room, wlen;
318*cf5a6c84SAndroid Build Coastguard Worker 	char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
319*cf5a6c84SAndroid Build Coastguard Worker 
320*cf5a6c84SAndroid Build Coastguard Worker 	strcpy(tempstr, prompt);
321*cf5a6c84SAndroid Build Coastguard Worker 
322*cf5a6c84SAndroid Build Coastguard Worker 	prompt_len = strlen(tempstr);
323*cf5a6c84SAndroid Build Coastguard Worker 
324*cf5a6c84SAndroid Build Coastguard Worker 	/*
325*cf5a6c84SAndroid Build Coastguard Worker 	 * Remove newlines
326*cf5a6c84SAndroid Build Coastguard Worker 	 */
327*cf5a6c84SAndroid Build Coastguard Worker 	for (i = 0; i < prompt_len; i++) {
328*cf5a6c84SAndroid Build Coastguard Worker 		if (tempstr[i] == '\n')
329*cf5a6c84SAndroid Build Coastguard Worker 			tempstr[i] = ' ';
330*cf5a6c84SAndroid Build Coastguard Worker 	}
331*cf5a6c84SAndroid Build Coastguard Worker 
332*cf5a6c84SAndroid Build Coastguard Worker 	if (prompt_len <= width - x * 2) {	/* If prompt is short */
333*cf5a6c84SAndroid Build Coastguard Worker 		wmove(win, y, (width - prompt_len) / 2);
334*cf5a6c84SAndroid Build Coastguard Worker 		waddstr(win, tempstr);
335*cf5a6c84SAndroid Build Coastguard Worker 	} else {
336*cf5a6c84SAndroid Build Coastguard Worker 		cur_x = x;
337*cf5a6c84SAndroid Build Coastguard Worker 		cur_y = y;
338*cf5a6c84SAndroid Build Coastguard Worker 		newl = 1;
339*cf5a6c84SAndroid Build Coastguard Worker 		word = tempstr;
340*cf5a6c84SAndroid Build Coastguard Worker 		while (word && *word) {
341*cf5a6c84SAndroid Build Coastguard Worker 			sp = index(word, ' ');
342*cf5a6c84SAndroid Build Coastguard Worker 			if (sp)
343*cf5a6c84SAndroid Build Coastguard Worker 				*sp++ = 0;
344*cf5a6c84SAndroid Build Coastguard Worker 
345*cf5a6c84SAndroid Build Coastguard Worker 			/* Wrap to next line if either the word does not fit,
346*cf5a6c84SAndroid Build Coastguard Worker 			   or it is the first word of a new sentence, and it is
347*cf5a6c84SAndroid Build Coastguard Worker 			   short, and the next word does not fit. */
348*cf5a6c84SAndroid Build Coastguard Worker 			room = width - cur_x;
349*cf5a6c84SAndroid Build Coastguard Worker 			wlen = strlen(word);
350*cf5a6c84SAndroid Build Coastguard Worker 			if (wlen > room ||
351*cf5a6c84SAndroid Build Coastguard Worker 			    (newl && wlen < 4 && sp
352*cf5a6c84SAndroid Build Coastguard Worker 			     && wlen + 1 + strlen(sp) > room
353*cf5a6c84SAndroid Build Coastguard Worker 			     && (!(sp2 = index(sp, ' '))
354*cf5a6c84SAndroid Build Coastguard Worker 				 || wlen + 1 + (sp2 - sp) > room))) {
355*cf5a6c84SAndroid Build Coastguard Worker 				cur_y++;
356*cf5a6c84SAndroid Build Coastguard Worker 				cur_x = x;
357*cf5a6c84SAndroid Build Coastguard Worker 			}
358*cf5a6c84SAndroid Build Coastguard Worker 			wmove(win, cur_y, cur_x);
359*cf5a6c84SAndroid Build Coastguard Worker 			waddstr(win, word);
360*cf5a6c84SAndroid Build Coastguard Worker 			getyx(win, cur_y, cur_x);
361*cf5a6c84SAndroid Build Coastguard Worker 			cur_x++;
362*cf5a6c84SAndroid Build Coastguard Worker 			if (sp && *sp == ' ') {
363*cf5a6c84SAndroid Build Coastguard Worker 				cur_x++;	/* double space */
364*cf5a6c84SAndroid Build Coastguard Worker 				while (*++sp == ' ') ;
365*cf5a6c84SAndroid Build Coastguard Worker 				newl = 1;
366*cf5a6c84SAndroid Build Coastguard Worker 			} else
367*cf5a6c84SAndroid Build Coastguard Worker 				newl = 0;
368*cf5a6c84SAndroid Build Coastguard Worker 			word = sp;
369*cf5a6c84SAndroid Build Coastguard Worker 		}
370*cf5a6c84SAndroid Build Coastguard Worker 	}
371*cf5a6c84SAndroid Build Coastguard Worker }
372*cf5a6c84SAndroid Build Coastguard Worker 
373*cf5a6c84SAndroid Build Coastguard Worker /*
374*cf5a6c84SAndroid Build Coastguard Worker  * Print a button
375*cf5a6c84SAndroid Build Coastguard Worker  */
print_button(WINDOW * win,const char * label,int y,int x,int selected)376*cf5a6c84SAndroid Build Coastguard Worker void print_button(WINDOW * win, const char *label, int y, int x, int selected)
377*cf5a6c84SAndroid Build Coastguard Worker {
378*cf5a6c84SAndroid Build Coastguard Worker 	int i, temp;
379*cf5a6c84SAndroid Build Coastguard Worker 
380*cf5a6c84SAndroid Build Coastguard Worker 	wmove(win, y, x);
381*cf5a6c84SAndroid Build Coastguard Worker 	wattrset(win, selected ? dlg.button_active.atr
382*cf5a6c84SAndroid Build Coastguard Worker 		 : dlg.button_inactive.atr);
383*cf5a6c84SAndroid Build Coastguard Worker 	waddstr(win, "<");
384*cf5a6c84SAndroid Build Coastguard Worker 	temp = strspn(label, " ");
385*cf5a6c84SAndroid Build Coastguard Worker 	label += temp;
386*cf5a6c84SAndroid Build Coastguard Worker 	wattrset(win, selected ? dlg.button_label_active.atr
387*cf5a6c84SAndroid Build Coastguard Worker 		 : dlg.button_label_inactive.atr);
388*cf5a6c84SAndroid Build Coastguard Worker 	for (i = 0; i < temp; i++)
389*cf5a6c84SAndroid Build Coastguard Worker 		waddch(win, ' ');
390*cf5a6c84SAndroid Build Coastguard Worker 	wattrset(win, selected ? dlg.button_key_active.atr
391*cf5a6c84SAndroid Build Coastguard Worker 		 : dlg.button_key_inactive.atr);
392*cf5a6c84SAndroid Build Coastguard Worker 	waddch(win, label[0]);
393*cf5a6c84SAndroid Build Coastguard Worker 	wattrset(win, selected ? dlg.button_label_active.atr
394*cf5a6c84SAndroid Build Coastguard Worker 		 : dlg.button_label_inactive.atr);
395*cf5a6c84SAndroid Build Coastguard Worker 	waddstr(win, (char *)label + 1);
396*cf5a6c84SAndroid Build Coastguard Worker 	wattrset(win, selected ? dlg.button_active.atr
397*cf5a6c84SAndroid Build Coastguard Worker 		 : dlg.button_inactive.atr);
398*cf5a6c84SAndroid Build Coastguard Worker 	waddstr(win, ">");
399*cf5a6c84SAndroid Build Coastguard Worker 	wmove(win, y, x + temp + 1);
400*cf5a6c84SAndroid Build Coastguard Worker }
401*cf5a6c84SAndroid Build Coastguard Worker 
402*cf5a6c84SAndroid Build Coastguard Worker /*
403*cf5a6c84SAndroid Build Coastguard Worker  * Draw a rectangular box with line drawing characters
404*cf5a6c84SAndroid Build Coastguard Worker  */
405*cf5a6c84SAndroid Build Coastguard Worker void
draw_box(WINDOW * win,int y,int x,int height,int width,chtype box,chtype border)406*cf5a6c84SAndroid Build Coastguard Worker draw_box(WINDOW * win, int y, int x, int height, int width,
407*cf5a6c84SAndroid Build Coastguard Worker 	 chtype box, chtype border)
408*cf5a6c84SAndroid Build Coastguard Worker {
409*cf5a6c84SAndroid Build Coastguard Worker 	int i, j;
410*cf5a6c84SAndroid Build Coastguard Worker 
411*cf5a6c84SAndroid Build Coastguard Worker 	wattrset(win, 0);
412*cf5a6c84SAndroid Build Coastguard Worker 	for (i = 0; i < height; i++) {
413*cf5a6c84SAndroid Build Coastguard Worker 		wmove(win, y + i, x);
414*cf5a6c84SAndroid Build Coastguard Worker 		for (j = 0; j < width; j++)
415*cf5a6c84SAndroid Build Coastguard Worker 			if (!i && !j)
416*cf5a6c84SAndroid Build Coastguard Worker 				waddch(win, border | ACS_ULCORNER);
417*cf5a6c84SAndroid Build Coastguard Worker 			else if (i == height - 1 && !j)
418*cf5a6c84SAndroid Build Coastguard Worker 				waddch(win, border | ACS_LLCORNER);
419*cf5a6c84SAndroid Build Coastguard Worker 			else if (!i && j == width - 1)
420*cf5a6c84SAndroid Build Coastguard Worker 				waddch(win, box | ACS_URCORNER);
421*cf5a6c84SAndroid Build Coastguard Worker 			else if (i == height - 1 && j == width - 1)
422*cf5a6c84SAndroid Build Coastguard Worker 				waddch(win, box | ACS_LRCORNER);
423*cf5a6c84SAndroid Build Coastguard Worker 			else if (!i)
424*cf5a6c84SAndroid Build Coastguard Worker 				waddch(win, border | ACS_HLINE);
425*cf5a6c84SAndroid Build Coastguard Worker 			else if (i == height - 1)
426*cf5a6c84SAndroid Build Coastguard Worker 				waddch(win, box | ACS_HLINE);
427*cf5a6c84SAndroid Build Coastguard Worker 			else if (!j)
428*cf5a6c84SAndroid Build Coastguard Worker 				waddch(win, border | ACS_VLINE);
429*cf5a6c84SAndroid Build Coastguard Worker 			else if (j == width - 1)
430*cf5a6c84SAndroid Build Coastguard Worker 				waddch(win, box | ACS_VLINE);
431*cf5a6c84SAndroid Build Coastguard Worker 			else
432*cf5a6c84SAndroid Build Coastguard Worker 				waddch(win, box | ' ');
433*cf5a6c84SAndroid Build Coastguard Worker 	}
434*cf5a6c84SAndroid Build Coastguard Worker }
435*cf5a6c84SAndroid Build Coastguard Worker 
436*cf5a6c84SAndroid Build Coastguard Worker /*
437*cf5a6c84SAndroid Build Coastguard Worker  * Draw shadows along the right and bottom edge to give a more 3D look
438*cf5a6c84SAndroid Build Coastguard Worker  * to the boxes
439*cf5a6c84SAndroid Build Coastguard Worker  */
draw_shadow(WINDOW * win,int y,int x,int height,int width)440*cf5a6c84SAndroid Build Coastguard Worker void draw_shadow(WINDOW * win, int y, int x, int height, int width)
441*cf5a6c84SAndroid Build Coastguard Worker {
442*cf5a6c84SAndroid Build Coastguard Worker 	int i;
443*cf5a6c84SAndroid Build Coastguard Worker 
444*cf5a6c84SAndroid Build Coastguard Worker 	if (has_colors()) {	/* Whether terminal supports color? */
445*cf5a6c84SAndroid Build Coastguard Worker 		wattrset(win, dlg.shadow.atr);
446*cf5a6c84SAndroid Build Coastguard Worker 		wmove(win, y + height, x + 2);
447*cf5a6c84SAndroid Build Coastguard Worker 		for (i = 0; i < width; i++)
448*cf5a6c84SAndroid Build Coastguard Worker 			waddch(win, winch(win) & A_CHARTEXT);
449*cf5a6c84SAndroid Build Coastguard Worker 		for (i = y + 1; i < y + height + 1; i++) {
450*cf5a6c84SAndroid Build Coastguard Worker 			wmove(win, i, x + width);
451*cf5a6c84SAndroid Build Coastguard Worker 			waddch(win, winch(win) & A_CHARTEXT);
452*cf5a6c84SAndroid Build Coastguard Worker 			waddch(win, winch(win) & A_CHARTEXT);
453*cf5a6c84SAndroid Build Coastguard Worker 		}
454*cf5a6c84SAndroid Build Coastguard Worker 		wnoutrefresh(win);
455*cf5a6c84SAndroid Build Coastguard Worker 	}
456*cf5a6c84SAndroid Build Coastguard Worker }
457*cf5a6c84SAndroid Build Coastguard Worker 
458*cf5a6c84SAndroid Build Coastguard Worker /*
459*cf5a6c84SAndroid Build Coastguard Worker  *  Return the position of the first alphabetic character in a string.
460*cf5a6c84SAndroid Build Coastguard Worker  */
first_alpha(const char * string,const char * exempt)461*cf5a6c84SAndroid Build Coastguard Worker int first_alpha(const char *string, const char *exempt)
462*cf5a6c84SAndroid Build Coastguard Worker {
463*cf5a6c84SAndroid Build Coastguard Worker 	int i, in_paren = 0, c;
464*cf5a6c84SAndroid Build Coastguard Worker 
465*cf5a6c84SAndroid Build Coastguard Worker 	for (i = 0; i < strlen(string); i++) {
466*cf5a6c84SAndroid Build Coastguard Worker 		c = tolower(string[i]);
467*cf5a6c84SAndroid Build Coastguard Worker 
468*cf5a6c84SAndroid Build Coastguard Worker 		if (strchr("<[(", c))
469*cf5a6c84SAndroid Build Coastguard Worker 			++in_paren;
470*cf5a6c84SAndroid Build Coastguard Worker 		if (strchr(">])", c) && in_paren > 0)
471*cf5a6c84SAndroid Build Coastguard Worker 			--in_paren;
472*cf5a6c84SAndroid Build Coastguard Worker 
473*cf5a6c84SAndroid Build Coastguard Worker 		if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0)
474*cf5a6c84SAndroid Build Coastguard Worker 			return i;
475*cf5a6c84SAndroid Build Coastguard Worker 	}
476*cf5a6c84SAndroid Build Coastguard Worker 
477*cf5a6c84SAndroid Build Coastguard Worker 	return 0;
478*cf5a6c84SAndroid Build Coastguard Worker }
479*cf5a6c84SAndroid Build Coastguard Worker 
480*cf5a6c84SAndroid Build Coastguard Worker /*
481*cf5a6c84SAndroid Build Coastguard Worker  * ncurses uses ESC to detect escaped char sequences. This resutl in
482*cf5a6c84SAndroid Build Coastguard Worker  * a small timeout before ESC is actually delivered to the application.
483*cf5a6c84SAndroid Build Coastguard Worker  * lxdialog suggest <ESC> <ESC> which is correctly translated to two
484*cf5a6c84SAndroid Build Coastguard Worker  * times esc. But then we need to ignore the second esc to avoid stepping
485*cf5a6c84SAndroid Build Coastguard Worker  * out one menu too much. Filter away all escaped key sequences since
486*cf5a6c84SAndroid Build Coastguard Worker  * keypad(FALSE) turn off ncurses support for escape sequences - and thats
487*cf5a6c84SAndroid Build Coastguard Worker  * needed to make notimeout() do as expected.
488*cf5a6c84SAndroid Build Coastguard Worker  */
on_key_esc(WINDOW * win)489*cf5a6c84SAndroid Build Coastguard Worker int on_key_esc(WINDOW *win)
490*cf5a6c84SAndroid Build Coastguard Worker {
491*cf5a6c84SAndroid Build Coastguard Worker 	int key;
492*cf5a6c84SAndroid Build Coastguard Worker 	int key2;
493*cf5a6c84SAndroid Build Coastguard Worker 	int key3;
494*cf5a6c84SAndroid Build Coastguard Worker 
495*cf5a6c84SAndroid Build Coastguard Worker 	nodelay(win, TRUE);
496*cf5a6c84SAndroid Build Coastguard Worker 	keypad(win, FALSE);
497*cf5a6c84SAndroid Build Coastguard Worker 	key = wgetch(win);
498*cf5a6c84SAndroid Build Coastguard Worker 	key2 = wgetch(win);
499*cf5a6c84SAndroid Build Coastguard Worker 	do {
500*cf5a6c84SAndroid Build Coastguard Worker 		key3 = wgetch(win);
501*cf5a6c84SAndroid Build Coastguard Worker 	} while (key3 != ERR);
502*cf5a6c84SAndroid Build Coastguard Worker 	nodelay(win, FALSE);
503*cf5a6c84SAndroid Build Coastguard Worker 	keypad(win, TRUE);
504*cf5a6c84SAndroid Build Coastguard Worker 	if (key == KEY_ESC && key2 == ERR)
505*cf5a6c84SAndroid Build Coastguard Worker 		return KEY_ESC;
506*cf5a6c84SAndroid Build Coastguard Worker 	else if (key != ERR && key != KEY_ESC && key2 == ERR)
507*cf5a6c84SAndroid Build Coastguard Worker 		ungetch(key);
508*cf5a6c84SAndroid Build Coastguard Worker 
509*cf5a6c84SAndroid Build Coastguard Worker 	return -1;
510*cf5a6c84SAndroid Build Coastguard Worker }
511*cf5a6c84SAndroid Build Coastguard Worker 
512*cf5a6c84SAndroid Build Coastguard Worker /* redraw screen in new size */
on_key_resize(void)513*cf5a6c84SAndroid Build Coastguard Worker int on_key_resize(void)
514*cf5a6c84SAndroid Build Coastguard Worker {
515*cf5a6c84SAndroid Build Coastguard Worker 	dialog_clear();
516*cf5a6c84SAndroid Build Coastguard Worker 	return KEY_RESIZE;
517*cf5a6c84SAndroid Build Coastguard Worker }
518*cf5a6c84SAndroid Build Coastguard Worker 
519*cf5a6c84SAndroid Build Coastguard Worker struct dialog_list *item_cur;
520*cf5a6c84SAndroid Build Coastguard Worker struct dialog_list item_nil;
521*cf5a6c84SAndroid Build Coastguard Worker struct dialog_list *item_head;
522*cf5a6c84SAndroid Build Coastguard Worker 
item_reset(void)523*cf5a6c84SAndroid Build Coastguard Worker void item_reset(void)
524*cf5a6c84SAndroid Build Coastguard Worker {
525*cf5a6c84SAndroid Build Coastguard Worker 	struct dialog_list *p, *next;
526*cf5a6c84SAndroid Build Coastguard Worker 
527*cf5a6c84SAndroid Build Coastguard Worker 	for (p = item_head; p; p = next) {
528*cf5a6c84SAndroid Build Coastguard Worker 		next = p->next;
529*cf5a6c84SAndroid Build Coastguard Worker 		free(p);
530*cf5a6c84SAndroid Build Coastguard Worker 	}
531*cf5a6c84SAndroid Build Coastguard Worker 	item_head = NULL;
532*cf5a6c84SAndroid Build Coastguard Worker 	item_cur = &item_nil;
533*cf5a6c84SAndroid Build Coastguard Worker }
534*cf5a6c84SAndroid Build Coastguard Worker 
item_make(const char * fmt,...)535*cf5a6c84SAndroid Build Coastguard Worker void item_make(const char *fmt, ...)
536*cf5a6c84SAndroid Build Coastguard Worker {
537*cf5a6c84SAndroid Build Coastguard Worker 	va_list ap;
538*cf5a6c84SAndroid Build Coastguard Worker 	struct dialog_list *p = malloc(sizeof(*p));
539*cf5a6c84SAndroid Build Coastguard Worker 
540*cf5a6c84SAndroid Build Coastguard Worker 	if (item_head)
541*cf5a6c84SAndroid Build Coastguard Worker 		item_cur->next = p;
542*cf5a6c84SAndroid Build Coastguard Worker 	else
543*cf5a6c84SAndroid Build Coastguard Worker 		item_head = p;
544*cf5a6c84SAndroid Build Coastguard Worker 	item_cur = p;
545*cf5a6c84SAndroid Build Coastguard Worker 	memset(p, 0, sizeof(*p));
546*cf5a6c84SAndroid Build Coastguard Worker 
547*cf5a6c84SAndroid Build Coastguard Worker 	va_start(ap, fmt);
548*cf5a6c84SAndroid Build Coastguard Worker 	vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap);
549*cf5a6c84SAndroid Build Coastguard Worker 	va_end(ap);
550*cf5a6c84SAndroid Build Coastguard Worker }
551*cf5a6c84SAndroid Build Coastguard Worker 
item_add_str(const char * fmt,...)552*cf5a6c84SAndroid Build Coastguard Worker void item_add_str(const char *fmt, ...)
553*cf5a6c84SAndroid Build Coastguard Worker {
554*cf5a6c84SAndroid Build Coastguard Worker 	va_list ap;
555*cf5a6c84SAndroid Build Coastguard Worker         size_t avail;
556*cf5a6c84SAndroid Build Coastguard Worker 
557*cf5a6c84SAndroid Build Coastguard Worker 	avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str);
558*cf5a6c84SAndroid Build Coastguard Worker 
559*cf5a6c84SAndroid Build Coastguard Worker 	va_start(ap, fmt);
560*cf5a6c84SAndroid Build Coastguard Worker 	vsnprintf(item_cur->node.str + strlen(item_cur->node.str),
561*cf5a6c84SAndroid Build Coastguard Worker 		  avail, fmt, ap);
562*cf5a6c84SAndroid Build Coastguard Worker 	item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0';
563*cf5a6c84SAndroid Build Coastguard Worker 	va_end(ap);
564*cf5a6c84SAndroid Build Coastguard Worker }
565*cf5a6c84SAndroid Build Coastguard Worker 
item_set_tag(char tag)566*cf5a6c84SAndroid Build Coastguard Worker void item_set_tag(char tag)
567*cf5a6c84SAndroid Build Coastguard Worker {
568*cf5a6c84SAndroid Build Coastguard Worker 	item_cur->node.tag = tag;
569*cf5a6c84SAndroid Build Coastguard Worker }
item_set_data(void * ptr)570*cf5a6c84SAndroid Build Coastguard Worker void item_set_data(void *ptr)
571*cf5a6c84SAndroid Build Coastguard Worker {
572*cf5a6c84SAndroid Build Coastguard Worker 	item_cur->node.data = ptr;
573*cf5a6c84SAndroid Build Coastguard Worker }
574*cf5a6c84SAndroid Build Coastguard Worker 
item_set_selected(int val)575*cf5a6c84SAndroid Build Coastguard Worker void item_set_selected(int val)
576*cf5a6c84SAndroid Build Coastguard Worker {
577*cf5a6c84SAndroid Build Coastguard Worker 	item_cur->node.selected = val;
578*cf5a6c84SAndroid Build Coastguard Worker }
579*cf5a6c84SAndroid Build Coastguard Worker 
item_activate_selected(void)580*cf5a6c84SAndroid Build Coastguard Worker int item_activate_selected(void)
581*cf5a6c84SAndroid Build Coastguard Worker {
582*cf5a6c84SAndroid Build Coastguard Worker 	item_foreach()
583*cf5a6c84SAndroid Build Coastguard Worker 		if (item_is_selected())
584*cf5a6c84SAndroid Build Coastguard Worker 			return 1;
585*cf5a6c84SAndroid Build Coastguard Worker 	return 0;
586*cf5a6c84SAndroid Build Coastguard Worker }
587*cf5a6c84SAndroid Build Coastguard Worker 
item_data(void)588*cf5a6c84SAndroid Build Coastguard Worker void *item_data(void)
589*cf5a6c84SAndroid Build Coastguard Worker {
590*cf5a6c84SAndroid Build Coastguard Worker 	return item_cur->node.data;
591*cf5a6c84SAndroid Build Coastguard Worker }
592*cf5a6c84SAndroid Build Coastguard Worker 
item_tag(void)593*cf5a6c84SAndroid Build Coastguard Worker char item_tag(void)
594*cf5a6c84SAndroid Build Coastguard Worker {
595*cf5a6c84SAndroid Build Coastguard Worker 	return item_cur->node.tag;
596*cf5a6c84SAndroid Build Coastguard Worker }
597*cf5a6c84SAndroid Build Coastguard Worker 
item_count(void)598*cf5a6c84SAndroid Build Coastguard Worker int item_count(void)
599*cf5a6c84SAndroid Build Coastguard Worker {
600*cf5a6c84SAndroid Build Coastguard Worker 	int n = 0;
601*cf5a6c84SAndroid Build Coastguard Worker 	struct dialog_list *p;
602*cf5a6c84SAndroid Build Coastguard Worker 
603*cf5a6c84SAndroid Build Coastguard Worker 	for (p = item_head; p; p = p->next)
604*cf5a6c84SAndroid Build Coastguard Worker 		n++;
605*cf5a6c84SAndroid Build Coastguard Worker 	return n;
606*cf5a6c84SAndroid Build Coastguard Worker }
607*cf5a6c84SAndroid Build Coastguard Worker 
item_set(int n)608*cf5a6c84SAndroid Build Coastguard Worker void item_set(int n)
609*cf5a6c84SAndroid Build Coastguard Worker {
610*cf5a6c84SAndroid Build Coastguard Worker 	int i = 0;
611*cf5a6c84SAndroid Build Coastguard Worker 	item_foreach()
612*cf5a6c84SAndroid Build Coastguard Worker 		if (i++ == n)
613*cf5a6c84SAndroid Build Coastguard Worker 			return;
614*cf5a6c84SAndroid Build Coastguard Worker }
615*cf5a6c84SAndroid Build Coastguard Worker 
item_n(void)616*cf5a6c84SAndroid Build Coastguard Worker int item_n(void)
617*cf5a6c84SAndroid Build Coastguard Worker {
618*cf5a6c84SAndroid Build Coastguard Worker 	int n = 0;
619*cf5a6c84SAndroid Build Coastguard Worker 	struct dialog_list *p;
620*cf5a6c84SAndroid Build Coastguard Worker 
621*cf5a6c84SAndroid Build Coastguard Worker 	for (p = item_head; p; p = p->next) {
622*cf5a6c84SAndroid Build Coastguard Worker 		if (p == item_cur)
623*cf5a6c84SAndroid Build Coastguard Worker 			return n;
624*cf5a6c84SAndroid Build Coastguard Worker 		n++;
625*cf5a6c84SAndroid Build Coastguard Worker 	}
626*cf5a6c84SAndroid Build Coastguard Worker 	return 0;
627*cf5a6c84SAndroid Build Coastguard Worker }
628*cf5a6c84SAndroid Build Coastguard Worker 
item_str(void)629*cf5a6c84SAndroid Build Coastguard Worker const char *item_str(void)
630*cf5a6c84SAndroid Build Coastguard Worker {
631*cf5a6c84SAndroid Build Coastguard Worker 	return item_cur->node.str;
632*cf5a6c84SAndroid Build Coastguard Worker }
633*cf5a6c84SAndroid Build Coastguard Worker 
item_is_selected(void)634*cf5a6c84SAndroid Build Coastguard Worker int item_is_selected(void)
635*cf5a6c84SAndroid Build Coastguard Worker {
636*cf5a6c84SAndroid Build Coastguard Worker 	return (item_cur->node.selected != 0);
637*cf5a6c84SAndroid Build Coastguard Worker }
638*cf5a6c84SAndroid Build Coastguard Worker 
item_is_tag(char tag)639*cf5a6c84SAndroid Build Coastguard Worker int item_is_tag(char tag)
640*cf5a6c84SAndroid Build Coastguard Worker {
641*cf5a6c84SAndroid Build Coastguard Worker 	return (item_cur->node.tag == tag);
642*cf5a6c84SAndroid Build Coastguard Worker }
643