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