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