xref: /freebsd/contrib/bsddialog/lib/slider.c (revision f2d966f6c13d93cccceb8e594a69d1a50471d314)
1*f2d966f6SAlfonso S. Siciliano /*-
2*f2d966f6SAlfonso S. Siciliano  * SPDX-License-Identifier: BSD-2-Clause
3*f2d966f6SAlfonso S. Siciliano  *
4*f2d966f6SAlfonso S. Siciliano  * Copyright (c) 2025 Braulio Rivas
5*f2d966f6SAlfonso S. Siciliano  *
6*f2d966f6SAlfonso S. Siciliano  * Redistribution and use in source and binary forms, with or without
7*f2d966f6SAlfonso S. Siciliano  * modification, are permitted provided that the following conditions
8*f2d966f6SAlfonso S. Siciliano  * are met:
9*f2d966f6SAlfonso S. Siciliano  * 1. Redistributions of source code must retain the above copyright
10*f2d966f6SAlfonso S. Siciliano  *    notice, this list of conditions and the following disclaimer.
11*f2d966f6SAlfonso S. Siciliano  * 2. Redistributions in binary form must reproduce the above copyright
12*f2d966f6SAlfonso S. Siciliano  *    notice, this list of conditions and the following disclaimer in the
13*f2d966f6SAlfonso S. Siciliano  *    documentation and/or other materials provided with the distribution.
14*f2d966f6SAlfonso S. Siciliano  *
15*f2d966f6SAlfonso S. Siciliano  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*f2d966f6SAlfonso S. Siciliano  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*f2d966f6SAlfonso S. Siciliano  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*f2d966f6SAlfonso S. Siciliano  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*f2d966f6SAlfonso S. Siciliano  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*f2d966f6SAlfonso S. Siciliano  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*f2d966f6SAlfonso S. Siciliano  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*f2d966f6SAlfonso S. Siciliano  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*f2d966f6SAlfonso S. Siciliano  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*f2d966f6SAlfonso S. Siciliano  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*f2d966f6SAlfonso S. Siciliano  * SUCH DAMAGE.
26*f2d966f6SAlfonso S. Siciliano  */
27*f2d966f6SAlfonso S. Siciliano 
28*f2d966f6SAlfonso S. Siciliano #include <curses.h>
29*f2d966f6SAlfonso S. Siciliano #include <stdlib.h>
30*f2d966f6SAlfonso S. Siciliano #include <string.h>
31*f2d966f6SAlfonso S. Siciliano 
32*f2d966f6SAlfonso S. Siciliano #include "bsddialog.h"
33*f2d966f6SAlfonso S. Siciliano #include "bsddialog_theme.h"
34*f2d966f6SAlfonso S. Siciliano #include "lib_util.h"
35*f2d966f6SAlfonso S. Siciliano 
36*f2d966f6SAlfonso S. Siciliano #define MINHSLIDER 13
37*f2d966f6SAlfonso S. Siciliano #define MINWSLIDER 36
38*f2d966f6SAlfonso S. Siciliano 
39*f2d966f6SAlfonso S. Siciliano #define NULLWIN -1
40*f2d966f6SAlfonso S. Siciliano #define START_WIN 0
41*f2d966f6SAlfonso S. Siciliano #define END_WIN 1
42*f2d966f6SAlfonso S. Siciliano #define STEP_WIN 2
43*f2d966f6SAlfonso S. Siciliano #define SLIDER_WIN 3
44*f2d966f6SAlfonso S. Siciliano #define NWIN 4
45*f2d966f6SAlfonso S. Siciliano 
46*f2d966f6SAlfonso S. Siciliano enum operation {
47*f2d966f6SAlfonso S. Siciliano 	MOVERIGHT,
48*f2d966f6SAlfonso S. Siciliano 	MOVEFARRIGHT,
49*f2d966f6SAlfonso S. Siciliano 	MOVEFASTRIGHT,
50*f2d966f6SAlfonso S. Siciliano 	MOVELEFT,
51*f2d966f6SAlfonso S. Siciliano 	MOVEFARLEFT,
52*f2d966f6SAlfonso S. Siciliano 	MOVEFASTLEFT,
53*f2d966f6SAlfonso S. Siciliano 	INCREASELEFT,
54*f2d966f6SAlfonso S. Siciliano 	DECREASELEFT,
55*f2d966f6SAlfonso S. Siciliano 	INCREASERIGHT,
56*f2d966f6SAlfonso S. Siciliano 	DECREASERIGHT,
57*f2d966f6SAlfonso S. Siciliano 	INCREASESTEP,
58*f2d966f6SAlfonso S. Siciliano 	DECREASESTEP,
59*f2d966f6SAlfonso S. Siciliano };
60*f2d966f6SAlfonso S. Siciliano 
61*f2d966f6SAlfonso S. Siciliano struct sliderctl {
62*f2d966f6SAlfonso S. Siciliano 	enum operation op;
63*f2d966f6SAlfonso S. Siciliano 	unsigned long (*spaces)[2];
64*f2d966f6SAlfonso S. Siciliano 	int nspaces; /* api unsigned, but segfault handlesliderctl():MOVELEFT */
65*f2d966f6SAlfonso S. Siciliano 	unsigned long length;
66*f2d966f6SAlfonso S. Siciliano 	unsigned long *start;
67*f2d966f6SAlfonso S. Siciliano 	unsigned long *end;
68*f2d966f6SAlfonso S. Siciliano 	unsigned long step;
69*f2d966f6SAlfonso S. Siciliano };
70*f2d966f6SAlfonso S. Siciliano 
crashes(long x,long y,long a,long b)71*f2d966f6SAlfonso S. Siciliano static int crashes(long x, long y, long a, long b)
72*f2d966f6SAlfonso S. Siciliano {
73*f2d966f6SAlfonso S. Siciliano 	return ((x <= a && a <= y) || (x <= b && b <= y));
74*f2d966f6SAlfonso S. Siciliano }
75*f2d966f6SAlfonso S. Siciliano 
fits(long x,long y,long a,long b)76*f2d966f6SAlfonso S. Siciliano static int fits(long x, long y, long a, long b)
77*f2d966f6SAlfonso S. Siciliano {
78*f2d966f6SAlfonso S. Siciliano 	return ((x <= a) && (b <= y));
79*f2d966f6SAlfonso S. Siciliano }
80*f2d966f6SAlfonso S. Siciliano 
handlesliderctl(struct sliderctl * sliderctl)81*f2d966f6SAlfonso S. Siciliano static void handlesliderctl(struct sliderctl *sliderctl)
82*f2d966f6SAlfonso S. Siciliano {
83*f2d966f6SAlfonso S. Siciliano 	int i, step, tmpstep;
84*f2d966f6SAlfonso S. Siciliano 	unsigned long x, y, size, old_start, old_end;
85*f2d966f6SAlfonso S. Siciliano 	signed long new_start, new_end;
86*f2d966f6SAlfonso S. Siciliano 
87*f2d966f6SAlfonso S. Siciliano 	step = sliderctl->step;
88*f2d966f6SAlfonso S. Siciliano 	old_start = *(sliderctl->start);
89*f2d966f6SAlfonso S. Siciliano 	new_start = old_start;
90*f2d966f6SAlfonso S. Siciliano 	old_end = *(sliderctl->end);
91*f2d966f6SAlfonso S. Siciliano 	new_end = old_end;
92*f2d966f6SAlfonso S. Siciliano 	size = old_end - old_start + 1;
93*f2d966f6SAlfonso S. Siciliano 
94*f2d966f6SAlfonso S. Siciliano 	switch (sliderctl->op) {
95*f2d966f6SAlfonso S. Siciliano 	case MOVERIGHT:
96*f2d966f6SAlfonso S. Siciliano 		new_start = old_start + step;
97*f2d966f6SAlfonso S. Siciliano 		new_end = old_end + step;
98*f2d966f6SAlfonso S. Siciliano 
99*f2d966f6SAlfonso S. Siciliano 		for (i = 0; i < sliderctl->nspaces; i++) {
100*f2d966f6SAlfonso S. Siciliano 			x = (sliderctl->spaces)[i][0];
101*f2d966f6SAlfonso S. Siciliano 			y = (sliderctl->spaces)[i][1];
102*f2d966f6SAlfonso S. Siciliano 
103*f2d966f6SAlfonso S. Siciliano 			if (crashes(x, y, new_start, new_end)) {
104*f2d966f6SAlfonso S. Siciliano 				new_start = y + 1;
105*f2d966f6SAlfonso S. Siciliano 				new_end = new_start + size - 1;
106*f2d966f6SAlfonso S. Siciliano 				break;
107*f2d966f6SAlfonso S. Siciliano 			}
108*f2d966f6SAlfonso S. Siciliano 		}
109*f2d966f6SAlfonso S. Siciliano 		break;
110*f2d966f6SAlfonso S. Siciliano 	case MOVELEFT:
111*f2d966f6SAlfonso S. Siciliano 		new_start = old_start - step;
112*f2d966f6SAlfonso S. Siciliano 		new_end = old_end - step;
113*f2d966f6SAlfonso S. Siciliano 
114*f2d966f6SAlfonso S. Siciliano 		for (i = sliderctl->nspaces - 1; i >= 0; i--) {
115*f2d966f6SAlfonso S. Siciliano 			x = (sliderctl->spaces)[i][0];
116*f2d966f6SAlfonso S. Siciliano 			y = (sliderctl->spaces)[i][1];
117*f2d966f6SAlfonso S. Siciliano 
118*f2d966f6SAlfonso S. Siciliano 			if (crashes(x, y, new_start, new_end)) {
119*f2d966f6SAlfonso S. Siciliano 				new_end = x - 1;
120*f2d966f6SAlfonso S. Siciliano 				new_start = new_end - size + 1;
121*f2d966f6SAlfonso S. Siciliano 				break;
122*f2d966f6SAlfonso S. Siciliano 			}
123*f2d966f6SAlfonso S. Siciliano 		}
124*f2d966f6SAlfonso S. Siciliano 		break;
125*f2d966f6SAlfonso S. Siciliano 	case INCREASELEFT:
126*f2d966f6SAlfonso S. Siciliano 		new_start = old_start + step;
127*f2d966f6SAlfonso S. Siciliano 		break;
128*f2d966f6SAlfonso S. Siciliano 	case DECREASELEFT:
129*f2d966f6SAlfonso S. Siciliano 		new_start = old_start - step;
130*f2d966f6SAlfonso S. Siciliano 		for (i = 0; i < sliderctl->nspaces; i++) {
131*f2d966f6SAlfonso S. Siciliano 			x = (sliderctl->spaces)[i][0];
132*f2d966f6SAlfonso S. Siciliano 			y = (sliderctl->spaces)[i][1];
133*f2d966f6SAlfonso S. Siciliano 
134*f2d966f6SAlfonso S. Siciliano 			if (crashes(x, y, new_start, new_end)) {
135*f2d966f6SAlfonso S. Siciliano 				new_start = old_start;
136*f2d966f6SAlfonso S. Siciliano 				break;
137*f2d966f6SAlfonso S. Siciliano 			}
138*f2d966f6SAlfonso S. Siciliano 		}
139*f2d966f6SAlfonso S. Siciliano 		break;
140*f2d966f6SAlfonso S. Siciliano 	case INCREASERIGHT:
141*f2d966f6SAlfonso S. Siciliano 		new_end = old_end + step;
142*f2d966f6SAlfonso S. Siciliano 		for (i = 0; i < sliderctl->nspaces; i++) {
143*f2d966f6SAlfonso S. Siciliano 			x = (sliderctl->spaces)[i][0];
144*f2d966f6SAlfonso S. Siciliano 			y = (sliderctl->spaces)[i][1];
145*f2d966f6SAlfonso S. Siciliano 
146*f2d966f6SAlfonso S. Siciliano 			if (crashes(x, y, new_start, new_end)) {
147*f2d966f6SAlfonso S. Siciliano 				new_end = old_end;
148*f2d966f6SAlfonso S. Siciliano 				break;
149*f2d966f6SAlfonso S. Siciliano 			}
150*f2d966f6SAlfonso S. Siciliano 		}
151*f2d966f6SAlfonso S. Siciliano 		break;
152*f2d966f6SAlfonso S. Siciliano 	case DECREASERIGHT:
153*f2d966f6SAlfonso S. Siciliano 		new_end = old_end - step;
154*f2d966f6SAlfonso S. Siciliano 		break;
155*f2d966f6SAlfonso S. Siciliano 	case MOVEFARLEFT:
156*f2d966f6SAlfonso S. Siciliano 		new_start = 0;
157*f2d966f6SAlfonso S. Siciliano 		new_end = size - 1;
158*f2d966f6SAlfonso S. Siciliano 		for (i = 0; i < sliderctl->nspaces; i++) {
159*f2d966f6SAlfonso S. Siciliano 			x = (sliderctl->spaces)[i][0];
160*f2d966f6SAlfonso S. Siciliano 			y = (sliderctl->spaces)[i][1];
161*f2d966f6SAlfonso S. Siciliano 
162*f2d966f6SAlfonso S. Siciliano 			if (crashes(x, y, new_start, new_end)) {
163*f2d966f6SAlfonso S. Siciliano 				new_start = y + 1;
164*f2d966f6SAlfonso S. Siciliano 				new_end = new_start + size - 1;
165*f2d966f6SAlfonso S. Siciliano 				break;
166*f2d966f6SAlfonso S. Siciliano 			}
167*f2d966f6SAlfonso S. Siciliano 		}
168*f2d966f6SAlfonso S. Siciliano 		break;
169*f2d966f6SAlfonso S. Siciliano 	case MOVEFARRIGHT:
170*f2d966f6SAlfonso S. Siciliano 		new_end = (sliderctl->length) - 1;
171*f2d966f6SAlfonso S. Siciliano 		new_start = new_end - size + 1;
172*f2d966f6SAlfonso S. Siciliano 		for (i = sliderctl->nspaces - 1; i >= 0; i--) {
173*f2d966f6SAlfonso S. Siciliano 			x = (sliderctl->spaces)[i][0];
174*f2d966f6SAlfonso S. Siciliano 			y = (sliderctl->spaces)[i][1];
175*f2d966f6SAlfonso S. Siciliano 
176*f2d966f6SAlfonso S. Siciliano 			if (crashes(x, y, new_start, new_end)) {
177*f2d966f6SAlfonso S. Siciliano 				new_end = x - 1;
178*f2d966f6SAlfonso S. Siciliano 				new_start = new_end - size + 1;
179*f2d966f6SAlfonso S. Siciliano 				break;
180*f2d966f6SAlfonso S. Siciliano 			}
181*f2d966f6SAlfonso S. Siciliano 		}
182*f2d966f6SAlfonso S. Siciliano 		break;
183*f2d966f6SAlfonso S. Siciliano 	case MOVEFASTLEFT:
184*f2d966f6SAlfonso S. Siciliano 		if (size < 10) {
185*f2d966f6SAlfonso S. Siciliano 			tmpstep = 1;
186*f2d966f6SAlfonso S. Siciliano 		} else {
187*f2d966f6SAlfonso S. Siciliano 			tmpstep = ((sliderctl->length) * 10) / 100;
188*f2d966f6SAlfonso S. Siciliano 		}
189*f2d966f6SAlfonso S. Siciliano 		new_start = old_start - tmpstep;
190*f2d966f6SAlfonso S. Siciliano 		new_end = old_end - tmpstep;
191*f2d966f6SAlfonso S. Siciliano 
192*f2d966f6SAlfonso S. Siciliano 		for (i = sliderctl->nspaces - 1; i >= 0; i--) {
193*f2d966f6SAlfonso S. Siciliano 			x = (sliderctl->spaces)[i][0];
194*f2d966f6SAlfonso S. Siciliano 			y = (sliderctl->spaces)[i][1];
195*f2d966f6SAlfonso S. Siciliano 
196*f2d966f6SAlfonso S. Siciliano 			if (crashes(x, y, new_start, new_end)) {
197*f2d966f6SAlfonso S. Siciliano 				new_end = x - 1;
198*f2d966f6SAlfonso S. Siciliano 				new_start = new_end - size + 1;
199*f2d966f6SAlfonso S. Siciliano 				break;
200*f2d966f6SAlfonso S. Siciliano 			}
201*f2d966f6SAlfonso S. Siciliano 		}
202*f2d966f6SAlfonso S. Siciliano 		break;
203*f2d966f6SAlfonso S. Siciliano 	case MOVEFASTRIGHT:
204*f2d966f6SAlfonso S. Siciliano 		if (size < 10) {
205*f2d966f6SAlfonso S. Siciliano 			tmpstep = 1;
206*f2d966f6SAlfonso S. Siciliano 		} else {
207*f2d966f6SAlfonso S. Siciliano 			tmpstep = ((sliderctl->length) * 10) / 100;
208*f2d966f6SAlfonso S. Siciliano 		}
209*f2d966f6SAlfonso S. Siciliano 		new_start = old_start + tmpstep;
210*f2d966f6SAlfonso S. Siciliano 		new_end = old_end + tmpstep;
211*f2d966f6SAlfonso S. Siciliano 
212*f2d966f6SAlfonso S. Siciliano 		for (i = 0; i < sliderctl->nspaces; i++) {
213*f2d966f6SAlfonso S. Siciliano 			x = (sliderctl->spaces)[i][0];
214*f2d966f6SAlfonso S. Siciliano 			y = (sliderctl->spaces)[i][1];
215*f2d966f6SAlfonso S. Siciliano 
216*f2d966f6SAlfonso S. Siciliano 			if (crashes(x, y, new_start, new_end)) {
217*f2d966f6SAlfonso S. Siciliano 				new_start = y + 1;
218*f2d966f6SAlfonso S. Siciliano 				new_end = new_start + size - 1;
219*f2d966f6SAlfonso S. Siciliano 				break;
220*f2d966f6SAlfonso S. Siciliano 			}
221*f2d966f6SAlfonso S. Siciliano 		}
222*f2d966f6SAlfonso S. Siciliano 		break;
223*f2d966f6SAlfonso S. Siciliano 	case INCREASESTEP:
224*f2d966f6SAlfonso S. Siciliano 		++step;
225*f2d966f6SAlfonso S. Siciliano 		break;
226*f2d966f6SAlfonso S. Siciliano 	case DECREASESTEP:
227*f2d966f6SAlfonso S. Siciliano 		if (step > 1) {
228*f2d966f6SAlfonso S. Siciliano 			--step;
229*f2d966f6SAlfonso S. Siciliano 		}
230*f2d966f6SAlfonso S. Siciliano 		break;
231*f2d966f6SAlfonso S. Siciliano 	}
232*f2d966f6SAlfonso S. Siciliano 
233*f2d966f6SAlfonso S. Siciliano 	if (fits(0, (sliderctl->length) - 1, new_start, new_end) != 1) {
234*f2d966f6SAlfonso S. Siciliano 		new_start = old_start;
235*f2d966f6SAlfonso S. Siciliano 		new_end = old_end;
236*f2d966f6SAlfonso S. Siciliano 	}
237*f2d966f6SAlfonso S. Siciliano 
238*f2d966f6SAlfonso S. Siciliano 	if (new_start > new_end) {
239*f2d966f6SAlfonso S. Siciliano 		new_start = old_start;
240*f2d966f6SAlfonso S. Siciliano 		new_end = old_end;
241*f2d966f6SAlfonso S. Siciliano 	}
242*f2d966f6SAlfonso S. Siciliano 
243*f2d966f6SAlfonso S. Siciliano 	sliderctl->step = step;
244*f2d966f6SAlfonso S. Siciliano 
245*f2d966f6SAlfonso S. Siciliano 	*(sliderctl->start) = new_start;
246*f2d966f6SAlfonso S. Siciliano 	*(sliderctl->end) = new_end;
247*f2d966f6SAlfonso S. Siciliano }
248*f2d966f6SAlfonso S. Siciliano 
249*f2d966f6SAlfonso S. Siciliano static void
drawsquare(struct bsddialog_conf * conf,WINDOW * win,enum elevation elev,bool focus,const char * fmt,unsigned long value)250*f2d966f6SAlfonso S. Siciliano drawsquare(struct bsddialog_conf *conf, WINDOW *win, enum elevation elev,
251*f2d966f6SAlfonso S. Siciliano     bool focus, const char *fmt, unsigned long value)
252*f2d966f6SAlfonso S. Siciliano {
253*f2d966f6SAlfonso S. Siciliano 	int h, l, w;
254*f2d966f6SAlfonso S. Siciliano 
255*f2d966f6SAlfonso S. Siciliano 	getmaxyx(win, h, w);
256*f2d966f6SAlfonso S. Siciliano 	draw_borders(conf, win, elev);
257*f2d966f6SAlfonso S. Siciliano 	if (focus) {
258*f2d966f6SAlfonso S. Siciliano 		l = 2 + w % 2;
259*f2d966f6SAlfonso S. Siciliano 		wattron(win, t.dialog.arrowcolor);
260*f2d966f6SAlfonso S. Siciliano 		mvwhline(win, 0, w / 2 - l / 2, UARROW(conf), l);
261*f2d966f6SAlfonso S. Siciliano 		mvwhline(win, h - 1, w / 2 - l / 2, DARROW(conf), l);
262*f2d966f6SAlfonso S. Siciliano 		wattroff(win, t.dialog.arrowcolor);
263*f2d966f6SAlfonso S. Siciliano 	}
264*f2d966f6SAlfonso S. Siciliano 
265*f2d966f6SAlfonso S. Siciliano 	if (focus)
266*f2d966f6SAlfonso S. Siciliano 		wattron(win, t.menu.f_namecolor);
267*f2d966f6SAlfonso S. Siciliano 
268*f2d966f6SAlfonso S. Siciliano 	mvwprintw(win, 1, 1, fmt, value);
269*f2d966f6SAlfonso S. Siciliano 
270*f2d966f6SAlfonso S. Siciliano 	if (focus)
271*f2d966f6SAlfonso S. Siciliano 		wattroff(win, t.menu.f_namecolor);
272*f2d966f6SAlfonso S. Siciliano 
273*f2d966f6SAlfonso S. Siciliano 	wnoutrefresh(win);
274*f2d966f6SAlfonso S. Siciliano }
275*f2d966f6SAlfonso S. Siciliano 
276*f2d966f6SAlfonso S. Siciliano static void
print_slider(struct bsddialog_conf * conf,WINDOW * win,unsigned long spaces[][2],int nspaces,unsigned long length,unsigned long * start,unsigned long * end,bool active)277*f2d966f6SAlfonso S. Siciliano print_slider(struct bsddialog_conf *conf, WINDOW *win,
278*f2d966f6SAlfonso S. Siciliano     unsigned long spaces[][2], int nspaces, unsigned long length,
279*f2d966f6SAlfonso S. Siciliano     unsigned long *start, unsigned long *end, bool active)
280*f2d966f6SAlfonso S. Siciliano {
281*f2d966f6SAlfonso S. Siciliano 	int i, y, x, l, height, width;
282*f2d966f6SAlfonso S. Siciliano 	unsigned long s, e;
283*f2d966f6SAlfonso S. Siciliano 	chtype ch;
284*f2d966f6SAlfonso S. Siciliano 
285*f2d966f6SAlfonso S. Siciliano 	getmaxyx(win, height, width);
286*f2d966f6SAlfonso S. Siciliano 	wclear(win);
287*f2d966f6SAlfonso S. Siciliano 	draw_borders(conf, win, RAISED);
288*f2d966f6SAlfonso S. Siciliano 
289*f2d966f6SAlfonso S. Siciliano 	if (active) {
290*f2d966f6SAlfonso S. Siciliano 		wattron(win, t.dialog.arrowcolor);
291*f2d966f6SAlfonso S. Siciliano 		mvwvline(win, 1, 0, LARROW(conf), 1);
292*f2d966f6SAlfonso S. Siciliano 		mvwvline(win, 1, width - 1, RARROW(conf), 1);
293*f2d966f6SAlfonso S. Siciliano 		wattroff(win, t.dialog.arrowcolor);
294*f2d966f6SAlfonso S. Siciliano 	}
295*f2d966f6SAlfonso S. Siciliano 
296*f2d966f6SAlfonso S. Siciliano 	y = height / 2;
297*f2d966f6SAlfonso S. Siciliano 	width -= 1;
298*f2d966f6SAlfonso S. Siciliano 
299*f2d966f6SAlfonso S. Siciliano 	ch = ' ' | bsddialog_color(BSDDIALOG_RED, BSDDIALOG_RED, 0);
300*f2d966f6SAlfonso S. Siciliano 	for (i = 0; i < nspaces; i++) {
301*f2d966f6SAlfonso S. Siciliano 		s = spaces[i][0];
302*f2d966f6SAlfonso S. Siciliano 		e = spaces[i][1];
303*f2d966f6SAlfonso S. Siciliano 
304*f2d966f6SAlfonso S. Siciliano 		x = (s * width) / length;
305*f2d966f6SAlfonso S. Siciliano 		l = ((e - s) * width) / length;
306*f2d966f6SAlfonso S. Siciliano 
307*f2d966f6SAlfonso S. Siciliano 		if ((e - s) == 0) {
308*f2d966f6SAlfonso S. Siciliano 			l = 0;
309*f2d966f6SAlfonso S. Siciliano 		} else if (l == 0) {
310*f2d966f6SAlfonso S. Siciliano 			l = 1;
311*f2d966f6SAlfonso S. Siciliano 		}
312*f2d966f6SAlfonso S. Siciliano 
313*f2d966f6SAlfonso S. Siciliano 		mvwhline(win, y, x + 1, ch, l);
314*f2d966f6SAlfonso S. Siciliano 	}
315*f2d966f6SAlfonso S. Siciliano 
316*f2d966f6SAlfonso S. Siciliano 	ch = ' ' | t.bar.f_color;
317*f2d966f6SAlfonso S. Siciliano 	s = ((*start) * width) / length;
318*f2d966f6SAlfonso S. Siciliano 	l = (((*end) - (*start)) * width) / length;
319*f2d966f6SAlfonso S. Siciliano 	if ((*end - *start) == 0) {
320*f2d966f6SAlfonso S. Siciliano 		l = 0;
321*f2d966f6SAlfonso S. Siciliano 	} else if (l == 0) {
322*f2d966f6SAlfonso S. Siciliano 		l = 1;
323*f2d966f6SAlfonso S. Siciliano 	}
324*f2d966f6SAlfonso S. Siciliano 	mvwhline(win, y, s + 1, ch, l);
325*f2d966f6SAlfonso S. Siciliano 
326*f2d966f6SAlfonso S. Siciliano 	wnoutrefresh(win);
327*f2d966f6SAlfonso S. Siciliano }
328*f2d966f6SAlfonso S. Siciliano 
329*f2d966f6SAlfonso S. Siciliano static int
slider_draw(struct dialog * d,bool redraw,WINDOW * start_win,WINDOW * end_win,WINDOW * size_win,WINDOW * step_win,WINDOW * slider_win,const char * unit)330*f2d966f6SAlfonso S. Siciliano slider_draw(struct dialog *d, bool redraw, WINDOW *start_win, WINDOW *end_win,
331*f2d966f6SAlfonso S. Siciliano     WINDOW *size_win, WINDOW *step_win, WINDOW *slider_win, const char *unit)
332*f2d966f6SAlfonso S. Siciliano {
333*f2d966f6SAlfonso S. Siciliano 	char *buf;
334*f2d966f6SAlfonso S. Siciliano 	int yslider, xslider;
335*f2d966f6SAlfonso S. Siciliano 
336*f2d966f6SAlfonso S. Siciliano 	if (redraw) {
337*f2d966f6SAlfonso S. Siciliano 		hide_dialog(d);
338*f2d966f6SAlfonso S. Siciliano 		refresh(); /* Important for decreasing screen */
339*f2d966f6SAlfonso S. Siciliano 	}
340*f2d966f6SAlfonso S. Siciliano 	if (dialog_size_position(d, MINHSLIDER, MINWSLIDER, NULL) != 0)
341*f2d966f6SAlfonso S. Siciliano 		return (BSDDIALOG_ERROR);
342*f2d966f6SAlfonso S. Siciliano 	if (draw_dialog(d) != 0) /* doupdate in main loop */
343*f2d966f6SAlfonso S. Siciliano 		return (BSDDIALOG_ERROR);
344*f2d966f6SAlfonso S. Siciliano 	if (redraw)
345*f2d966f6SAlfonso S. Siciliano 		refresh(); /* Important to fix grey lines expanding screen */
346*f2d966f6SAlfonso S. Siciliano 	TEXTPAD(d, MINHSLIDER + HBUTTONS);
347*f2d966f6SAlfonso S. Siciliano 
348*f2d966f6SAlfonso S. Siciliano 	yslider = d->y + d->h - 15;
349*f2d966f6SAlfonso S. Siciliano 	xslider = d->x + d->w / 2 - 17;
350*f2d966f6SAlfonso S. Siciliano 	asprintf(&buf, "Start (%s)", unit);
351*f2d966f6SAlfonso S. Siciliano 	mvwaddstr(d->widget, d->h - 16, d->w / 2 - 17, buf);
352*f2d966f6SAlfonso S. Siciliano 	free(buf);
353*f2d966f6SAlfonso S. Siciliano 	update_box(d->conf, start_win, yslider, xslider, 3, 17, RAISED);
354*f2d966f6SAlfonso S. Siciliano 	asprintf(&buf, "End (%s)", unit);
355*f2d966f6SAlfonso S. Siciliano 	mvwaddstr(d->widget, d->h - 16, d->w / 2, buf);
356*f2d966f6SAlfonso S. Siciliano 	free(buf);
357*f2d966f6SAlfonso S. Siciliano 	update_box(d->conf, end_win, yslider, xslider + 17, 3, 17, RAISED);
358*f2d966f6SAlfonso S. Siciliano 	asprintf(&buf, "Size (%s)", unit);
359*f2d966f6SAlfonso S. Siciliano 	mvwaddstr(d->widget, d->h - 12, d->w / 2 - 17, buf);
360*f2d966f6SAlfonso S. Siciliano 	free(buf);
361*f2d966f6SAlfonso S. Siciliano 	update_box(d->conf, size_win, yslider + 4, xslider, 3, 17, RAISED);
362*f2d966f6SAlfonso S. Siciliano 	asprintf(&buf, "Step (%s)", unit);
363*f2d966f6SAlfonso S. Siciliano 	mvwaddstr(d->widget, d->h - 12, d->w / 2, buf);
364*f2d966f6SAlfonso S. Siciliano 	free(buf);
365*f2d966f6SAlfonso S. Siciliano 	update_box(d->conf, step_win, yslider + 4, xslider + 17, 3, 17, RAISED);
366*f2d966f6SAlfonso S. Siciliano 
367*f2d966f6SAlfonso S. Siciliano 	update_box(d->conf, slider_win, yslider + 7, xslider, 3, 34, RAISED);
368*f2d966f6SAlfonso S. Siciliano 	wnoutrefresh(d->widget);
369*f2d966f6SAlfonso S. Siciliano 
370*f2d966f6SAlfonso S. Siciliano 	return (0);
371*f2d966f6SAlfonso S. Siciliano }
372*f2d966f6SAlfonso S. Siciliano 
373*f2d966f6SAlfonso S. Siciliano /* API */
374*f2d966f6SAlfonso S. Siciliano int
bsddialog_slider(struct bsddialog_conf * conf,const char * text,int rows,int cols,const char * unit,unsigned long length,unsigned long * start,unsigned long * end,bool resize,unsigned int nblocks,unsigned long blocks[][2])375*f2d966f6SAlfonso S. Siciliano bsddialog_slider(struct bsddialog_conf *conf, const char *text, int rows,
376*f2d966f6SAlfonso S. Siciliano     int cols, const char *unit, unsigned long length, unsigned long *start,
377*f2d966f6SAlfonso S. Siciliano     unsigned long *end, bool resize, unsigned int nblocks,
378*f2d966f6SAlfonso S. Siciliano     unsigned long blocks[][2])
379*f2d966f6SAlfonso S. Siciliano {
380*f2d966f6SAlfonso S. Siciliano 	struct sliderctl ctl;
381*f2d966f6SAlfonso S. Siciliano 	bool loop, focusbuttons;
382*f2d966f6SAlfonso S. Siciliano 	int retval, sel;
383*f2d966f6SAlfonso S. Siciliano 	wint_t input;
384*f2d966f6SAlfonso S. Siciliano 	unsigned long size;
385*f2d966f6SAlfonso S. Siciliano 	WINDOW *start_win, *end_win, *size_win, *step_win, *slider_win;
386*f2d966f6SAlfonso S. Siciliano 	struct dialog dialog;
387*f2d966f6SAlfonso S. Siciliano 
388*f2d966f6SAlfonso S. Siciliano 	CHECK_PTR(start);
389*f2d966f6SAlfonso S. Siciliano 	CHECK_PTR(end);
390*f2d966f6SAlfonso S. Siciliano 
391*f2d966f6SAlfonso S. Siciliano 	ctl.spaces = blocks;
392*f2d966f6SAlfonso S. Siciliano 	ctl.nspaces = nblocks;
393*f2d966f6SAlfonso S. Siciliano 	ctl.length = length;
394*f2d966f6SAlfonso S. Siciliano 	ctl.start = start;
395*f2d966f6SAlfonso S. Siciliano 	ctl.end = end;
396*f2d966f6SAlfonso S. Siciliano 	ctl.step = 1;
397*f2d966f6SAlfonso S. Siciliano 
398*f2d966f6SAlfonso S. Siciliano 	if (prepare_dialog(conf, text, rows, cols, &dialog) != 0)
399*f2d966f6SAlfonso S. Siciliano 		return (BSDDIALOG_ERROR);
400*f2d966f6SAlfonso S. Siciliano 	set_buttons(&dialog, true, OK_LABEL, CANCEL_LABEL);
401*f2d966f6SAlfonso S. Siciliano 
402*f2d966f6SAlfonso S. Siciliano 	if ((start_win = newwin(1, 1, 1, 1)) == NULL)
403*f2d966f6SAlfonso S. Siciliano 		RETURN_ERROR("Cannot build WINDOW for start");
404*f2d966f6SAlfonso S. Siciliano 	wbkgd(start_win, t.dialog.color);
405*f2d966f6SAlfonso S. Siciliano 
406*f2d966f6SAlfonso S. Siciliano 	if ((end_win = newwin(1, 1, 1, 1)) == NULL)
407*f2d966f6SAlfonso S. Siciliano 		RETURN_ERROR("Cannot build WINDOW for end");
408*f2d966f6SAlfonso S. Siciliano 	wbkgd(end_win, t.dialog.color);
409*f2d966f6SAlfonso S. Siciliano 
410*f2d966f6SAlfonso S. Siciliano 	if ((step_win = newwin(1, 1, 1, 1)) == NULL)
411*f2d966f6SAlfonso S. Siciliano 		RETURN_ERROR("Cannot build WINDOW for step");
412*f2d966f6SAlfonso S. Siciliano 	wbkgd(step_win, t.dialog.color);
413*f2d966f6SAlfonso S. Siciliano 
414*f2d966f6SAlfonso S. Siciliano 	if ((size_win = newwin(1, 1, 1, 1)) == NULL)
415*f2d966f6SAlfonso S. Siciliano 		RETURN_ERROR("Cannot build WINDOW for size");
416*f2d966f6SAlfonso S. Siciliano 	wbkgd(size_win, t.dialog.color);
417*f2d966f6SAlfonso S. Siciliano 
418*f2d966f6SAlfonso S. Siciliano 	if ((slider_win = newwin(1, 1, 1, 1)) == NULL)
419*f2d966f6SAlfonso S. Siciliano 		RETURN_ERROR("Cannot build WINDOW for slider");
420*f2d966f6SAlfonso S. Siciliano 	wbkgd(slider_win, t.dialog.color);
421*f2d966f6SAlfonso S. Siciliano 
422*f2d966f6SAlfonso S. Siciliano 	if (slider_draw(&dialog, false, start_win, end_win, size_win, step_win,
423*f2d966f6SAlfonso S. Siciliano 	    slider_win, unit) != 0)
424*f2d966f6SAlfonso S. Siciliano 		return (BSDDIALOG_ERROR);
425*f2d966f6SAlfonso S. Siciliano 
426*f2d966f6SAlfonso S. Siciliano 	sel = NULLWIN;
427*f2d966f6SAlfonso S. Siciliano 	loop = focusbuttons = true;
428*f2d966f6SAlfonso S. Siciliano 	while (loop) {
429*f2d966f6SAlfonso S. Siciliano 		size = *(ctl.end) - *(ctl.start) + 1;
430*f2d966f6SAlfonso S. Siciliano 		drawsquare(conf, start_win, RAISED, sel == START_WIN, "%15lu", *start);
431*f2d966f6SAlfonso S. Siciliano 		drawsquare(conf, end_win, RAISED, sel == END_WIN, "%15lu", *end);
432*f2d966f6SAlfonso S. Siciliano 		drawsquare(conf, size_win, RAISED, 0, "%15lu", size);
433*f2d966f6SAlfonso S. Siciliano 		drawsquare(conf, step_win, RAISED, sel == STEP_WIN, "%15d", ctl.step);
434*f2d966f6SAlfonso S. Siciliano 		print_slider(conf, slider_win, blocks, nblocks, length, start,
435*f2d966f6SAlfonso S. Siciliano 		    end, sel == SLIDER_WIN);
436*f2d966f6SAlfonso S. Siciliano 		doupdate();
437*f2d966f6SAlfonso S. Siciliano 
438*f2d966f6SAlfonso S. Siciliano 		if (get_wch(&input) == ERR)
439*f2d966f6SAlfonso S. Siciliano 			continue;
440*f2d966f6SAlfonso S. Siciliano 		switch (input) {
441*f2d966f6SAlfonso S. Siciliano 		case KEY_ENTER:
442*f2d966f6SAlfonso S. Siciliano 		case 10: /* Enter */
443*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons || conf->button.always_active) {
444*f2d966f6SAlfonso S. Siciliano 				retval = BUTTONVALUE(dialog.bs);
445*f2d966f6SAlfonso S. Siciliano 				loop = false;
446*f2d966f6SAlfonso S. Siciliano 			}
447*f2d966f6SAlfonso S. Siciliano 			break;
448*f2d966f6SAlfonso S. Siciliano 		case 27: /* Esc */
449*f2d966f6SAlfonso S. Siciliano 			if (conf->key.enable_esc) {
450*f2d966f6SAlfonso S. Siciliano 				retval = BSDDIALOG_ESC;
451*f2d966f6SAlfonso S. Siciliano 				loop = false;
452*f2d966f6SAlfonso S. Siciliano 			}
453*f2d966f6SAlfonso S. Siciliano 			break;
454*f2d966f6SAlfonso S. Siciliano 		case '\t': /* TAB */
455*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
456*f2d966f6SAlfonso S. Siciliano 				dialog.bs.curr++;
457*f2d966f6SAlfonso S. Siciliano 				if (dialog.bs.curr >= (int)dialog.bs.nbuttons) {
458*f2d966f6SAlfonso S. Siciliano 					focusbuttons = false;
459*f2d966f6SAlfonso S. Siciliano 					sel = START_WIN;
460*f2d966f6SAlfonso S. Siciliano 					dialog.bs.curr =
461*f2d966f6SAlfonso S. Siciliano 					    conf->button.always_active ? 0 : -1;
462*f2d966f6SAlfonso S. Siciliano 				}
463*f2d966f6SAlfonso S. Siciliano 			} else {
464*f2d966f6SAlfonso S. Siciliano 				sel++;
465*f2d966f6SAlfonso S. Siciliano 				if ((sel + 1) > NWIN) {
466*f2d966f6SAlfonso S. Siciliano 					focusbuttons = true;
467*f2d966f6SAlfonso S. Siciliano 					sel = NULLWIN;
468*f2d966f6SAlfonso S. Siciliano 					dialog.bs.curr = 0;
469*f2d966f6SAlfonso S. Siciliano 				}
470*f2d966f6SAlfonso S. Siciliano 			}
471*f2d966f6SAlfonso S. Siciliano 			DRAW_BUTTONS(dialog);
472*f2d966f6SAlfonso S. Siciliano 			break;
473*f2d966f6SAlfonso S. Siciliano 		case KEY_CTRL('n'):
474*f2d966f6SAlfonso S. Siciliano 		case KEY_RIGHT:
475*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
476*f2d966f6SAlfonso S. Siciliano 				dialog.bs.curr++;
477*f2d966f6SAlfonso S. Siciliano 				if (dialog.bs.curr >= (int)dialog.bs.nbuttons) {
478*f2d966f6SAlfonso S. Siciliano 					focusbuttons = false;
479*f2d966f6SAlfonso S. Siciliano 					sel = START_WIN;
480*f2d966f6SAlfonso S. Siciliano 					dialog.bs.curr =
481*f2d966f6SAlfonso S. Siciliano 					    conf->button.always_active ? 0 : -1;
482*f2d966f6SAlfonso S. Siciliano 				}
483*f2d966f6SAlfonso S. Siciliano 			} else if (sel == SLIDER_WIN) {
484*f2d966f6SAlfonso S. Siciliano 				ctl.op = MOVERIGHT;
485*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
486*f2d966f6SAlfonso S. Siciliano 			} else {
487*f2d966f6SAlfonso S. Siciliano 				sel++;
488*f2d966f6SAlfonso S. Siciliano 			}
489*f2d966f6SAlfonso S. Siciliano 			DRAW_BUTTONS(dialog);
490*f2d966f6SAlfonso S. Siciliano 			break;
491*f2d966f6SAlfonso S. Siciliano 		case KEY_CTRL('p'):
492*f2d966f6SAlfonso S. Siciliano 		case KEY_LEFT:
493*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
494*f2d966f6SAlfonso S. Siciliano 				dialog.bs.curr--;
495*f2d966f6SAlfonso S. Siciliano 				if (dialog.bs.curr < 0) {
496*f2d966f6SAlfonso S. Siciliano 					focusbuttons = false;
497*f2d966f6SAlfonso S. Siciliano 					sel = SLIDER_WIN;
498*f2d966f6SAlfonso S. Siciliano 					dialog.bs.curr =
499*f2d966f6SAlfonso S. Siciliano 					    conf->button.always_active ? 0 : -1;
500*f2d966f6SAlfonso S. Siciliano 				}
501*f2d966f6SAlfonso S. Siciliano 			} else if (sel == SLIDER_WIN) {
502*f2d966f6SAlfonso S. Siciliano 				ctl.op = MOVELEFT;
503*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
504*f2d966f6SAlfonso S. Siciliano 			} else if (sel == END_WIN) {
505*f2d966f6SAlfonso S. Siciliano 				sel = START_WIN;
506*f2d966f6SAlfonso S. Siciliano 			} else {
507*f2d966f6SAlfonso S. Siciliano 				focusbuttons = true;
508*f2d966f6SAlfonso S. Siciliano 				sel = NULLWIN;
509*f2d966f6SAlfonso S. Siciliano 				dialog.bs.curr = 0;
510*f2d966f6SAlfonso S. Siciliano 			}
511*f2d966f6SAlfonso S. Siciliano 			DRAW_BUTTONS(dialog);
512*f2d966f6SAlfonso S. Siciliano 			break;
513*f2d966f6SAlfonso S. Siciliano 		case KEY_UP:
514*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
515*f2d966f6SAlfonso S. Siciliano 				sel = SLIDER_WIN;
516*f2d966f6SAlfonso S. Siciliano 				focusbuttons = false;
517*f2d966f6SAlfonso S. Siciliano 				dialog.bs.curr =
518*f2d966f6SAlfonso S. Siciliano 				     conf->button.always_active ? 0 : -1;
519*f2d966f6SAlfonso S. Siciliano 				DRAW_BUTTONS(dialog);
520*f2d966f6SAlfonso S. Siciliano 			} else if (sel == START_WIN) {
521*f2d966f6SAlfonso S. Siciliano 				if (resize) {
522*f2d966f6SAlfonso S. Siciliano 					ctl.op = INCREASELEFT;
523*f2d966f6SAlfonso S. Siciliano 				} else {
524*f2d966f6SAlfonso S. Siciliano 					ctl.op = MOVERIGHT;
525*f2d966f6SAlfonso S. Siciliano 				}
526*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
527*f2d966f6SAlfonso S. Siciliano 			} else if (sel == END_WIN) {
528*f2d966f6SAlfonso S. Siciliano 				if (resize) {
529*f2d966f6SAlfonso S. Siciliano 					ctl.op = INCREASERIGHT;
530*f2d966f6SAlfonso S. Siciliano 				} else {
531*f2d966f6SAlfonso S. Siciliano 					ctl.op = MOVERIGHT;
532*f2d966f6SAlfonso S. Siciliano 				}
533*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
534*f2d966f6SAlfonso S. Siciliano 			} else if (sel == STEP_WIN) {
535*f2d966f6SAlfonso S. Siciliano 				ctl.op = INCREASESTEP;
536*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
537*f2d966f6SAlfonso S. Siciliano 			}
538*f2d966f6SAlfonso S. Siciliano 			break;
539*f2d966f6SAlfonso S. Siciliano 		case KEY_DOWN:
540*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
541*f2d966f6SAlfonso S. Siciliano 				break;
542*f2d966f6SAlfonso S. Siciliano 			} else if (sel == START_WIN) {
543*f2d966f6SAlfonso S. Siciliano 				if (resize) {
544*f2d966f6SAlfonso S. Siciliano 					ctl.op = DECREASELEFT;
545*f2d966f6SAlfonso S. Siciliano 				} else {
546*f2d966f6SAlfonso S. Siciliano 					ctl.op = MOVELEFT;
547*f2d966f6SAlfonso S. Siciliano 				}
548*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
549*f2d966f6SAlfonso S. Siciliano 			} else if (sel == END_WIN) {
550*f2d966f6SAlfonso S. Siciliano 				if (resize) {
551*f2d966f6SAlfonso S. Siciliano 					ctl.op = DECREASERIGHT;
552*f2d966f6SAlfonso S. Siciliano 				} else {
553*f2d966f6SAlfonso S. Siciliano 					ctl.op = MOVELEFT;
554*f2d966f6SAlfonso S. Siciliano 				}
555*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
556*f2d966f6SAlfonso S. Siciliano 			} else if (sel == STEP_WIN) {
557*f2d966f6SAlfonso S. Siciliano 				ctl.op = DECREASESTEP;
558*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
559*f2d966f6SAlfonso S. Siciliano 			}
560*f2d966f6SAlfonso S. Siciliano 			break;
561*f2d966f6SAlfonso S. Siciliano 		case '-':
562*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
563*f2d966f6SAlfonso S. Siciliano 				break;
564*f2d966f6SAlfonso S. Siciliano 			} else if (sel == START_WIN) {
565*f2d966f6SAlfonso S. Siciliano 				if (resize) {
566*f2d966f6SAlfonso S. Siciliano 					ctl.op = DECREASELEFT;
567*f2d966f6SAlfonso S. Siciliano 				} else {
568*f2d966f6SAlfonso S. Siciliano 					ctl.op = MOVELEFT;
569*f2d966f6SAlfonso S. Siciliano 				}
570*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
571*f2d966f6SAlfonso S. Siciliano 			} else if (sel == END_WIN) {
572*f2d966f6SAlfonso S. Siciliano 				if (resize) {
573*f2d966f6SAlfonso S. Siciliano 					ctl.op = DECREASERIGHT;
574*f2d966f6SAlfonso S. Siciliano 				} else {
575*f2d966f6SAlfonso S. Siciliano 					ctl.op = MOVELEFT;
576*f2d966f6SAlfonso S. Siciliano 				}
577*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
578*f2d966f6SAlfonso S. Siciliano 			} else if (sel == STEP_WIN) {
579*f2d966f6SAlfonso S. Siciliano 				ctl.op = DECREASESTEP;
580*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
581*f2d966f6SAlfonso S. Siciliano 			}
582*f2d966f6SAlfonso S. Siciliano 			break;
583*f2d966f6SAlfonso S. Siciliano 		case '+':
584*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
585*f2d966f6SAlfonso S. Siciliano 				break;
586*f2d966f6SAlfonso S. Siciliano 			} else if (sel == START_WIN) {
587*f2d966f6SAlfonso S. Siciliano 				if (resize) {
588*f2d966f6SAlfonso S. Siciliano 					ctl.op = INCREASELEFT;
589*f2d966f6SAlfonso S. Siciliano 				} else {
590*f2d966f6SAlfonso S. Siciliano 					ctl.op = MOVERIGHT;
591*f2d966f6SAlfonso S. Siciliano 				}
592*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
593*f2d966f6SAlfonso S. Siciliano 			} else if (sel == END_WIN) {
594*f2d966f6SAlfonso S. Siciliano 				if (resize) {
595*f2d966f6SAlfonso S. Siciliano 					ctl.op = INCREASERIGHT;
596*f2d966f6SAlfonso S. Siciliano 				} else {
597*f2d966f6SAlfonso S. Siciliano 					ctl.op = MOVERIGHT;
598*f2d966f6SAlfonso S. Siciliano 				}
599*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
600*f2d966f6SAlfonso S. Siciliano 			} else if (sel == STEP_WIN) {
601*f2d966f6SAlfonso S. Siciliano 				ctl.op = INCREASESTEP;
602*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
603*f2d966f6SAlfonso S. Siciliano 			}
604*f2d966f6SAlfonso S. Siciliano 			break;
605*f2d966f6SAlfonso S. Siciliano 		case KEY_HOME:
606*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
607*f2d966f6SAlfonso S. Siciliano 				break;
608*f2d966f6SAlfonso S. Siciliano 			} else if (sel == SLIDER_WIN) {
609*f2d966f6SAlfonso S. Siciliano 				ctl.op = MOVEFARLEFT;
610*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
611*f2d966f6SAlfonso S. Siciliano 			}
612*f2d966f6SAlfonso S. Siciliano 			break;
613*f2d966f6SAlfonso S. Siciliano 		case KEY_END:
614*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
615*f2d966f6SAlfonso S. Siciliano 				break;
616*f2d966f6SAlfonso S. Siciliano 			} else if (sel == SLIDER_WIN) {
617*f2d966f6SAlfonso S. Siciliano 				ctl.op = MOVEFARRIGHT;
618*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
619*f2d966f6SAlfonso S. Siciliano 			}
620*f2d966f6SAlfonso S. Siciliano 			break;
621*f2d966f6SAlfonso S. Siciliano 		case KEY_PPAGE:
622*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
623*f2d966f6SAlfonso S. Siciliano 				break;
624*f2d966f6SAlfonso S. Siciliano 			} else if (sel == SLIDER_WIN) {
625*f2d966f6SAlfonso S. Siciliano 				ctl.op = MOVEFASTLEFT;
626*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
627*f2d966f6SAlfonso S. Siciliano 			}
628*f2d966f6SAlfonso S. Siciliano 			break;
629*f2d966f6SAlfonso S. Siciliano 		case KEY_NPAGE:
630*f2d966f6SAlfonso S. Siciliano 			if (focusbuttons) {
631*f2d966f6SAlfonso S. Siciliano 				break;
632*f2d966f6SAlfonso S. Siciliano 			} else if (sel == SLIDER_WIN) {
633*f2d966f6SAlfonso S. Siciliano 				ctl.op = MOVEFASTRIGHT;
634*f2d966f6SAlfonso S. Siciliano 				handlesliderctl(&ctl);
635*f2d966f6SAlfonso S. Siciliano 			}
636*f2d966f6SAlfonso S. Siciliano 			break;
637*f2d966f6SAlfonso S. Siciliano 		case KEY_F(1):
638*f2d966f6SAlfonso S. Siciliano 			if (conf->key.f1_file == NULL &&
639*f2d966f6SAlfonso S. Siciliano 			    conf->key.f1_message == NULL)
640*f2d966f6SAlfonso S. Siciliano 				break;
641*f2d966f6SAlfonso S. Siciliano 			if (f1help_dialog(conf) != 0)
642*f2d966f6SAlfonso S. Siciliano 				return (BSDDIALOG_ERROR);
643*f2d966f6SAlfonso S. Siciliano 			if (slider_draw(&dialog, true, start_win, end_win, size_win,
644*f2d966f6SAlfonso S. Siciliano 			    step_win, slider_win, unit) != 0)
645*f2d966f6SAlfonso S. Siciliano 				return (BSDDIALOG_ERROR);
646*f2d966f6SAlfonso S. Siciliano 			break;
647*f2d966f6SAlfonso S. Siciliano 		case KEY_CTRL('l'):
648*f2d966f6SAlfonso S. Siciliano 		case KEY_RESIZE:
649*f2d966f6SAlfonso S. Siciliano 			if (slider_draw(&dialog, true, start_win, end_win, size_win,
650*f2d966f6SAlfonso S. Siciliano 			    step_win, slider_win, unit) != 0)
651*f2d966f6SAlfonso S. Siciliano 				return (BSDDIALOG_ERROR);
652*f2d966f6SAlfonso S. Siciliano 			break;
653*f2d966f6SAlfonso S. Siciliano 		default:
654*f2d966f6SAlfonso S. Siciliano 			if (shortcut_buttons(input, &dialog.bs)) {
655*f2d966f6SAlfonso S. Siciliano 				DRAW_BUTTONS(dialog);
656*f2d966f6SAlfonso S. Siciliano 				doupdate();
657*f2d966f6SAlfonso S. Siciliano 				retval = BUTTONVALUE(dialog.bs);
658*f2d966f6SAlfonso S. Siciliano 				loop = false;
659*f2d966f6SAlfonso S. Siciliano 			}
660*f2d966f6SAlfonso S. Siciliano 		}
661*f2d966f6SAlfonso S. Siciliano 	}
662*f2d966f6SAlfonso S. Siciliano 
663*f2d966f6SAlfonso S. Siciliano 	delwin(start_win);
664*f2d966f6SAlfonso S. Siciliano 	delwin(end_win);
665*f2d966f6SAlfonso S. Siciliano 	delwin(step_win);
666*f2d966f6SAlfonso S. Siciliano 	delwin(slider_win);
667*f2d966f6SAlfonso S. Siciliano 	end_dialog(&dialog);
668*f2d966f6SAlfonso S. Siciliano 
669*f2d966f6SAlfonso S. Siciliano 	return (retval);
670*f2d966f6SAlfonso S. Siciliano }
671