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 30*c76f0793SBaptiste Daroussin #ifdef PORTNCURSES 31*c76f0793SBaptiste Daroussin #include <ncurses/curses.h> 32*c76f0793SBaptiste Daroussin #include <ncurses/form.h> 33*c76f0793SBaptiste Daroussin #else 34*c76f0793SBaptiste Daroussin #include <curses.h> 35*c76f0793SBaptiste Daroussin #include <form.h> 36*c76f0793SBaptiste Daroussin #endif 37*c76f0793SBaptiste Daroussin 38*c76f0793SBaptiste Daroussin #include "bsddialog.h" 39*c76f0793SBaptiste Daroussin #include "lib_util.h" 40*c76f0793SBaptiste Daroussin #include "bsddialog_theme.h" 41*c76f0793SBaptiste Daroussin 42*c76f0793SBaptiste Daroussin /* "Form": inputbox - passwordbox - form - passwordform - mixedform */ 43*c76f0793SBaptiste Daroussin 44*c76f0793SBaptiste Daroussin extern struct bsddialog_theme t; 45*c76f0793SBaptiste Daroussin 46*c76f0793SBaptiste Daroussin int bsddialog_inputmenu(struct bsddialog_conf conf, char* text, int rows, int cols) 47*c76f0793SBaptiste Daroussin { 48*c76f0793SBaptiste Daroussin text = "Inputbox unimplemented"; 49*c76f0793SBaptiste Daroussin bsddialog_msgbox(conf, text, rows, cols); 50*c76f0793SBaptiste Daroussin RETURN_ERROR(text); 51*c76f0793SBaptiste Daroussin } 52*c76f0793SBaptiste Daroussin 53*c76f0793SBaptiste Daroussin #define ITEMHIDDEN 0x1 54*c76f0793SBaptiste Daroussin #define ISITEMHIDDEN(item) (item.itemflags & 0x1) 55*c76f0793SBaptiste Daroussin #define ITEMREADONLY 0x2 56*c76f0793SBaptiste Daroussin #define ISITEMREADONLY(item) (item.itemflags & 0x2) 57*c76f0793SBaptiste Daroussin struct formitem { 58*c76f0793SBaptiste Daroussin char *label; 59*c76f0793SBaptiste Daroussin unsigned int ylabel; 60*c76f0793SBaptiste Daroussin unsigned int xlabel; 61*c76f0793SBaptiste Daroussin char *item; 62*c76f0793SBaptiste Daroussin unsigned int yitem; 63*c76f0793SBaptiste Daroussin unsigned int xitem; 64*c76f0793SBaptiste Daroussin int itemlen; 65*c76f0793SBaptiste Daroussin unsigned int inputlen; 66*c76f0793SBaptiste Daroussin unsigned int itemflags; 67*c76f0793SBaptiste Daroussin }; 68*c76f0793SBaptiste Daroussin 69*c76f0793SBaptiste Daroussin static int 70*c76f0793SBaptiste Daroussin mixedform_handler(WINDOW *widget, int y, int cols, struct buttons bs, 71*c76f0793SBaptiste Daroussin bool shortkey, WINDOW *entry, FORM *form, FIELD **field, int nitems 72*c76f0793SBaptiste Daroussin /*struct formitem *items*/) 73*c76f0793SBaptiste Daroussin { 74*c76f0793SBaptiste Daroussin bool loop, buttupdate, inentry = true; 75*c76f0793SBaptiste Daroussin int input, output; 76*c76f0793SBaptiste Daroussin 77*c76f0793SBaptiste Daroussin curs_set(2); 78*c76f0793SBaptiste Daroussin pos_form_cursor(form); 79*c76f0793SBaptiste Daroussin loop = buttupdate = true; 80*c76f0793SBaptiste Daroussin bs.curr = -1; 81*c76f0793SBaptiste Daroussin while(loop) { 82*c76f0793SBaptiste Daroussin if (buttupdate) { 83*c76f0793SBaptiste Daroussin draw_buttons(widget, y, cols, bs, shortkey); 84*c76f0793SBaptiste Daroussin wrefresh(widget); 85*c76f0793SBaptiste Daroussin buttupdate = false; 86*c76f0793SBaptiste Daroussin } 87*c76f0793SBaptiste Daroussin wrefresh(entry); 88*c76f0793SBaptiste Daroussin input = getch(); 89*c76f0793SBaptiste Daroussin switch(input) { 90*c76f0793SBaptiste Daroussin case 10: // Enter 91*c76f0793SBaptiste Daroussin if (inentry) 92*c76f0793SBaptiste Daroussin break; 93*c76f0793SBaptiste Daroussin output = bs.value[bs.curr]; // values -> buttvalues 94*c76f0793SBaptiste Daroussin form_driver(form, REQ_NEXT_FIELD); 95*c76f0793SBaptiste Daroussin form_driver(form, REQ_PREV_FIELD); 96*c76f0793SBaptiste Daroussin /* add a struct for forms */ 97*c76f0793SBaptiste Daroussin /*for (i=0; i<nitems; i++) { 98*c76f0793SBaptiste Daroussin bufp = field_buffer(field[i], 0); 99*c76f0793SBaptiste Daroussin dprintf(fd, "\n+%s", bufp); 100*c76f0793SBaptiste Daroussin bufp = field_buffer(field[i], 1); 101*c76f0793SBaptiste Daroussin dprintf(fd, "-%s+", bufp); 102*c76f0793SBaptiste Daroussin }*/ 103*c76f0793SBaptiste Daroussin loop = false; 104*c76f0793SBaptiste Daroussin break; 105*c76f0793SBaptiste Daroussin case 27: /* Esc */ 106*c76f0793SBaptiste Daroussin output = BSDDIALOG_ESC; 107*c76f0793SBaptiste Daroussin loop = false; 108*c76f0793SBaptiste Daroussin break; 109*c76f0793SBaptiste Daroussin case '\t': // TAB 110*c76f0793SBaptiste Daroussin if (inentry) { 111*c76f0793SBaptiste Daroussin bs.curr = 0; 112*c76f0793SBaptiste Daroussin inentry = false; 113*c76f0793SBaptiste Daroussin curs_set(0); 114*c76f0793SBaptiste Daroussin } else { 115*c76f0793SBaptiste Daroussin bs.curr++; 116*c76f0793SBaptiste Daroussin inentry = bs.curr >= (int) bs.nbuttons ? true : false; 117*c76f0793SBaptiste Daroussin if (inentry) { 118*c76f0793SBaptiste Daroussin curs_set(2); 119*c76f0793SBaptiste Daroussin pos_form_cursor(form); 120*c76f0793SBaptiste Daroussin } 121*c76f0793SBaptiste Daroussin } 122*c76f0793SBaptiste Daroussin buttupdate = true; 123*c76f0793SBaptiste Daroussin break; 124*c76f0793SBaptiste Daroussin case KEY_LEFT: 125*c76f0793SBaptiste Daroussin if (inentry) { 126*c76f0793SBaptiste Daroussin form_driver(form, REQ_PREV_CHAR); 127*c76f0793SBaptiste Daroussin } else { 128*c76f0793SBaptiste Daroussin if (bs.curr > 0) { 129*c76f0793SBaptiste Daroussin bs.curr--; 130*c76f0793SBaptiste Daroussin buttupdate = true; 131*c76f0793SBaptiste Daroussin } 132*c76f0793SBaptiste Daroussin } 133*c76f0793SBaptiste Daroussin break; 134*c76f0793SBaptiste Daroussin case KEY_RIGHT: 135*c76f0793SBaptiste Daroussin if (inentry) { 136*c76f0793SBaptiste Daroussin form_driver(form, REQ_NEXT_CHAR); 137*c76f0793SBaptiste Daroussin } else { 138*c76f0793SBaptiste Daroussin if (bs.curr < (int) bs.nbuttons - 1) { 139*c76f0793SBaptiste Daroussin bs.curr++; 140*c76f0793SBaptiste Daroussin buttupdate = true; 141*c76f0793SBaptiste Daroussin } 142*c76f0793SBaptiste Daroussin } 143*c76f0793SBaptiste Daroussin break; 144*c76f0793SBaptiste Daroussin case KEY_UP: 145*c76f0793SBaptiste Daroussin if (nitems < 2) 146*c76f0793SBaptiste Daroussin break; 147*c76f0793SBaptiste Daroussin set_field_fore(current_field(form), t.fieldcolor); 148*c76f0793SBaptiste Daroussin set_field_back(current_field(form), t.fieldcolor); 149*c76f0793SBaptiste Daroussin form_driver(form, REQ_PREV_FIELD); 150*c76f0793SBaptiste Daroussin form_driver(form, REQ_END_LINE); 151*c76f0793SBaptiste Daroussin set_field_fore(current_field(form), t.currfieldcolor); 152*c76f0793SBaptiste Daroussin set_field_back(current_field(form), t.currfieldcolor); 153*c76f0793SBaptiste Daroussin break; 154*c76f0793SBaptiste Daroussin case KEY_DOWN: 155*c76f0793SBaptiste Daroussin if (nitems < 2) 156*c76f0793SBaptiste Daroussin break; 157*c76f0793SBaptiste Daroussin set_field_fore(current_field(form), t.fieldcolor); 158*c76f0793SBaptiste Daroussin set_field_back(current_field(form), t.fieldcolor); 159*c76f0793SBaptiste Daroussin form_driver(form, REQ_NEXT_FIELD); 160*c76f0793SBaptiste Daroussin form_driver(form, REQ_END_LINE); 161*c76f0793SBaptiste Daroussin set_field_fore(current_field(form), t.currfieldcolor); 162*c76f0793SBaptiste Daroussin set_field_back(current_field(form), t.currfieldcolor); 163*c76f0793SBaptiste Daroussin break; 164*c76f0793SBaptiste Daroussin case KEY_BACKSPACE: 165*c76f0793SBaptiste Daroussin form_driver(form, REQ_DEL_PREV); 166*c76f0793SBaptiste Daroussin break; 167*c76f0793SBaptiste Daroussin case KEY_DC: 168*c76f0793SBaptiste Daroussin form_driver(form, REQ_DEL_CHAR); 169*c76f0793SBaptiste Daroussin break; 170*c76f0793SBaptiste Daroussin default: 171*c76f0793SBaptiste Daroussin if (inentry) { 172*c76f0793SBaptiste Daroussin form_driver(form, input); 173*c76f0793SBaptiste Daroussin } 174*c76f0793SBaptiste Daroussin break; 175*c76f0793SBaptiste Daroussin } 176*c76f0793SBaptiste Daroussin } 177*c76f0793SBaptiste Daroussin 178*c76f0793SBaptiste Daroussin curs_set(0); 179*c76f0793SBaptiste Daroussin 180*c76f0793SBaptiste Daroussin return output; 181*c76f0793SBaptiste Daroussin } 182*c76f0793SBaptiste Daroussin 183*c76f0793SBaptiste Daroussin static int 184*c76f0793SBaptiste Daroussin do_mixedform(struct bsddialog_conf conf, char* text, int rows, int cols, 185*c76f0793SBaptiste Daroussin int formheight, int nitems, struct formitem *items) 186*c76f0793SBaptiste Daroussin { 187*c76f0793SBaptiste Daroussin WINDOW *widget, *entry, *shadow; 188*c76f0793SBaptiste Daroussin int i, output, color, y, x; 189*c76f0793SBaptiste Daroussin FIELD **field; 190*c76f0793SBaptiste Daroussin FORM *form; 191*c76f0793SBaptiste Daroussin struct buttons bs; 192*c76f0793SBaptiste Daroussin 193*c76f0793SBaptiste Daroussin if (new_widget(conf, &widget, &y, &x, text, &rows, &cols, &shadow, 194*c76f0793SBaptiste Daroussin true) <0) 195*c76f0793SBaptiste Daroussin return -1; 196*c76f0793SBaptiste Daroussin 197*c76f0793SBaptiste Daroussin entry = new_boxed_window(conf, y + rows - 3 - formheight -2, x +1, 198*c76f0793SBaptiste Daroussin formheight+2, cols-2, LOWERED); 199*c76f0793SBaptiste Daroussin 200*c76f0793SBaptiste Daroussin get_buttons(conf, &bs, BUTTONLABEL(ok_label), BUTTONLABEL(extra_label), 201*c76f0793SBaptiste Daroussin BUTTONLABEL(cancel_label), BUTTONLABEL(help_label)); 202*c76f0793SBaptiste Daroussin 203*c76f0793SBaptiste Daroussin field = calloc(nitems + 1, sizeof(FIELD*)); 204*c76f0793SBaptiste Daroussin for (i=0; i < nitems; i++) { 205*c76f0793SBaptiste Daroussin field[i] = new_field(1, items[i].itemlen, items[i].yitem-1, items[i].xitem-1, 0, 1); 206*c76f0793SBaptiste Daroussin field_opts_off(field[i], O_STATIC); 207*c76f0793SBaptiste Daroussin set_max_field(field[i], items[i].inputlen); 208*c76f0793SBaptiste Daroussin set_field_buffer(field[i], 0, items[i].item); 209*c76f0793SBaptiste Daroussin set_field_buffer(field[i], 1, items[i].item); 210*c76f0793SBaptiste Daroussin field_opts_off(field[i], O_AUTOSKIP); 211*c76f0793SBaptiste Daroussin field_opts_off(field[i], O_BLANK); 212*c76f0793SBaptiste Daroussin //field_opts_off(field[i], O_BS_OVERLOAD); 213*c76f0793SBaptiste Daroussin 214*c76f0793SBaptiste Daroussin if (ISITEMHIDDEN(items[i])) 215*c76f0793SBaptiste Daroussin field_opts_off(field[i], O_PUBLIC); 216*c76f0793SBaptiste Daroussin 217*c76f0793SBaptiste Daroussin if (ISITEMREADONLY(items[i])) { 218*c76f0793SBaptiste Daroussin field_opts_off(field[i], O_EDIT); 219*c76f0793SBaptiste Daroussin field_opts_off(field[i], O_ACTIVE); 220*c76f0793SBaptiste Daroussin color = t.fieldreadonlycolor; 221*c76f0793SBaptiste Daroussin } else { 222*c76f0793SBaptiste Daroussin color = i == 0 ? t.currfieldcolor : t.fieldcolor; 223*c76f0793SBaptiste Daroussin } 224*c76f0793SBaptiste Daroussin set_field_fore(field[i], color); 225*c76f0793SBaptiste Daroussin set_field_back(field[i], color); 226*c76f0793SBaptiste Daroussin } 227*c76f0793SBaptiste Daroussin field[i] = NULL; 228*c76f0793SBaptiste Daroussin 229*c76f0793SBaptiste Daroussin if (nitems == 1) {// inputbox or passwordbox 230*c76f0793SBaptiste Daroussin set_field_fore(field[0], t.widgetcolor); 231*c76f0793SBaptiste Daroussin set_field_back(field[0], t.widgetcolor); 232*c76f0793SBaptiste Daroussin } 233*c76f0793SBaptiste Daroussin 234*c76f0793SBaptiste Daroussin form = new_form(field); 235*c76f0793SBaptiste Daroussin set_form_win(form, entry); 236*c76f0793SBaptiste Daroussin set_form_sub(form, derwin(entry, nitems, cols-4, 1, 1)); 237*c76f0793SBaptiste Daroussin post_form(form); 238*c76f0793SBaptiste Daroussin 239*c76f0793SBaptiste Daroussin for (i=0; i < nitems; i++) 240*c76f0793SBaptiste Daroussin mvwaddstr(entry, items[i].ylabel, items[i].xlabel, items[i].label); 241*c76f0793SBaptiste Daroussin 242*c76f0793SBaptiste Daroussin wrefresh(entry); 243*c76f0793SBaptiste Daroussin 244*c76f0793SBaptiste Daroussin output = mixedform_handler(widget, rows-2, cols, bs, true, entry, form, 245*c76f0793SBaptiste Daroussin field, nitems /*,items*/); 246*c76f0793SBaptiste Daroussin 247*c76f0793SBaptiste Daroussin unpost_form(form); 248*c76f0793SBaptiste Daroussin free_form(form); 249*c76f0793SBaptiste Daroussin for (i=0; i < nitems; i++) 250*c76f0793SBaptiste Daroussin free_field(field[i]); 251*c76f0793SBaptiste Daroussin free(field); 252*c76f0793SBaptiste Daroussin 253*c76f0793SBaptiste Daroussin delwin(entry); 254*c76f0793SBaptiste Daroussin end_widget(conf, widget, rows, cols, shadow); 255*c76f0793SBaptiste Daroussin 256*c76f0793SBaptiste Daroussin return output; 257*c76f0793SBaptiste Daroussin } 258*c76f0793SBaptiste Daroussin 259*c76f0793SBaptiste Daroussin int bsddialog_inputbox(struct bsddialog_conf conf, char* text, int rows, int cols) 260*c76f0793SBaptiste Daroussin { 261*c76f0793SBaptiste Daroussin int output; 262*c76f0793SBaptiste Daroussin struct formitem item; 263*c76f0793SBaptiste Daroussin 264*c76f0793SBaptiste Daroussin item.label = ""; 265*c76f0793SBaptiste Daroussin item.ylabel = 0; 266*c76f0793SBaptiste Daroussin item.xlabel = 0; 267*c76f0793SBaptiste Daroussin item.item = ""; // TODO add argv 268*c76f0793SBaptiste Daroussin item.yitem = 1; 269*c76f0793SBaptiste Daroussin item.xitem = 1; 270*c76f0793SBaptiste Daroussin item.itemlen = cols-4; 271*c76f0793SBaptiste Daroussin item.inputlen = 2048; // todo conf.sizeinput 272*c76f0793SBaptiste Daroussin item.itemflags = 0; 273*c76f0793SBaptiste Daroussin 274*c76f0793SBaptiste Daroussin output = do_mixedform(conf, text, rows, cols, 1, 1, &item); 275*c76f0793SBaptiste Daroussin 276*c76f0793SBaptiste Daroussin return output; 277*c76f0793SBaptiste Daroussin } 278*c76f0793SBaptiste Daroussin 279*c76f0793SBaptiste Daroussin int bsddialog_passwordbox(struct bsddialog_conf conf, char* text, int rows, int cols) 280*c76f0793SBaptiste Daroussin { 281*c76f0793SBaptiste Daroussin int output; 282*c76f0793SBaptiste Daroussin struct formitem item; 283*c76f0793SBaptiste Daroussin 284*c76f0793SBaptiste Daroussin item.label = ""; 285*c76f0793SBaptiste Daroussin item.ylabel = 0; 286*c76f0793SBaptiste Daroussin item.xlabel = 0; 287*c76f0793SBaptiste Daroussin item.item = ""; // TODO add argv 288*c76f0793SBaptiste Daroussin item.yitem = 1; 289*c76f0793SBaptiste Daroussin item.xitem = 1; 290*c76f0793SBaptiste Daroussin item.itemlen = cols-4; 291*c76f0793SBaptiste Daroussin item.inputlen = 2048; // todo conf.sizeinput 292*c76f0793SBaptiste Daroussin item.itemflags = ITEMHIDDEN; 293*c76f0793SBaptiste Daroussin 294*c76f0793SBaptiste Daroussin output = do_mixedform(conf, text, rows, cols, 1, 1, &item); 295*c76f0793SBaptiste Daroussin 296*c76f0793SBaptiste Daroussin return output; 297*c76f0793SBaptiste Daroussin } 298*c76f0793SBaptiste Daroussin 299*c76f0793SBaptiste Daroussin int 300*c76f0793SBaptiste Daroussin bsddialog_mixedform(struct bsddialog_conf conf, char* text, int rows, int cols, 301*c76f0793SBaptiste Daroussin int formheight, int argc, char **argv) 302*c76f0793SBaptiste Daroussin { 303*c76f0793SBaptiste Daroussin int i, output, nitems; 304*c76f0793SBaptiste Daroussin struct formitem items[128]; 305*c76f0793SBaptiste Daroussin 306*c76f0793SBaptiste Daroussin if ((argc % 9) != 0) 307*c76f0793SBaptiste Daroussin return (-1); 308*c76f0793SBaptiste Daroussin 309*c76f0793SBaptiste Daroussin nitems = argc / 9; 310*c76f0793SBaptiste Daroussin for (i=0; i<nitems; i++) { 311*c76f0793SBaptiste Daroussin items[i].label = argv[9*i]; 312*c76f0793SBaptiste Daroussin items[i].ylabel = atoi(argv[9*i+1]); 313*c76f0793SBaptiste Daroussin items[i].xlabel = atoi(argv[9*i+2]); 314*c76f0793SBaptiste Daroussin items[i].item = argv[9*i+3]; 315*c76f0793SBaptiste Daroussin items[i].yitem = atoi(argv[9*i+4]); 316*c76f0793SBaptiste Daroussin items[i].xitem = atoi(argv[9*i+5]); 317*c76f0793SBaptiste Daroussin items[i].itemlen = atoi(argv[9*i+6]); 318*c76f0793SBaptiste Daroussin items[i].inputlen = atoi(argv[9*i+7]); 319*c76f0793SBaptiste Daroussin items[i].itemflags = atoi(argv[9*i+8]); 320*c76f0793SBaptiste Daroussin } 321*c76f0793SBaptiste Daroussin 322*c76f0793SBaptiste Daroussin output = do_mixedform(conf, text, rows, cols, formheight, nitems, items); 323*c76f0793SBaptiste Daroussin 324*c76f0793SBaptiste Daroussin return output; 325*c76f0793SBaptiste Daroussin } 326*c76f0793SBaptiste Daroussin 327*c76f0793SBaptiste Daroussin int 328*c76f0793SBaptiste Daroussin bsddialog_form(struct bsddialog_conf conf, char* text, int rows, int cols, 329*c76f0793SBaptiste Daroussin int formheight, int argc, char **argv) 330*c76f0793SBaptiste Daroussin { 331*c76f0793SBaptiste Daroussin int i, output, nitems, itemlen, inputlen; 332*c76f0793SBaptiste Daroussin unsigned int flags = 0; 333*c76f0793SBaptiste Daroussin struct formitem items[128]; 334*c76f0793SBaptiste Daroussin 335*c76f0793SBaptiste Daroussin if ((argc % 8) != 0) 336*c76f0793SBaptiste Daroussin return (-1); 337*c76f0793SBaptiste Daroussin 338*c76f0793SBaptiste Daroussin nitems = argc / 8; 339*c76f0793SBaptiste Daroussin for (i=0; i<nitems; i++) { 340*c76f0793SBaptiste Daroussin items[i].label = argv[8*i]; 341*c76f0793SBaptiste Daroussin items[i].ylabel = atoi(argv[8*i+1]); 342*c76f0793SBaptiste Daroussin items[i].xlabel = atoi(argv[8*i+2]); 343*c76f0793SBaptiste Daroussin items[i].item = argv[8*i+3]; 344*c76f0793SBaptiste Daroussin items[i].yitem = atoi(argv[8*i+4]); 345*c76f0793SBaptiste Daroussin items[i].xitem = atoi(argv[8*i+5]); 346*c76f0793SBaptiste Daroussin 347*c76f0793SBaptiste Daroussin itemlen = atoi(argv[8*i+6]); 348*c76f0793SBaptiste Daroussin items[i].itemlen = abs(itemlen); 349*c76f0793SBaptiste Daroussin 350*c76f0793SBaptiste Daroussin inputlen = atoi(argv[8*i+7]); 351*c76f0793SBaptiste Daroussin items[i].inputlen = inputlen == 0 ? abs(itemlen) : inputlen; 352*c76f0793SBaptiste Daroussin 353*c76f0793SBaptiste Daroussin flags = flags | (itemlen < 0 ? ITEMREADONLY : 0); 354*c76f0793SBaptiste Daroussin items[i].itemflags = flags; 355*c76f0793SBaptiste Daroussin } 356*c76f0793SBaptiste Daroussin 357*c76f0793SBaptiste Daroussin output = do_mixedform(conf, text, rows, cols, formheight, nitems, items); 358*c76f0793SBaptiste Daroussin 359*c76f0793SBaptiste Daroussin return output; 360*c76f0793SBaptiste Daroussin } 361*c76f0793SBaptiste Daroussin 362*c76f0793SBaptiste Daroussin int 363*c76f0793SBaptiste Daroussin bsddialog_passwordform(struct bsddialog_conf conf, char* text, int rows, int cols, 364*c76f0793SBaptiste Daroussin int formheight, int argc, char **argv) 365*c76f0793SBaptiste Daroussin { 366*c76f0793SBaptiste Daroussin int i, output, nitems, itemlen, inputlen; 367*c76f0793SBaptiste Daroussin unsigned int flags = ITEMHIDDEN; 368*c76f0793SBaptiste Daroussin struct formitem items[128]; 369*c76f0793SBaptiste Daroussin 370*c76f0793SBaptiste Daroussin if ((argc % 8) != 0) 371*c76f0793SBaptiste Daroussin return (-1); 372*c76f0793SBaptiste Daroussin 373*c76f0793SBaptiste Daroussin nitems = argc / 8; 374*c76f0793SBaptiste Daroussin for (i=0; i<nitems; i++) { 375*c76f0793SBaptiste Daroussin items[i].label = argv[8*i]; 376*c76f0793SBaptiste Daroussin items[i].ylabel = atoi(argv[8*i+1]); 377*c76f0793SBaptiste Daroussin items[i].xlabel = atoi(argv[8*i+2]); 378*c76f0793SBaptiste Daroussin items[i].item = argv[8*i+3]; 379*c76f0793SBaptiste Daroussin items[i].yitem = atoi(argv[8*i+4]); 380*c76f0793SBaptiste Daroussin items[i].xitem = atoi(argv[8*i+5]); 381*c76f0793SBaptiste Daroussin 382*c76f0793SBaptiste Daroussin itemlen = atoi(argv[8*i+6]); 383*c76f0793SBaptiste Daroussin items[i].itemlen = abs(itemlen); 384*c76f0793SBaptiste Daroussin 385*c76f0793SBaptiste Daroussin inputlen = atoi(argv[8*i+7]); 386*c76f0793SBaptiste Daroussin items[i].inputlen = inputlen == 0 ? abs(itemlen) : inputlen; 387*c76f0793SBaptiste Daroussin 388*c76f0793SBaptiste Daroussin flags = flags | (itemlen < 0 ? ITEMREADONLY : 0); 389*c76f0793SBaptiste Daroussin items[i].itemflags = flags; 390*c76f0793SBaptiste Daroussin } 391*c76f0793SBaptiste Daroussin 392*c76f0793SBaptiste Daroussin output = do_mixedform(conf, text, rows, cols, formheight, nitems, items); 393*c76f0793SBaptiste Daroussin 394*c76f0793SBaptiste Daroussin return output; 395*c76f0793SBaptiste Daroussin } 396*c76f0793SBaptiste Daroussin 397