xref: /freebsd-src/contrib/bsddialog/lib/barbox.c (revision c76f07938c44264c7ebd400c23f218e561960d23)
1*c76f0793SBaptiste Daroussin /*-
2*c76f0793SBaptiste Daroussin  * SPDX-License-Identifier: BSD-2-Clause
3*c76f0793SBaptiste Daroussin  *
4*c76f0793SBaptiste Daroussin  * Copyright (c) 2021 Alfonso Sabato Siciliano
5*c76f0793SBaptiste Daroussin  *
6*c76f0793SBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
7*c76f0793SBaptiste Daroussin  * modification, are permitted provided that the following conditions
8*c76f0793SBaptiste Daroussin  * are met:
9*c76f0793SBaptiste Daroussin  * 1. Redistributions of source code must retain the above copyright
10*c76f0793SBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer.
11*c76f0793SBaptiste Daroussin  * 2. Redistributions in binary form must reproduce the above copyright
12*c76f0793SBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer in the
13*c76f0793SBaptiste Daroussin  *    documentation and/or other materials provided with the distribution.
14*c76f0793SBaptiste Daroussin  *
15*c76f0793SBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*c76f0793SBaptiste Daroussin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*c76f0793SBaptiste Daroussin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*c76f0793SBaptiste Daroussin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*c76f0793SBaptiste Daroussin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*c76f0793SBaptiste Daroussin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*c76f0793SBaptiste Daroussin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*c76f0793SBaptiste Daroussin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*c76f0793SBaptiste Daroussin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*c76f0793SBaptiste Daroussin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*c76f0793SBaptiste Daroussin  * SUCH DAMAGE.
26*c76f0793SBaptiste Daroussin  */
27*c76f0793SBaptiste Daroussin 
28*c76f0793SBaptiste Daroussin #include <stdlib.h>
29*c76f0793SBaptiste Daroussin #include <string.h>
30*c76f0793SBaptiste Daroussin 
31*c76f0793SBaptiste Daroussin #ifdef PORTNCURSES
32*c76f0793SBaptiste Daroussin #include <ncurses/curses.h>
33*c76f0793SBaptiste Daroussin #else
34*c76f0793SBaptiste Daroussin #include <curses.h>
35*c76f0793SBaptiste Daroussin #endif
36*c76f0793SBaptiste Daroussin 
37*c76f0793SBaptiste Daroussin #include "bsddialog.h"
38*c76f0793SBaptiste Daroussin #include "lib_util.h"
39*c76f0793SBaptiste Daroussin #include "bsddialog_theme.h"
40*c76f0793SBaptiste Daroussin 
41*c76f0793SBaptiste Daroussin /* "Bar": gauge - mixedgauge - rangebox - pause */
42*c76f0793SBaptiste Daroussin 
43*c76f0793SBaptiste Daroussin extern struct bsddialog_theme t;
44*c76f0793SBaptiste Daroussin 
45*c76f0793SBaptiste Daroussin static void
46*c76f0793SBaptiste Daroussin draw_perc_bar(WINDOW *win, int y, int x, int size, int perc, bool withlabel, int label)
47*c76f0793SBaptiste Daroussin {
48*c76f0793SBaptiste Daroussin 	char labelstr[128];
49*c76f0793SBaptiste Daroussin 	int i, blue_x, color;
50*c76f0793SBaptiste Daroussin 
51*c76f0793SBaptiste Daroussin 	blue_x = (int)((perc*(size))/100);
52*c76f0793SBaptiste Daroussin 
53*c76f0793SBaptiste Daroussin 	wmove(win, y, x);
54*c76f0793SBaptiste Daroussin 	for (i = 0; i < size; i++) {
55*c76f0793SBaptiste Daroussin 		color = (i <= blue_x) ? t.currbarcolor : t.barcolor;
56*c76f0793SBaptiste Daroussin 		wattron(win, color);
57*c76f0793SBaptiste Daroussin 		waddch(win, ' ');
58*c76f0793SBaptiste Daroussin 		wattroff(win, color);
59*c76f0793SBaptiste Daroussin 	}
60*c76f0793SBaptiste Daroussin 
61*c76f0793SBaptiste Daroussin 	if (withlabel)
62*c76f0793SBaptiste Daroussin 		sprintf(labelstr, "%d", label);
63*c76f0793SBaptiste Daroussin 	else
64*c76f0793SBaptiste Daroussin 		sprintf(labelstr, "%3d%%", perc);
65*c76f0793SBaptiste Daroussin 	wmove(win, y, x + size/2 - 2);
66*c76f0793SBaptiste Daroussin 	for (i=0; i < (int) strlen(labelstr); i++) {
67*c76f0793SBaptiste Daroussin 		color = ( (blue_x + 1) <= (size/2 - (int) strlen(labelstr)/2 + i) ) ?
68*c76f0793SBaptiste Daroussin 		    t.barcolor : t.currbarcolor;
69*c76f0793SBaptiste Daroussin 		wattron(win, color);
70*c76f0793SBaptiste Daroussin 		waddch(win, labelstr[i]);
71*c76f0793SBaptiste Daroussin 		wattroff(win, color);
72*c76f0793SBaptiste Daroussin 	}
73*c76f0793SBaptiste Daroussin }
74*c76f0793SBaptiste Daroussin 
75*c76f0793SBaptiste Daroussin int bsddialog_gauge(struct bsddialog_conf conf, char* text, int rows, int cols, int perc)
76*c76f0793SBaptiste Daroussin {
77*c76f0793SBaptiste Daroussin 	WINDOW *widget, *bar, *shadow;
78*c76f0793SBaptiste Daroussin 	char input[2048];
79*c76f0793SBaptiste Daroussin 	int i, y, x;
80*c76f0793SBaptiste Daroussin 	bool mainloop = true;
81*c76f0793SBaptiste Daroussin 
82*c76f0793SBaptiste Daroussin 	if (new_widget(conf, &widget, &y, &x, text, &rows, &cols, &shadow,
83*c76f0793SBaptiste Daroussin 	    false) <0)
84*c76f0793SBaptiste Daroussin 		return -1;
85*c76f0793SBaptiste Daroussin 
86*c76f0793SBaptiste Daroussin 	bar = new_boxed_window(conf, y+rows -4, x+3, 3, cols-6, RAISED);
87*c76f0793SBaptiste Daroussin 
88*c76f0793SBaptiste Daroussin 	wrefresh(widget);
89*c76f0793SBaptiste Daroussin 	wrefresh(bar);
90*c76f0793SBaptiste Daroussin 
91*c76f0793SBaptiste Daroussin 	while (mainloop) {
92*c76f0793SBaptiste Daroussin 		draw_perc_bar(bar, 1, 1, cols-8, perc, false, -1 /*unused*/);
93*c76f0793SBaptiste Daroussin 
94*c76f0793SBaptiste Daroussin 		wrefresh(widget);
95*c76f0793SBaptiste Daroussin 		wrefresh(bar);
96*c76f0793SBaptiste Daroussin 
97*c76f0793SBaptiste Daroussin 		while (true) {
98*c76f0793SBaptiste Daroussin 			scanf("%s", input);
99*c76f0793SBaptiste Daroussin 			if (strcmp(input,"EOF") == 0) {
100*c76f0793SBaptiste Daroussin 				mainloop = false;
101*c76f0793SBaptiste Daroussin 				break;
102*c76f0793SBaptiste Daroussin 			}
103*c76f0793SBaptiste Daroussin 			if (strcmp(input,"XXX") == 0)
104*c76f0793SBaptiste Daroussin 				break;
105*c76f0793SBaptiste Daroussin 		}
106*c76f0793SBaptiste Daroussin 		scanf("%d", &perc);
107*c76f0793SBaptiste Daroussin 		perc = perc < 0 ? 0 : perc;
108*c76f0793SBaptiste Daroussin 		perc = perc > 100 ? 100 : perc;
109*c76f0793SBaptiste Daroussin 		i = 2;
110*c76f0793SBaptiste Daroussin 		wmove(widget, 1, 1);
111*c76f0793SBaptiste Daroussin 		wclrtoeol(widget);
112*c76f0793SBaptiste Daroussin 		while (true) {
113*c76f0793SBaptiste Daroussin 			scanf("%s", input);
114*c76f0793SBaptiste Daroussin 			if (strcmp(input,"EOF") == 0) {
115*c76f0793SBaptiste Daroussin 				mainloop = false;
116*c76f0793SBaptiste Daroussin 				break;
117*c76f0793SBaptiste Daroussin 			}
118*c76f0793SBaptiste Daroussin 			if (strcmp(input,"XXX") == 0)
119*c76f0793SBaptiste Daroussin 				break;
120*c76f0793SBaptiste Daroussin 			//print_text(conf, widget, 1, 1, cols-2, input);
121*c76f0793SBaptiste Daroussin 			mvwaddstr(widget, 1, i, input);
122*c76f0793SBaptiste Daroussin 			i = i + strlen(input) + 1;
123*c76f0793SBaptiste Daroussin 			wrefresh(widget);
124*c76f0793SBaptiste Daroussin 		}
125*c76f0793SBaptiste Daroussin 	}
126*c76f0793SBaptiste Daroussin 
127*c76f0793SBaptiste Daroussin 	delwin(bar);
128*c76f0793SBaptiste Daroussin 	end_widget(conf, widget, rows, cols, shadow);
129*c76f0793SBaptiste Daroussin 
130*c76f0793SBaptiste Daroussin 	return BSDDIALOG_YESOK;
131*c76f0793SBaptiste Daroussin }
132*c76f0793SBaptiste Daroussin 
133*c76f0793SBaptiste Daroussin int bsddialog_mixedgauge(struct bsddialog_conf conf, char* text, int rows, int cols,
134*c76f0793SBaptiste Daroussin     unsigned int perc, int argc, char **argv)
135*c76f0793SBaptiste Daroussin {
136*c76f0793SBaptiste Daroussin 	WINDOW *widget, *bar, *shadow;
137*c76f0793SBaptiste Daroussin 	int i, miniperc, y, x;
138*c76f0793SBaptiste Daroussin 	char states[11][16] = {
139*c76f0793SBaptiste Daroussin 	    "[  Succeeded  ]",
140*c76f0793SBaptiste Daroussin 	    "[   Failed    ]",
141*c76f0793SBaptiste Daroussin 	    "[   Passed    ]",
142*c76f0793SBaptiste Daroussin 	    "[  Completed  ]",
143*c76f0793SBaptiste Daroussin 	    "[   Checked   ]",
144*c76f0793SBaptiste Daroussin 	    "[    Done     ]",
145*c76f0793SBaptiste Daroussin 	    "[   Skipped   ]",
146*c76f0793SBaptiste Daroussin 	    "[ In Progress ]",
147*c76f0793SBaptiste Daroussin 	    "!!!  BLANK  !!!",
148*c76f0793SBaptiste Daroussin 	    "[     N/A     ]",
149*c76f0793SBaptiste Daroussin 	    "[   UNKNOWN   ]",};
150*c76f0793SBaptiste Daroussin 
151*c76f0793SBaptiste Daroussin 	if (new_widget(conf, &widget, &y, &x, NULL, &rows, &cols, &shadow,
152*c76f0793SBaptiste Daroussin 	    false) <0)
153*c76f0793SBaptiste Daroussin 		return -1;
154*c76f0793SBaptiste Daroussin 
155*c76f0793SBaptiste Daroussin 	bar = new_boxed_window(conf, y+rows -4, x+3, 3, cols-6, RAISED);
156*c76f0793SBaptiste Daroussin 
157*c76f0793SBaptiste Daroussin 	/* mini bars */
158*c76f0793SBaptiste Daroussin 	for (i=0; i < (argc/2); i++) {
159*c76f0793SBaptiste Daroussin 		miniperc = atol(argv[i*2 + 1]);
160*c76f0793SBaptiste Daroussin 		if (miniperc == 8)
161*c76f0793SBaptiste Daroussin 			continue;
162*c76f0793SBaptiste Daroussin 		mvwaddstr(widget, i+1, 2, argv[i*2]);
163*c76f0793SBaptiste Daroussin 		if (miniperc > 9)
164*c76f0793SBaptiste Daroussin 			mvwaddstr(widget, i+1, cols-2-15, states[10]);
165*c76f0793SBaptiste Daroussin 		else if (miniperc >= 0 && miniperc <= 9)
166*c76f0793SBaptiste Daroussin 			mvwaddstr(widget, i+1, cols-2-15, states[miniperc]);
167*c76f0793SBaptiste Daroussin 		else { //miniperc < 0
168*c76f0793SBaptiste Daroussin 			miniperc = abs(miniperc);
169*c76f0793SBaptiste Daroussin 			mvwaddstr(widget, i+1, cols-2-15, "[             ]");
170*c76f0793SBaptiste Daroussin 			draw_perc_bar(widget, i+1, 1+cols-2-15, 13, miniperc,
171*c76f0793SBaptiste Daroussin 			    false, -1 /*unused*/);
172*c76f0793SBaptiste Daroussin 		}
173*c76f0793SBaptiste Daroussin 	}
174*c76f0793SBaptiste Daroussin 
175*c76f0793SBaptiste Daroussin 	print_text(conf, widget, rows-6, 2, cols-2, text);
176*c76f0793SBaptiste Daroussin 
177*c76f0793SBaptiste Daroussin 	/* main bar */
178*c76f0793SBaptiste Daroussin 	draw_perc_bar(bar, 1, 1, cols-8, perc, false, -1 /*unused*/);
179*c76f0793SBaptiste Daroussin 
180*c76f0793SBaptiste Daroussin 	wattron(bar, t.barcolor);
181*c76f0793SBaptiste Daroussin 	mvwaddstr(bar, 0, 2, "Overall Progress");
182*c76f0793SBaptiste Daroussin 	wattroff(bar, t.barcolor);
183*c76f0793SBaptiste Daroussin 
184*c76f0793SBaptiste Daroussin 	wrefresh(widget);
185*c76f0793SBaptiste Daroussin 	wrefresh(bar);
186*c76f0793SBaptiste Daroussin 
187*c76f0793SBaptiste Daroussin 	getch();
188*c76f0793SBaptiste Daroussin 
189*c76f0793SBaptiste Daroussin 	delwin(bar);
190*c76f0793SBaptiste Daroussin 	end_widget(conf, widget, rows, cols, shadow);
191*c76f0793SBaptiste Daroussin 
192*c76f0793SBaptiste Daroussin 	return BSDDIALOG_YESOK;
193*c76f0793SBaptiste Daroussin }
194*c76f0793SBaptiste Daroussin 
195*c76f0793SBaptiste Daroussin int
196*c76f0793SBaptiste Daroussin bsddialog_rangebox(struct bsddialog_conf conf, char* text, int rows, int cols, int min,
197*c76f0793SBaptiste Daroussin     int max, int *value)
198*c76f0793SBaptiste Daroussin {
199*c76f0793SBaptiste Daroussin 	WINDOW *widget, *bar, *shadow;
200*c76f0793SBaptiste Daroussin 	int y, x;
201*c76f0793SBaptiste Daroussin 	bool loop, buttupdate, barupdate;
202*c76f0793SBaptiste Daroussin 	int input, currvalue, output, sizebar;
203*c76f0793SBaptiste Daroussin 	float perc;
204*c76f0793SBaptiste Daroussin 	int positions = max - min + 1;
205*c76f0793SBaptiste Daroussin 	struct buttons bs;
206*c76f0793SBaptiste Daroussin 
207*c76f0793SBaptiste Daroussin 	if (new_widget(conf, &widget, &y, &x, text, &rows, &cols, &shadow,
208*c76f0793SBaptiste Daroussin 	    true) <0)
209*c76f0793SBaptiste Daroussin 		return -1;
210*c76f0793SBaptiste Daroussin 
211*c76f0793SBaptiste Daroussin 	bar = new_boxed_window(conf, y + rows - 6, x +7, 3, cols-14, RAISED);
212*c76f0793SBaptiste Daroussin 
213*c76f0793SBaptiste Daroussin 	get_buttons(conf, &bs, BUTTONLABEL(ok_label), BUTTONLABEL(extra_label),
214*c76f0793SBaptiste Daroussin 	    BUTTONLABEL(cancel_label), BUTTONLABEL(help_label));
215*c76f0793SBaptiste Daroussin 
216*c76f0793SBaptiste Daroussin 	if (value == NULL)
217*c76f0793SBaptiste Daroussin 		RETURN_ERROR("*value == NULL");
218*c76f0793SBaptiste Daroussin 
219*c76f0793SBaptiste Daroussin 	currvalue = *value;
220*c76f0793SBaptiste Daroussin 	sizebar = cols - 16;
221*c76f0793SBaptiste Daroussin 	loop = buttupdate = barupdate = true;
222*c76f0793SBaptiste Daroussin 	while(loop) {
223*c76f0793SBaptiste Daroussin 		if (barupdate) {
224*c76f0793SBaptiste Daroussin 			perc = ((float)(currvalue - min)*100) / ((float)positions-1);
225*c76f0793SBaptiste Daroussin 			draw_perc_bar(bar, 1, 1, sizebar, perc, true, currvalue);
226*c76f0793SBaptiste Daroussin 			barupdate = false;
227*c76f0793SBaptiste Daroussin 			wrefresh(bar);
228*c76f0793SBaptiste Daroussin 		}
229*c76f0793SBaptiste Daroussin 
230*c76f0793SBaptiste Daroussin 		if (buttupdate) {
231*c76f0793SBaptiste Daroussin 			draw_buttons(widget, rows-2, cols, bs, true);
232*c76f0793SBaptiste Daroussin 			wrefresh(widget);
233*c76f0793SBaptiste Daroussin 			buttupdate = false;
234*c76f0793SBaptiste Daroussin 		}
235*c76f0793SBaptiste Daroussin 
236*c76f0793SBaptiste Daroussin 		input = getch();
237*c76f0793SBaptiste Daroussin 		switch(input) {
238*c76f0793SBaptiste Daroussin 		case 10: // Enter
239*c76f0793SBaptiste Daroussin 			output = bs.value[bs.curr]; // values -> outputs
240*c76f0793SBaptiste Daroussin 			*value = currvalue;
241*c76f0793SBaptiste Daroussin 			loop = false;
242*c76f0793SBaptiste Daroussin 			break;
243*c76f0793SBaptiste Daroussin 		case 27: /* Esc */
244*c76f0793SBaptiste Daroussin 			output = BSDDIALOG_ESC;
245*c76f0793SBaptiste Daroussin 			loop = false;
246*c76f0793SBaptiste Daroussin 			break;
247*c76f0793SBaptiste Daroussin 		case '\t': // TAB
248*c76f0793SBaptiste Daroussin 			bs.curr = (bs.curr + 1) % bs.nbuttons;
249*c76f0793SBaptiste Daroussin 			buttupdate = true;
250*c76f0793SBaptiste Daroussin 			break;
251*c76f0793SBaptiste Daroussin 		case KEY_LEFT:
252*c76f0793SBaptiste Daroussin 			if (bs.curr > 0) {
253*c76f0793SBaptiste Daroussin 				bs.curr--;
254*c76f0793SBaptiste Daroussin 				buttupdate = true;
255*c76f0793SBaptiste Daroussin 			}
256*c76f0793SBaptiste Daroussin 			break;
257*c76f0793SBaptiste Daroussin 		case KEY_RIGHT:
258*c76f0793SBaptiste Daroussin 			if (bs.curr < (int) bs.nbuttons - 1) {
259*c76f0793SBaptiste Daroussin 				bs.curr++;
260*c76f0793SBaptiste Daroussin 				buttupdate = true;
261*c76f0793SBaptiste Daroussin 			}
262*c76f0793SBaptiste Daroussin 			break;
263*c76f0793SBaptiste Daroussin 		case KEY_UP:
264*c76f0793SBaptiste Daroussin 			if (currvalue < max) {
265*c76f0793SBaptiste Daroussin 				currvalue++;
266*c76f0793SBaptiste Daroussin 				barupdate = true;
267*c76f0793SBaptiste Daroussin 			}
268*c76f0793SBaptiste Daroussin 			break;
269*c76f0793SBaptiste Daroussin 		case KEY_DOWN:
270*c76f0793SBaptiste Daroussin 			if (currvalue > min) {
271*c76f0793SBaptiste Daroussin 				currvalue--;
272*c76f0793SBaptiste Daroussin 				barupdate = true;
273*c76f0793SBaptiste Daroussin 			}
274*c76f0793SBaptiste Daroussin 			break;
275*c76f0793SBaptiste Daroussin 		}
276*c76f0793SBaptiste Daroussin 	}
277*c76f0793SBaptiste Daroussin 
278*c76f0793SBaptiste Daroussin 	delwin(bar);
279*c76f0793SBaptiste Daroussin 	end_widget(conf, widget, rows, cols, shadow);
280*c76f0793SBaptiste Daroussin 
281*c76f0793SBaptiste Daroussin 	return output;
282*c76f0793SBaptiste Daroussin }
283*c76f0793SBaptiste Daroussin 
284*c76f0793SBaptiste Daroussin int bsddialog_pause(struct bsddialog_conf conf, char* text, int rows, int cols, int sec)
285*c76f0793SBaptiste Daroussin {
286*c76f0793SBaptiste Daroussin 	WINDOW *widget, *bar, *shadow;
287*c76f0793SBaptiste Daroussin 	int output, y, x;
288*c76f0793SBaptiste Daroussin 	bool loop, buttupdate, barupdate;
289*c76f0793SBaptiste Daroussin 	int input, currvalue, sizebar;
290*c76f0793SBaptiste Daroussin 	float perc;
291*c76f0793SBaptiste Daroussin 	struct buttons bs;
292*c76f0793SBaptiste Daroussin 
293*c76f0793SBaptiste Daroussin 	if (new_widget(conf, &widget, &y, &x, text, &rows, &cols, &shadow,
294*c76f0793SBaptiste Daroussin 	    true) <0)
295*c76f0793SBaptiste Daroussin 		return -1;
296*c76f0793SBaptiste Daroussin 
297*c76f0793SBaptiste Daroussin 	bar = new_boxed_window(conf, y + rows - 6, x +7, 3, cols-14, RAISED);
298*c76f0793SBaptiste Daroussin 
299*c76f0793SBaptiste Daroussin 	get_buttons(conf, &bs, BUTTONLABEL(ok_label), BUTTONLABEL(extra_label),
300*c76f0793SBaptiste Daroussin 	    BUTTONLABEL(cancel_label), BUTTONLABEL(help_label));
301*c76f0793SBaptiste Daroussin 
302*c76f0793SBaptiste Daroussin 	currvalue = sec;
303*c76f0793SBaptiste Daroussin 	sizebar = cols-16;
304*c76f0793SBaptiste Daroussin 	nodelay(stdscr, TRUE);
305*c76f0793SBaptiste Daroussin 	timeout(1000);
306*c76f0793SBaptiste Daroussin 	//wtimeout(buttwin, 2);
307*c76f0793SBaptiste Daroussin 	loop = buttupdate = barupdate = true;
308*c76f0793SBaptiste Daroussin 	while(loop) {
309*c76f0793SBaptiste Daroussin 		if (barupdate) {
310*c76f0793SBaptiste Daroussin 			perc = ((float)(currvalue*100)) / ((float)sec);
311*c76f0793SBaptiste Daroussin 			draw_perc_bar(bar, 1, 1, sizebar, perc, true, currvalue);
312*c76f0793SBaptiste Daroussin 			barupdate = false;
313*c76f0793SBaptiste Daroussin 			wrefresh(bar);
314*c76f0793SBaptiste Daroussin 		}
315*c76f0793SBaptiste Daroussin 
316*c76f0793SBaptiste Daroussin 		if (buttupdate) {
317*c76f0793SBaptiste Daroussin 			draw_buttons(widget, rows-2, cols, bs, true);
318*c76f0793SBaptiste Daroussin 			wrefresh(widget);
319*c76f0793SBaptiste Daroussin 			buttupdate = false;
320*c76f0793SBaptiste Daroussin 		}
321*c76f0793SBaptiste Daroussin 
322*c76f0793SBaptiste Daroussin 		input = getch();
323*c76f0793SBaptiste Daroussin 		if(input < 0) {
324*c76f0793SBaptiste Daroussin 			currvalue--;
325*c76f0793SBaptiste Daroussin 			if (currvalue < 0) {
326*c76f0793SBaptiste Daroussin 				output = BSDDIALOG_ERROR;
327*c76f0793SBaptiste Daroussin 				break;
328*c76f0793SBaptiste Daroussin 			}
329*c76f0793SBaptiste Daroussin 			else {
330*c76f0793SBaptiste Daroussin 				barupdate = true;
331*c76f0793SBaptiste Daroussin 				continue;
332*c76f0793SBaptiste Daroussin 			}
333*c76f0793SBaptiste Daroussin 		}
334*c76f0793SBaptiste Daroussin 		switch(input) {
335*c76f0793SBaptiste Daroussin 		case 10: // Enter
336*c76f0793SBaptiste Daroussin 			output = bs.value[bs.curr]; // values -> outputs
337*c76f0793SBaptiste Daroussin 			loop = false;
338*c76f0793SBaptiste Daroussin 			break;
339*c76f0793SBaptiste Daroussin 		case 27: /* Esc */
340*c76f0793SBaptiste Daroussin 			output = BSDDIALOG_ESC;
341*c76f0793SBaptiste Daroussin 			loop = false;
342*c76f0793SBaptiste Daroussin 			break;
343*c76f0793SBaptiste Daroussin 		case '\t': // TAB
344*c76f0793SBaptiste Daroussin 			bs.curr = (bs.curr + 1) % bs.nbuttons;
345*c76f0793SBaptiste Daroussin 			buttupdate = true;
346*c76f0793SBaptiste Daroussin 			break;
347*c76f0793SBaptiste Daroussin 		case KEY_LEFT:
348*c76f0793SBaptiste Daroussin 			if (bs.curr > 0) {
349*c76f0793SBaptiste Daroussin 				bs.curr--;
350*c76f0793SBaptiste Daroussin 				buttupdate = true;
351*c76f0793SBaptiste Daroussin 			}
352*c76f0793SBaptiste Daroussin 			break;
353*c76f0793SBaptiste Daroussin 		case KEY_RIGHT:
354*c76f0793SBaptiste Daroussin 			if (bs.curr < (int) bs.nbuttons - 1) {
355*c76f0793SBaptiste Daroussin 				bs.curr++;
356*c76f0793SBaptiste Daroussin 				buttupdate = true;
357*c76f0793SBaptiste Daroussin 			}
358*c76f0793SBaptiste Daroussin 			break;
359*c76f0793SBaptiste Daroussin 		}
360*c76f0793SBaptiste Daroussin 	}
361*c76f0793SBaptiste Daroussin 
362*c76f0793SBaptiste Daroussin 	nodelay(stdscr, FALSE);
363*c76f0793SBaptiste Daroussin 
364*c76f0793SBaptiste Daroussin 	delwin(bar);
365*c76f0793SBaptiste Daroussin 	end_widget(conf, widget, rows, cols, shadow);
366*c76f0793SBaptiste Daroussin 
367*c76f0793SBaptiste Daroussin 	return output;
368*c76f0793SBaptiste Daroussin }
369*c76f0793SBaptiste Daroussin 
370