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