1c76f0793SBaptiste Daroussin /*- 2c76f0793SBaptiste Daroussin * SPDX-License-Identifier: BSD-2-Clause 3c76f0793SBaptiste Daroussin * 4c76f0793SBaptiste Daroussin * Copyright (c) 2021 Alfonso Sabato Siciliano 5c76f0793SBaptiste Daroussin * 6c76f0793SBaptiste Daroussin * Redistribution and use in source and binary forms, with or without 7c76f0793SBaptiste Daroussin * modification, are permitted provided that the following conditions 8c76f0793SBaptiste Daroussin * are met: 9c76f0793SBaptiste Daroussin * 1. Redistributions of source code must retain the above copyright 10c76f0793SBaptiste Daroussin * notice, this list of conditions and the following disclaimer. 11c76f0793SBaptiste Daroussin * 2. Redistributions in binary form must reproduce the above copyright 12c76f0793SBaptiste Daroussin * notice, this list of conditions and the following disclaimer in the 13c76f0793SBaptiste Daroussin * documentation and/or other materials provided with the distribution. 14c76f0793SBaptiste Daroussin * 15c76f0793SBaptiste Daroussin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16c76f0793SBaptiste Daroussin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17c76f0793SBaptiste Daroussin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18c76f0793SBaptiste Daroussin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19c76f0793SBaptiste Daroussin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20c76f0793SBaptiste Daroussin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21c76f0793SBaptiste Daroussin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22c76f0793SBaptiste Daroussin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23c76f0793SBaptiste Daroussin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24c76f0793SBaptiste Daroussin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25c76f0793SBaptiste Daroussin * SUCH DAMAGE. 26c76f0793SBaptiste Daroussin */ 27c76f0793SBaptiste Daroussin 28c76f0793SBaptiste Daroussin #include <sys/param.h> 29c76f0793SBaptiste Daroussin 30c76f0793SBaptiste Daroussin #ifdef PORTNCURSES 318c4f4028SBaptiste Daroussin #include <ncurses/ncurses.h> 32c76f0793SBaptiste Daroussin #else 338c4f4028SBaptiste Daroussin #include <ncurses.h> 34c76f0793SBaptiste Daroussin #endif 35*d93b4d32SBaptiste Daroussin #include <stdlib.h> 36*d93b4d32SBaptiste Daroussin #include <string.h> 37*d93b4d32SBaptiste Daroussin #include <unistd.h> 38c76f0793SBaptiste Daroussin 39c76f0793SBaptiste Daroussin #include "bsddialog.h" 40c76f0793SBaptiste Daroussin #include "lib_util.h" 41c76f0793SBaptiste Daroussin #include "bsddialog_theme.h" 42c76f0793SBaptiste Daroussin 43c76f0793SBaptiste Daroussin extern struct bsddialog_theme t; 44c76f0793SBaptiste Daroussin 45c76f0793SBaptiste Daroussin /* Error buffer */ 46c76f0793SBaptiste Daroussin 47c76f0793SBaptiste Daroussin #define ERRBUFLEN 1024 48c76f0793SBaptiste Daroussin static char errorbuffer[ERRBUFLEN]; 49c76f0793SBaptiste Daroussin 50c76f0793SBaptiste Daroussin const char *get_error_string(void) 51c76f0793SBaptiste Daroussin { 52c76f0793SBaptiste Daroussin return errorbuffer; 53c76f0793SBaptiste Daroussin } 54c76f0793SBaptiste Daroussin 55c76f0793SBaptiste Daroussin void set_error_string(char *str) 56c76f0793SBaptiste Daroussin { 57c76f0793SBaptiste Daroussin 58c76f0793SBaptiste Daroussin strncpy(errorbuffer, str, ERRBUFLEN-1); 59c76f0793SBaptiste Daroussin } 60c76f0793SBaptiste Daroussin 61c76f0793SBaptiste Daroussin /* cleaner */ 62c76f0793SBaptiste Daroussin int hide_widget(int y, int x, int h, int w, bool withshadow) 63c76f0793SBaptiste Daroussin { 64c76f0793SBaptiste Daroussin WINDOW *clear; 65c76f0793SBaptiste Daroussin 66c76f0793SBaptiste Daroussin /* no check: y, x, h and w are checked by the builders */ 67f499134dSBaptiste Daroussin if ((clear = newwin(h, w, y + t.shadow.h, x + t.shadow.w)) == NULL) 68c76f0793SBaptiste Daroussin RETURN_ERROR("Cannot hide the widget"); 69f499134dSBaptiste Daroussin wbkgd(clear, t.terminal.color); 70c76f0793SBaptiste Daroussin 71c76f0793SBaptiste Daroussin if (withshadow) 72c76f0793SBaptiste Daroussin wrefresh(clear); 73c76f0793SBaptiste Daroussin 74c76f0793SBaptiste Daroussin mvwin(clear, y, x); 75c76f0793SBaptiste Daroussin wrefresh(clear); 76c76f0793SBaptiste Daroussin 77c76f0793SBaptiste Daroussin delwin(clear); 78c76f0793SBaptiste Daroussin 79c76f0793SBaptiste Daroussin return 0; 80c76f0793SBaptiste Daroussin } 81c76f0793SBaptiste Daroussin 82c76f0793SBaptiste Daroussin /* F1 help */ 83f499134dSBaptiste Daroussin int f1help(struct bsddialog_conf *conf) 84c76f0793SBaptiste Daroussin { 85c76f0793SBaptiste Daroussin int output; 868c4f4028SBaptiste Daroussin struct bsddialog_conf hconf; 87c76f0793SBaptiste Daroussin 888c4f4028SBaptiste Daroussin //memcpy(&hconf, conf, sizeof(struct bsddialog_conf)); 898c4f4028SBaptiste Daroussin bsddialog_initconf(&hconf); 908c4f4028SBaptiste Daroussin hconf.title = "HELP"; 918c4f4028SBaptiste Daroussin hconf.button.ok_label = "EXIT"; 928c4f4028SBaptiste Daroussin hconf.clear = true; 938c4f4028SBaptiste Daroussin hconf.ascii_lines = conf->ascii_lines; 948c4f4028SBaptiste Daroussin hconf.no_lines = conf->no_lines; 958c4f4028SBaptiste Daroussin hconf.shadow = conf->shadow; 968c4f4028SBaptiste Daroussin hconf.text.colors = conf->text.colors; 97c76f0793SBaptiste Daroussin 988c4f4028SBaptiste Daroussin output = BSDDIALOG_OK; 998c4f4028SBaptiste Daroussin if (conf->f1_message != NULL) 1008c4f4028SBaptiste Daroussin output = bsddialog_msgbox(&hconf, conf->f1_message, 0, 0); 101c76f0793SBaptiste Daroussin 1028c4f4028SBaptiste Daroussin if (output != BSDDIALOG_ERROR && conf->f1_file != NULL) 1038c4f4028SBaptiste Daroussin output = bsddialog_textbox(&hconf, conf->f1_file, 0, 0); 1048c4f4028SBaptiste Daroussin 1058c4f4028SBaptiste Daroussin return (output == BSDDIALOG_ERROR ? BSDDIALOG_ERROR : 0); 106c76f0793SBaptiste Daroussin } 107c76f0793SBaptiste Daroussin 108c76f0793SBaptiste Daroussin /* Buttons */ 109c76f0793SBaptiste Daroussin void 110c76f0793SBaptiste Daroussin draw_button(WINDOW *window, int y, int x, int size, char *text, bool selected, 111c76f0793SBaptiste Daroussin bool shortkey) 112c76f0793SBaptiste Daroussin { 113c76f0793SBaptiste Daroussin int i, color_arrows, color_shortkey, color_button; 114c76f0793SBaptiste Daroussin 115c76f0793SBaptiste Daroussin if (selected) { 116f499134dSBaptiste Daroussin color_arrows = t.button.f_delimcolor; 117f499134dSBaptiste Daroussin color_shortkey = t.button.f_shortcutcolor; 118f499134dSBaptiste Daroussin color_button = t.button.f_color; 119c76f0793SBaptiste Daroussin } else { 120f499134dSBaptiste Daroussin color_arrows = t.button.delimcolor; 121f499134dSBaptiste Daroussin color_shortkey = t.button.shortcutcolor; 122f499134dSBaptiste Daroussin color_button = t.button.color; 123c76f0793SBaptiste Daroussin } 124c76f0793SBaptiste Daroussin 125c76f0793SBaptiste Daroussin wattron(window, color_arrows); 126f499134dSBaptiste Daroussin mvwaddch(window, y, x, t.button.leftch); 127c76f0793SBaptiste Daroussin wattroff(window, color_arrows); 128c76f0793SBaptiste Daroussin wattron(window, color_button); 129c76f0793SBaptiste Daroussin for(i = 1; i < size - 1; i++) 130c76f0793SBaptiste Daroussin waddch(window, ' '); 131c76f0793SBaptiste Daroussin wattroff(window, color_button); 132c76f0793SBaptiste Daroussin wattron(window, color_arrows); 133f499134dSBaptiste Daroussin mvwaddch(window, y, x + i, t.button.rightch); 134c76f0793SBaptiste Daroussin wattroff(window, color_arrows); 135c76f0793SBaptiste Daroussin 136c76f0793SBaptiste Daroussin x = x + 1 + ((size - 2 - strlen(text))/2); 137c76f0793SBaptiste Daroussin wattron(window, color_button); 138c76f0793SBaptiste Daroussin mvwaddstr(window, y, x, text); 139c76f0793SBaptiste Daroussin wattroff(window, color_button); 140c76f0793SBaptiste Daroussin 141c76f0793SBaptiste Daroussin if (shortkey) { 142c76f0793SBaptiste Daroussin wattron(window, color_shortkey); 143c76f0793SBaptiste Daroussin mvwaddch(window, y, x, text[0]); 144c76f0793SBaptiste Daroussin wattroff(window, color_shortkey); 145c76f0793SBaptiste Daroussin } 146c76f0793SBaptiste Daroussin } 147c76f0793SBaptiste Daroussin 148c76f0793SBaptiste Daroussin void 149c76f0793SBaptiste Daroussin draw_buttons(WINDOW *window, int y, int cols, struct buttons bs, bool shortkey) 150c76f0793SBaptiste Daroussin { 151c76f0793SBaptiste Daroussin int i, x, start_x; 152c76f0793SBaptiste Daroussin 153f499134dSBaptiste Daroussin start_x = bs.sizebutton * bs.nbuttons + (bs.nbuttons - 1) * t.button.space; 154c76f0793SBaptiste Daroussin start_x = cols/2 - start_x/2; 155c76f0793SBaptiste Daroussin 156c76f0793SBaptiste Daroussin for (i = 0; i < (int) bs.nbuttons; i++) { 157f499134dSBaptiste Daroussin x = i * (bs.sizebutton + t.button.space); 158c76f0793SBaptiste Daroussin draw_button(window, y, start_x + x, bs.sizebutton, bs.label[i], 159c76f0793SBaptiste Daroussin i == bs.curr, shortkey); 160c76f0793SBaptiste Daroussin } 161c76f0793SBaptiste Daroussin } 162c76f0793SBaptiste Daroussin 163c76f0793SBaptiste Daroussin void 164f499134dSBaptiste Daroussin get_buttons(struct bsddialog_conf *conf, struct buttons *bs, char *yesoklabel, 165c76f0793SBaptiste Daroussin char *extralabel, char *nocancellabel, char *helplabel) 166c76f0793SBaptiste Daroussin { 167c76f0793SBaptiste Daroussin int i; 168c76f0793SBaptiste Daroussin #define SIZEBUTTON 8 169c76f0793SBaptiste Daroussin #define DEFAULT_BUTTON_LABEL LABEL_ok_label 1708c4f4028SBaptiste Daroussin #define DEFAULT_BUTTON_VALUE BSDDIALOG_OK 171c76f0793SBaptiste Daroussin 172c76f0793SBaptiste Daroussin 173c76f0793SBaptiste Daroussin bs->nbuttons = 0; 174c76f0793SBaptiste Daroussin bs->curr = 0; 175c76f0793SBaptiste Daroussin bs->sizebutton = 0; 176c76f0793SBaptiste Daroussin 1778c4f4028SBaptiste Daroussin if (yesoklabel != NULL && conf->button.without_ok == false) { 178c76f0793SBaptiste Daroussin bs->label[0] = yesoklabel; 1798c4f4028SBaptiste Daroussin bs->value[0] = BSDDIALOG_OK; 180c76f0793SBaptiste Daroussin bs->nbuttons += 1; 181c76f0793SBaptiste Daroussin } 182c76f0793SBaptiste Daroussin 1838c4f4028SBaptiste Daroussin if (extralabel != NULL && conf->button.with_extra) { 184c76f0793SBaptiste Daroussin bs->label[bs->nbuttons] = extralabel; 185c76f0793SBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_EXTRA; 186c76f0793SBaptiste Daroussin bs->nbuttons += 1; 187c76f0793SBaptiste Daroussin } 188c76f0793SBaptiste Daroussin 1898c4f4028SBaptiste Daroussin if (nocancellabel != NULL && conf->button.without_cancel == false) { 190c76f0793SBaptiste Daroussin bs->label[bs->nbuttons] = nocancellabel; 1918c4f4028SBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_CANCEL; 1928c4f4028SBaptiste Daroussin if (conf->button.default_cancel) 193c76f0793SBaptiste Daroussin bs->curr = bs->nbuttons; 194c76f0793SBaptiste Daroussin bs->nbuttons += 1; 195c76f0793SBaptiste Daroussin } 196c76f0793SBaptiste Daroussin 1978c4f4028SBaptiste Daroussin if (helplabel != NULL && conf->button.with_help) { 198c76f0793SBaptiste Daroussin bs->label[bs->nbuttons] = helplabel; 199c76f0793SBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_HELP; 200c76f0793SBaptiste Daroussin bs->nbuttons += 1; 201c76f0793SBaptiste Daroussin } 202c76f0793SBaptiste Daroussin 203f499134dSBaptiste Daroussin if (conf->button.generic1_label != NULL) { 204f499134dSBaptiste Daroussin bs->label[bs->nbuttons] = conf->button.generic1_label; 205f499134dSBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_GENERIC1; 206f499134dSBaptiste Daroussin bs->nbuttons += 1; 207f499134dSBaptiste Daroussin } 208f499134dSBaptiste Daroussin 209f499134dSBaptiste Daroussin if (conf->button.generic2_label != NULL) { 210f499134dSBaptiste Daroussin bs->label[bs->nbuttons] = conf->button.generic2_label; 211f499134dSBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_GENERIC2; 212f499134dSBaptiste Daroussin bs->nbuttons += 1; 213f499134dSBaptiste Daroussin } 214f499134dSBaptiste Daroussin 215c76f0793SBaptiste Daroussin if (bs->nbuttons == 0) { 216c76f0793SBaptiste Daroussin bs->label[0] = DEFAULT_BUTTON_LABEL; 217c76f0793SBaptiste Daroussin bs->value[0] = DEFAULT_BUTTON_VALUE; 218c76f0793SBaptiste Daroussin bs->nbuttons = 1; 219c76f0793SBaptiste Daroussin } 220c76f0793SBaptiste Daroussin 221f499134dSBaptiste Daroussin if (conf->button.default_label != NULL) { 222c76f0793SBaptiste Daroussin for (i=0; i<(int)bs->nbuttons; i++) { 223f499134dSBaptiste Daroussin if (strcmp(conf->button.default_label, bs->label[i]) == 0) 224c76f0793SBaptiste Daroussin bs->curr = i; 225c76f0793SBaptiste Daroussin } 226c76f0793SBaptiste Daroussin } 227c76f0793SBaptiste Daroussin 228c76f0793SBaptiste Daroussin bs->sizebutton = MAX(SIZEBUTTON - 2, strlen(bs->label[0])); 229c76f0793SBaptiste Daroussin for (i=1; i < (int) bs->nbuttons; i++) 230c76f0793SBaptiste Daroussin bs->sizebutton = MAX(bs->sizebutton, strlen(bs->label[i])); 231c76f0793SBaptiste Daroussin bs->sizebutton += 2; 232c76f0793SBaptiste Daroussin } 233c76f0793SBaptiste Daroussin 234c76f0793SBaptiste Daroussin /* Text */ 235f499134dSBaptiste Daroussin static bool is_ncurses_attr(char *text) 236f499134dSBaptiste Daroussin { 237c76f0793SBaptiste Daroussin 238f499134dSBaptiste Daroussin if (strnlen(text, 3) < 3) 239f499134dSBaptiste Daroussin return false; 240f499134dSBaptiste Daroussin 241f499134dSBaptiste Daroussin if (text[0] != '\\' || text[1] != 'Z') 242f499134dSBaptiste Daroussin return false; 243f499134dSBaptiste Daroussin 244f499134dSBaptiste Daroussin return (strchr("nbBrRuU01234567", text[2]) == NULL ? false : true); 245f499134dSBaptiste Daroussin } 246c76f0793SBaptiste Daroussin 247c76f0793SBaptiste Daroussin static bool check_set_ncurses_attr(WINDOW *win, char *text) 248c76f0793SBaptiste Daroussin { 249c76f0793SBaptiste Daroussin 250f499134dSBaptiste Daroussin if (is_ncurses_attr(text) == false) 251c76f0793SBaptiste Daroussin return false; 252c76f0793SBaptiste Daroussin 253f499134dSBaptiste Daroussin if ((text[2] - '0') >= 0 && (text[2] - '0') < 8) { 2548c4f4028SBaptiste Daroussin wattron(win, bsddialog_color( text[2] - '0', COLOR_WHITE, 0)); 255c76f0793SBaptiste Daroussin return true; 256c76f0793SBaptiste Daroussin } 257c76f0793SBaptiste Daroussin 258c76f0793SBaptiste Daroussin switch (text[2]) { 259c76f0793SBaptiste Daroussin case 'n': 260c76f0793SBaptiste Daroussin wattrset(win, A_NORMAL); 261c76f0793SBaptiste Daroussin break; 262c76f0793SBaptiste Daroussin case 'b': 263c76f0793SBaptiste Daroussin wattron(win, A_BOLD); 264c76f0793SBaptiste Daroussin break; 265c76f0793SBaptiste Daroussin case 'B': 266c76f0793SBaptiste Daroussin wattroff(win, A_BOLD); 267c76f0793SBaptiste Daroussin break; 268c76f0793SBaptiste Daroussin case 'r': 269c76f0793SBaptiste Daroussin wattron(win, A_REVERSE); 270c76f0793SBaptiste Daroussin break; 271c76f0793SBaptiste Daroussin case 'R': 272c76f0793SBaptiste Daroussin wattroff(win, A_REVERSE); 273c76f0793SBaptiste Daroussin break; 274c76f0793SBaptiste Daroussin case 'u': 275c76f0793SBaptiste Daroussin wattron(win, A_UNDERLINE); 276c76f0793SBaptiste Daroussin break; 277c76f0793SBaptiste Daroussin case 'U': 278c76f0793SBaptiste Daroussin wattroff(win, A_UNDERLINE); 279c76f0793SBaptiste Daroussin break; 280c76f0793SBaptiste Daroussin } 281c76f0793SBaptiste Daroussin 282c76f0793SBaptiste Daroussin return true; 283c76f0793SBaptiste Daroussin } 284c76f0793SBaptiste Daroussin 285c76f0793SBaptiste Daroussin static void 286c76f0793SBaptiste Daroussin print_str(WINDOW *win, int *rows, int *y, int *x, int cols, char *str, bool color) 287c76f0793SBaptiste Daroussin { 288c76f0793SBaptiste Daroussin int i, j, len, reallen; 289c76f0793SBaptiste Daroussin 290c76f0793SBaptiste Daroussin if(strlen(str) == 0) 291c76f0793SBaptiste Daroussin return; 292c76f0793SBaptiste Daroussin 293c76f0793SBaptiste Daroussin len = reallen = strlen(str); 294c76f0793SBaptiste Daroussin if (color) { 295c76f0793SBaptiste Daroussin i=0; 296c76f0793SBaptiste Daroussin while (i < len) { 297c76f0793SBaptiste Daroussin if (is_ncurses_attr(str+i)) 298c76f0793SBaptiste Daroussin reallen -= 3; 299c76f0793SBaptiste Daroussin i++; 300c76f0793SBaptiste Daroussin } 301c76f0793SBaptiste Daroussin } 302c76f0793SBaptiste Daroussin 303c76f0793SBaptiste Daroussin i = 0; 304c76f0793SBaptiste Daroussin while (i < len) { 305c76f0793SBaptiste Daroussin if (*x + reallen > cols) { 306c76f0793SBaptiste Daroussin *y = (*x != 0 ? *y+1 : *y); 307c76f0793SBaptiste Daroussin if (*y >= *rows) { 308c76f0793SBaptiste Daroussin *rows = *y + 1; 309c76f0793SBaptiste Daroussin wresize(win, *rows, cols); 310c76f0793SBaptiste Daroussin } 311c76f0793SBaptiste Daroussin *x = 0; 312c76f0793SBaptiste Daroussin } 313c76f0793SBaptiste Daroussin j = *x; 314c76f0793SBaptiste Daroussin while (j < cols && i < len) { 315c76f0793SBaptiste Daroussin if (color && check_set_ncurses_attr(win, str+i)) { 316c76f0793SBaptiste Daroussin i += 3; 317c76f0793SBaptiste Daroussin } else { 318c76f0793SBaptiste Daroussin mvwaddch(win, *y, j, str[i]); 319c76f0793SBaptiste Daroussin i++; 320c76f0793SBaptiste Daroussin reallen--; 321c76f0793SBaptiste Daroussin j++; 322c76f0793SBaptiste Daroussin *x = j; 323c76f0793SBaptiste Daroussin } 324c76f0793SBaptiste Daroussin } 325c76f0793SBaptiste Daroussin } 326c76f0793SBaptiste Daroussin } 327c76f0793SBaptiste Daroussin 328c76f0793SBaptiste Daroussin int 329f499134dSBaptiste Daroussin get_text_properties(struct bsddialog_conf *conf, char *text, int *maxword, 330c76f0793SBaptiste Daroussin int *maxline, int *nlines) 331c76f0793SBaptiste Daroussin { 332c76f0793SBaptiste Daroussin int i, buflen, wordlen, linelen; 333c76f0793SBaptiste Daroussin 334c76f0793SBaptiste Daroussin 3358c4f4028SBaptiste Daroussin buflen = strlen(text) + 1; 336c76f0793SBaptiste Daroussin *maxword = 0; 337c76f0793SBaptiste Daroussin wordlen = 0; 338c76f0793SBaptiste Daroussin for (i=0; i < buflen; i++) { 3398c4f4028SBaptiste Daroussin if (text[i] == '\t' || text[i] == '\n' || text[i] == ' ' || text[i] == '\0') 340c76f0793SBaptiste Daroussin if (wordlen != 0) { 341c76f0793SBaptiste Daroussin *maxword = MAX(*maxword, wordlen); 342c76f0793SBaptiste Daroussin wordlen = 0; 343c76f0793SBaptiste Daroussin continue; 344c76f0793SBaptiste Daroussin } 3458c4f4028SBaptiste Daroussin if (conf->text.colors && is_ncurses_attr(text + i)) 346c76f0793SBaptiste Daroussin i += 3; 347c76f0793SBaptiste Daroussin else 348c76f0793SBaptiste Daroussin wordlen++; 349c76f0793SBaptiste Daroussin } 350c76f0793SBaptiste Daroussin 351c76f0793SBaptiste Daroussin *maxline = linelen = 0; 352c76f0793SBaptiste Daroussin *nlines = 1; 353c76f0793SBaptiste Daroussin for (i=0; i < buflen; i++) { 3548c4f4028SBaptiste Daroussin switch (text[i]) { 355c76f0793SBaptiste Daroussin case '\n': 356c76f0793SBaptiste Daroussin *nlines = *nlines + 1; 357c76f0793SBaptiste Daroussin case '\0': 358c76f0793SBaptiste Daroussin *maxline = MAX(*maxline, linelen); 359c76f0793SBaptiste Daroussin linelen = 0; 360c76f0793SBaptiste Daroussin break; 361c76f0793SBaptiste Daroussin default: 3628c4f4028SBaptiste Daroussin if (conf->text.colors && is_ncurses_attr(text + i)) 363c76f0793SBaptiste Daroussin i += 3; 364c76f0793SBaptiste Daroussin else 365c76f0793SBaptiste Daroussin linelen++; 366c76f0793SBaptiste Daroussin } 367c76f0793SBaptiste Daroussin } 368c76f0793SBaptiste Daroussin if (*nlines == 1 && *maxline == 0) 369c76f0793SBaptiste Daroussin *nlines = 0; 370c76f0793SBaptiste Daroussin 3718c4f4028SBaptiste Daroussin //free(buf); 372c76f0793SBaptiste Daroussin 373c76f0793SBaptiste Daroussin return 0; 374c76f0793SBaptiste Daroussin } 375c76f0793SBaptiste Daroussin 376f499134dSBaptiste Daroussin int 377f499134dSBaptiste Daroussin print_textpad(struct bsddialog_conf *conf, WINDOW *pad, int *rows, int cols, 378f499134dSBaptiste Daroussin char *text) 379c76f0793SBaptiste Daroussin { 3808c4f4028SBaptiste Daroussin char *string; 381c76f0793SBaptiste Daroussin int i, j, x, y; 382c76f0793SBaptiste Daroussin bool loop; 383c76f0793SBaptiste Daroussin 3848c4f4028SBaptiste Daroussin if ((string = malloc(strlen(text) + 1)) == NULL) 385c76f0793SBaptiste Daroussin RETURN_ERROR("Cannot build (analyze) text"); 386c76f0793SBaptiste Daroussin 387c76f0793SBaptiste Daroussin i = j = x = y = 0; 388c76f0793SBaptiste Daroussin loop = true; 389c76f0793SBaptiste Daroussin while (loop) { 3908c4f4028SBaptiste Daroussin string[j] = text[i]; 391c76f0793SBaptiste Daroussin 392c76f0793SBaptiste Daroussin if (string[j] == '\0' || string[j] == '\n' || 393c76f0793SBaptiste Daroussin string[j] == '\t' || string[j] == ' ') { 394c76f0793SBaptiste Daroussin if (j != 0) { 395c76f0793SBaptiste Daroussin string[j] = '\0'; 3968c4f4028SBaptiste Daroussin print_str(pad, rows, &y, &x, cols, string, 3978c4f4028SBaptiste Daroussin conf->text.colors); 398c76f0793SBaptiste Daroussin } 399c76f0793SBaptiste Daroussin } 400c76f0793SBaptiste Daroussin 4018c4f4028SBaptiste Daroussin switch (text[i]) { 402c76f0793SBaptiste Daroussin case '\0': 403c76f0793SBaptiste Daroussin loop = false; 404c76f0793SBaptiste Daroussin break; 405c76f0793SBaptiste Daroussin case '\n': 406c76f0793SBaptiste Daroussin j = -1; 407c76f0793SBaptiste Daroussin x = 0; 408c76f0793SBaptiste Daroussin y++; 409c76f0793SBaptiste Daroussin break; 410c76f0793SBaptiste Daroussin case '\t': 411c76f0793SBaptiste Daroussin for (j=0; j<4 /*tablen*/; j++) { 412c76f0793SBaptiste Daroussin x++; 413c76f0793SBaptiste Daroussin if (x >= cols) { 414c76f0793SBaptiste Daroussin x = 0; 415c76f0793SBaptiste Daroussin y++; 416c76f0793SBaptiste Daroussin } 417c76f0793SBaptiste Daroussin } 418c76f0793SBaptiste Daroussin j = -1; 419c76f0793SBaptiste Daroussin break; 420c76f0793SBaptiste Daroussin case ' ': 421c76f0793SBaptiste Daroussin x++; 422c76f0793SBaptiste Daroussin if (x >= cols) { 423c76f0793SBaptiste Daroussin x = 0; 424c76f0793SBaptiste Daroussin y++; 425c76f0793SBaptiste Daroussin } 426c76f0793SBaptiste Daroussin j = -1; 427c76f0793SBaptiste Daroussin } 428c76f0793SBaptiste Daroussin 429c76f0793SBaptiste Daroussin if (y >= *rows) { /* check for whitespaces */ 430c76f0793SBaptiste Daroussin *rows = y + 1; 431c76f0793SBaptiste Daroussin wresize(pad, *rows, cols); 432c76f0793SBaptiste Daroussin } 433c76f0793SBaptiste Daroussin 434c76f0793SBaptiste Daroussin j++; 435c76f0793SBaptiste Daroussin i++; 436c76f0793SBaptiste Daroussin } 437c76f0793SBaptiste Daroussin 438c76f0793SBaptiste Daroussin free(string); 439c76f0793SBaptiste Daroussin 440c76f0793SBaptiste Daroussin return 0; 441c76f0793SBaptiste Daroussin } 442c76f0793SBaptiste Daroussin 443c76f0793SBaptiste Daroussin /* autosize */ 444c76f0793SBaptiste Daroussin 445c76f0793SBaptiste Daroussin /* 446c76f0793SBaptiste Daroussin * max y, that is from 0 to LINES - 1 - t.shadowrows, 447c76f0793SBaptiste Daroussin * could not be max height but avoids problems with checksize 448c76f0793SBaptiste Daroussin */ 449f499134dSBaptiste Daroussin int widget_max_height(struct bsddialog_conf *conf) 450c76f0793SBaptiste Daroussin { 451c76f0793SBaptiste Daroussin int maxheight; 452c76f0793SBaptiste Daroussin 453f499134dSBaptiste Daroussin if ((maxheight = conf->shadow ? LINES - 1 - t.shadow.h : LINES - 1) <= 0) 454c76f0793SBaptiste Daroussin RETURN_ERROR("Terminal too small, LINES - shadow <= 0"); 455c76f0793SBaptiste Daroussin 456f499134dSBaptiste Daroussin if (conf->y > 0) 457f499134dSBaptiste Daroussin if ((maxheight -= conf->y) <=0) 458c76f0793SBaptiste Daroussin RETURN_ERROR("Terminal too small, LINES - shadow - y <= 0"); 459c76f0793SBaptiste Daroussin 460c76f0793SBaptiste Daroussin return maxheight; 461c76f0793SBaptiste Daroussin } 462c76f0793SBaptiste Daroussin 463c76f0793SBaptiste Daroussin /* 464c76f0793SBaptiste Daroussin * max x, that is from 0 to COLS - 1 - t.shadowcols, 465c76f0793SBaptiste Daroussin * * could not be max height but avoids problems with checksize 466c76f0793SBaptiste Daroussin */ 467f499134dSBaptiste Daroussin int widget_max_width(struct bsddialog_conf *conf) 468c76f0793SBaptiste Daroussin { 469c76f0793SBaptiste Daroussin int maxwidth; 470c76f0793SBaptiste Daroussin 471f499134dSBaptiste Daroussin if ((maxwidth = conf->shadow ? COLS - 1 - t.shadow.w : COLS - 1) <= 0) 472c76f0793SBaptiste Daroussin RETURN_ERROR("Terminal too small, COLS - shadow <= 0"); 473f499134dSBaptiste Daroussin if (conf->x > 0) 474f499134dSBaptiste Daroussin if ((maxwidth -= conf->x) <=0) 475c76f0793SBaptiste Daroussin RETURN_ERROR("Terminal too small, COLS - shadow - x <= 0"); 476c76f0793SBaptiste Daroussin 477c76f0793SBaptiste Daroussin return maxwidth; 478c76f0793SBaptiste Daroussin } 479c76f0793SBaptiste Daroussin 480c76f0793SBaptiste Daroussin int 481f499134dSBaptiste Daroussin set_widget_size(struct bsddialog_conf *conf, int rows, int cols, int *h, int *w) 482c76f0793SBaptiste Daroussin { 483c76f0793SBaptiste Daroussin int maxheight, maxwidth; 484c76f0793SBaptiste Daroussin 485c76f0793SBaptiste Daroussin if ((maxheight = widget_max_height(conf)) == BSDDIALOG_ERROR) 486c76f0793SBaptiste Daroussin return BSDDIALOG_ERROR; 487c76f0793SBaptiste Daroussin 488c76f0793SBaptiste Daroussin if (rows == BSDDIALOG_FULLSCREEN) 489c76f0793SBaptiste Daroussin *h = maxheight; 490c76f0793SBaptiste Daroussin else if (rows < BSDDIALOG_FULLSCREEN) 491c76f0793SBaptiste Daroussin RETURN_ERROR("Negative (less than -1) height"); 492c76f0793SBaptiste Daroussin else if (rows > BSDDIALOG_AUTOSIZE) { 493c76f0793SBaptiste Daroussin if ((*h = rows) > maxheight) 494c76f0793SBaptiste Daroussin RETURN_ERROR("Height too big (> terminal height - "\ 495c76f0793SBaptiste Daroussin "shadow"); 496c76f0793SBaptiste Daroussin } 497c76f0793SBaptiste Daroussin /* rows == AUTOSIZE: each widget has to set its size */ 498c76f0793SBaptiste Daroussin 499c76f0793SBaptiste Daroussin if ((maxwidth = widget_max_width(conf)) == BSDDIALOG_ERROR) 500c76f0793SBaptiste Daroussin return BSDDIALOG_ERROR; 501c76f0793SBaptiste Daroussin 502c76f0793SBaptiste Daroussin if (cols == BSDDIALOG_FULLSCREEN) 503c76f0793SBaptiste Daroussin *w = maxwidth; 504c76f0793SBaptiste Daroussin else if (cols < BSDDIALOG_FULLSCREEN) 505c76f0793SBaptiste Daroussin RETURN_ERROR("Negative (less than -1) width"); 506c76f0793SBaptiste Daroussin else if (cols > BSDDIALOG_AUTOSIZE) { 507c76f0793SBaptiste Daroussin if ((*w = cols) > maxwidth) 508c76f0793SBaptiste Daroussin RETURN_ERROR("Width too big (> terminal width - shadow)"); 509c76f0793SBaptiste Daroussin } 510c76f0793SBaptiste Daroussin /* cols == AUTOSIZE: each widget has to set its size */ 511c76f0793SBaptiste Daroussin 512c76f0793SBaptiste Daroussin return 0; 513c76f0793SBaptiste Daroussin } 514c76f0793SBaptiste Daroussin 515c76f0793SBaptiste Daroussin int 516f499134dSBaptiste Daroussin set_widget_position(struct bsddialog_conf *conf, int *y, int *x, int h, int w) 517c76f0793SBaptiste Daroussin { 518c76f0793SBaptiste Daroussin 519f499134dSBaptiste Daroussin if (conf->y == BSDDIALOG_CENTER) 520c76f0793SBaptiste Daroussin *y = LINES/2 - h/2; 521f499134dSBaptiste Daroussin else if (conf->y < BSDDIALOG_CENTER) 522c76f0793SBaptiste Daroussin RETURN_ERROR("Negative begin y (less than -1)"); 523f499134dSBaptiste Daroussin else if (conf->y >= LINES) 524c76f0793SBaptiste Daroussin RETURN_ERROR("Begin Y under the terminal"); 525c76f0793SBaptiste Daroussin else 526f499134dSBaptiste Daroussin *y = conf->y; 527c76f0793SBaptiste Daroussin 528f499134dSBaptiste Daroussin if ((*y + h + (conf->shadow ? (int) t.shadow.h : 0)) > LINES) 529c76f0793SBaptiste Daroussin RETURN_ERROR("The lower of the box under the terminal "\ 530c76f0793SBaptiste Daroussin "(begin Y + height (+ shadow) > terminal lines)"); 531c76f0793SBaptiste Daroussin 532c76f0793SBaptiste Daroussin 533f499134dSBaptiste Daroussin if (conf->x == BSDDIALOG_CENTER) 534c76f0793SBaptiste Daroussin *x = COLS/2 - w/2; 535f499134dSBaptiste Daroussin else if (conf->x < BSDDIALOG_CENTER) 536c76f0793SBaptiste Daroussin RETURN_ERROR("Negative begin x (less than -1)"); 537f499134dSBaptiste Daroussin else if (conf->x >= COLS) 538c76f0793SBaptiste Daroussin RETURN_ERROR("Begin X over the right of the terminal"); 539c76f0793SBaptiste Daroussin else 540f499134dSBaptiste Daroussin *x = conf->x; 541c76f0793SBaptiste Daroussin 542f499134dSBaptiste Daroussin if ((*x + w + (conf->shadow ? (int) t.shadow.w : 0)) > COLS) 543c76f0793SBaptiste Daroussin RETURN_ERROR("The right of the box over the terminal "\ 544c76f0793SBaptiste Daroussin "(begin X + width (+ shadow) > terminal cols)"); 545c76f0793SBaptiste Daroussin 546c76f0793SBaptiste Daroussin return 0; 547c76f0793SBaptiste Daroussin } 548c76f0793SBaptiste Daroussin 549c76f0793SBaptiste Daroussin /* Widgets builders */ 550c76f0793SBaptiste Daroussin void 551f499134dSBaptiste Daroussin draw_borders(struct bsddialog_conf *conf, WINDOW *win, int rows, int cols, 552c76f0793SBaptiste Daroussin enum elevation elev) 553c76f0793SBaptiste Daroussin { 554c76f0793SBaptiste Daroussin int leftcolor, rightcolor; 555c76f0793SBaptiste Daroussin int ls, rs, ts, bs, tl, tr, bl, br; 556c76f0793SBaptiste Daroussin int ltee, rtee; 557c76f0793SBaptiste Daroussin 558c76f0793SBaptiste Daroussin ls = rs = ACS_VLINE; 559c76f0793SBaptiste Daroussin ts = bs = ACS_HLINE; 560c76f0793SBaptiste Daroussin tl = ACS_ULCORNER; 561c76f0793SBaptiste Daroussin tr = ACS_URCORNER; 562c76f0793SBaptiste Daroussin bl = ACS_LLCORNER; 563c76f0793SBaptiste Daroussin br = ACS_LRCORNER; 564c76f0793SBaptiste Daroussin ltee = ACS_LTEE; 565c76f0793SBaptiste Daroussin rtee = ACS_RTEE; 566c76f0793SBaptiste Daroussin 567f499134dSBaptiste Daroussin if (conf->no_lines == false) { 568f499134dSBaptiste Daroussin if (conf->ascii_lines) { 569c76f0793SBaptiste Daroussin ls = rs = '|'; 570c76f0793SBaptiste Daroussin ts = bs = '-'; 571c76f0793SBaptiste Daroussin tl = tr = bl = br = ltee = rtee = '+'; 572c76f0793SBaptiste Daroussin } 5738c4f4028SBaptiste Daroussin leftcolor = elev == RAISED ? 5748c4f4028SBaptiste Daroussin t.dialog.lineraisecolor : t.dialog.linelowercolor; 5758c4f4028SBaptiste Daroussin rightcolor = elev == RAISED ? 5768c4f4028SBaptiste Daroussin t.dialog.linelowercolor : t.dialog.lineraisecolor; 577c76f0793SBaptiste Daroussin wattron(win, leftcolor); 578c76f0793SBaptiste Daroussin wborder(win, ls, rs, ts, bs, tl, tr, bl, br); 579c76f0793SBaptiste Daroussin wattroff(win, leftcolor); 580c76f0793SBaptiste Daroussin 581c76f0793SBaptiste Daroussin wattron(win, rightcolor); 582c76f0793SBaptiste Daroussin mvwaddch(win, 0, cols-1, tr); 583c76f0793SBaptiste Daroussin mvwvline(win, 1, cols-1, rs, rows-2); 584c76f0793SBaptiste Daroussin mvwaddch(win, rows-1, cols-1, br); 585c76f0793SBaptiste Daroussin mvwhline(win, rows-1, 1, bs, cols-2); 586c76f0793SBaptiste Daroussin wattroff(win, rightcolor); 587c76f0793SBaptiste Daroussin } 588c76f0793SBaptiste Daroussin } 589c76f0793SBaptiste Daroussin 590c76f0793SBaptiste Daroussin WINDOW * 591f499134dSBaptiste Daroussin new_boxed_window(struct bsddialog_conf *conf, int y, int x, int rows, int cols, 592c76f0793SBaptiste Daroussin enum elevation elev) 593c76f0793SBaptiste Daroussin { 594c76f0793SBaptiste Daroussin WINDOW *win; 595c76f0793SBaptiste Daroussin 596c76f0793SBaptiste Daroussin if ((win = newwin(rows, cols, y, x)) == NULL) { 597c76f0793SBaptiste Daroussin set_error_string("Cannot build boxed window"); 598c76f0793SBaptiste Daroussin return NULL; 599c76f0793SBaptiste Daroussin } 600c76f0793SBaptiste Daroussin 6018c4f4028SBaptiste Daroussin wbkgd(win, t.dialog.color); 602c76f0793SBaptiste Daroussin 603c76f0793SBaptiste Daroussin draw_borders(conf, win, rows, cols, elev); 604c76f0793SBaptiste Daroussin 605c76f0793SBaptiste Daroussin return win; 606c76f0793SBaptiste Daroussin } 607c76f0793SBaptiste Daroussin 608c76f0793SBaptiste Daroussin /* 609c76f0793SBaptiste Daroussin * `enum elevation elev` could be useless because it should be always RAISED, 610c76f0793SBaptiste Daroussin * to check at the end. 611c76f0793SBaptiste Daroussin */ 612c76f0793SBaptiste Daroussin static int 613f499134dSBaptiste Daroussin draw_widget_withtextpad(struct bsddialog_conf *conf, WINDOW *shadow, 614c76f0793SBaptiste Daroussin WINDOW *widget, int h, int w, enum elevation elev, 615c76f0793SBaptiste Daroussin WINDOW *textpad, int *htextpad, char *text, bool buttons) 616c76f0793SBaptiste Daroussin { 617c76f0793SBaptiste Daroussin int ts, ltee, rtee; 6188c4f4028SBaptiste Daroussin int colordelimtitle; 619c76f0793SBaptiste Daroussin 620f499134dSBaptiste Daroussin ts = conf->ascii_lines ? '-' : ACS_HLINE; 621f499134dSBaptiste Daroussin ltee = conf->ascii_lines ? '+' : ACS_LTEE; 622f499134dSBaptiste Daroussin rtee = conf->ascii_lines ? '+' : ACS_RTEE; 6238c4f4028SBaptiste Daroussin colordelimtitle = elev == RAISED ? 6248c4f4028SBaptiste Daroussin t.dialog.lineraisecolor : t.dialog.linelowercolor; 625c76f0793SBaptiste Daroussin 626c76f0793SBaptiste Daroussin if (shadow != NULL) 627c76f0793SBaptiste Daroussin wnoutrefresh(shadow); 628c76f0793SBaptiste Daroussin 629c76f0793SBaptiste Daroussin // move / resize now or the caller? 630c76f0793SBaptiste Daroussin draw_borders(conf, widget, h, w, elev); 631c76f0793SBaptiste Daroussin 632f499134dSBaptiste Daroussin if (conf->title != NULL) { 6338c4f4028SBaptiste Daroussin if (t.dialog.delimtitle && conf->no_lines == false) { 6348c4f4028SBaptiste Daroussin wattron(widget, colordelimtitle); 635f499134dSBaptiste Daroussin mvwaddch(widget, 0, w/2 - strlen(conf->title)/2 - 1, rtee); 6368c4f4028SBaptiste Daroussin wattroff(widget, colordelimtitle); 637c76f0793SBaptiste Daroussin } 6388c4f4028SBaptiste Daroussin wattron(widget, t.dialog.titlecolor); 639f499134dSBaptiste Daroussin mvwaddstr(widget, 0, w/2 - strlen(conf->title)/2, conf->title); 6408c4f4028SBaptiste Daroussin wattroff(widget, t.dialog.titlecolor); 6418c4f4028SBaptiste Daroussin if (t.dialog.delimtitle && conf->no_lines == false) { 6428c4f4028SBaptiste Daroussin wattron(widget, colordelimtitle); 643c76f0793SBaptiste Daroussin waddch(widget, ltee); 6448c4f4028SBaptiste Daroussin wattroff(widget, colordelimtitle); 645c76f0793SBaptiste Daroussin } 646c76f0793SBaptiste Daroussin } 647c76f0793SBaptiste Daroussin 6488c4f4028SBaptiste Daroussin if (conf->bottomtitle != NULL) { 6498c4f4028SBaptiste Daroussin wattron(widget, t.dialog.bottomtitlecolor); 6508c4f4028SBaptiste Daroussin wmove(widget, h - 1, w/2 - strlen(conf->bottomtitle)/2 - 1); 651c76f0793SBaptiste Daroussin waddch(widget, '['); 6528c4f4028SBaptiste Daroussin waddstr(widget, conf->bottomtitle); 653c76f0793SBaptiste Daroussin waddch(widget, ']'); 6548c4f4028SBaptiste Daroussin wattroff(widget, t.dialog.bottomtitlecolor); 655c76f0793SBaptiste Daroussin } 656c76f0793SBaptiste Daroussin 657f499134dSBaptiste Daroussin //if (textpad == NULL && text != NULL) /* no pad, text null for textbox */ 658f499134dSBaptiste Daroussin // print_text(conf, widget, 1, 2, w-3, text); 659c76f0793SBaptiste Daroussin 660f499134dSBaptiste Daroussin if (buttons && conf->no_lines == false) { 6618c4f4028SBaptiste Daroussin wattron(widget, t.dialog.lineraisecolor); 662c76f0793SBaptiste Daroussin mvwaddch(widget, h-3, 0, ltee); 663c76f0793SBaptiste Daroussin mvwhline(widget, h-3, 1, ts, w-2); 6648c4f4028SBaptiste Daroussin wattroff(widget, t.dialog.lineraisecolor); 665c76f0793SBaptiste Daroussin 6668c4f4028SBaptiste Daroussin wattron(widget, t.dialog.linelowercolor); 667c76f0793SBaptiste Daroussin mvwaddch(widget, h-3, w-1, rtee); 6688c4f4028SBaptiste Daroussin wattroff(widget, t.dialog.linelowercolor); 669c76f0793SBaptiste Daroussin } 670c76f0793SBaptiste Daroussin 671c76f0793SBaptiste Daroussin wnoutrefresh(widget); 672c76f0793SBaptiste Daroussin 673c76f0793SBaptiste Daroussin if (textpad == NULL) 674c76f0793SBaptiste Daroussin return 0; /* widget_init() ends */ 675c76f0793SBaptiste Daroussin 676c76f0793SBaptiste Daroussin if (text != NULL) /* programbox etc */ 677c76f0793SBaptiste Daroussin if (print_textpad(conf, textpad, htextpad, 678f499134dSBaptiste Daroussin w - HBORDERS - t.text.hmargin * 2, text) !=0) 679c76f0793SBaptiste Daroussin return BSDDIALOG_ERROR; 680c76f0793SBaptiste Daroussin 681c76f0793SBaptiste Daroussin return 0; 682c76f0793SBaptiste Daroussin } 683c76f0793SBaptiste Daroussin 684c76f0793SBaptiste Daroussin /* 685c76f0793SBaptiste Daroussin * `enum elevation elev` could be useless because it should be always RAISED, 686c76f0793SBaptiste Daroussin * to check at the end. 687c76f0793SBaptiste Daroussin */ 688c76f0793SBaptiste Daroussin int 689f499134dSBaptiste Daroussin update_widget_withtextpad(struct bsddialog_conf *conf, WINDOW *shadow, 690c76f0793SBaptiste Daroussin WINDOW *widget, int h, int w, enum elevation elev, 691c76f0793SBaptiste Daroussin WINDOW *textpad, int *htextpad, char *text, bool buttons) 692c76f0793SBaptiste Daroussin { 693c76f0793SBaptiste Daroussin int error; 694c76f0793SBaptiste Daroussin 695c76f0793SBaptiste Daroussin /* nothing for now */ 696c76f0793SBaptiste Daroussin 697c76f0793SBaptiste Daroussin error = draw_widget_withtextpad(conf, shadow, widget, h, w, 698c76f0793SBaptiste Daroussin elev, textpad, htextpad, text, buttons); 699c76f0793SBaptiste Daroussin 700c76f0793SBaptiste Daroussin return error; 701c76f0793SBaptiste Daroussin } 702c76f0793SBaptiste Daroussin 703c76f0793SBaptiste Daroussin /* 704c76f0793SBaptiste Daroussin * `enum elevation elev` could be useless because it should be always RAISED, 705c76f0793SBaptiste Daroussin * to check at the end. 706c76f0793SBaptiste Daroussin */ 707c76f0793SBaptiste Daroussin int 708f499134dSBaptiste Daroussin new_widget_withtextpad(struct bsddialog_conf *conf, WINDOW **shadow, 709c76f0793SBaptiste Daroussin WINDOW **widget, int y, int x, int h, int w, enum elevation elev, 710c76f0793SBaptiste Daroussin WINDOW **textpad, int *htextpad, char *text, bool buttons) 711c76f0793SBaptiste Daroussin { 712c76f0793SBaptiste Daroussin int error; 713c76f0793SBaptiste Daroussin 714f499134dSBaptiste Daroussin if (conf->shadow) { 715f499134dSBaptiste Daroussin *shadow = newwin(h, w, y + t.shadow.h, x + t.shadow.w); 716c76f0793SBaptiste Daroussin if (*shadow == NULL) 717c76f0793SBaptiste Daroussin RETURN_ERROR("Cannot build shadow"); 718f499134dSBaptiste Daroussin wbkgd(*shadow, t.shadow.color); 719c76f0793SBaptiste Daroussin } 720c76f0793SBaptiste Daroussin 721c76f0793SBaptiste Daroussin if ((*widget = new_boxed_window(conf, y, x, h, w, elev)) == NULL) { 722f499134dSBaptiste Daroussin if (conf->shadow) 723c76f0793SBaptiste Daroussin delwin(*shadow); 724c76f0793SBaptiste Daroussin return BSDDIALOG_ERROR; 725c76f0793SBaptiste Daroussin } 726c76f0793SBaptiste Daroussin 727c76f0793SBaptiste Daroussin if (textpad == NULL) { /* widget_init() */ 728c76f0793SBaptiste Daroussin error = draw_widget_withtextpad(conf, *shadow, *widget, h, w, 729c76f0793SBaptiste Daroussin elev, NULL, NULL, text, buttons); 730c76f0793SBaptiste Daroussin return error; 731c76f0793SBaptiste Daroussin } 732c76f0793SBaptiste Daroussin 733c76f0793SBaptiste Daroussin if (text != NULL) { /* programbox etc */ 734c76f0793SBaptiste Daroussin *htextpad = 1; 735f499134dSBaptiste Daroussin *textpad = newpad(*htextpad, w - HBORDERS - t.text.hmargin * 2); 736c76f0793SBaptiste Daroussin if (*textpad == NULL) { 737c76f0793SBaptiste Daroussin delwin(*textpad); 738f499134dSBaptiste Daroussin if (conf->shadow) 739c76f0793SBaptiste Daroussin delwin(*shadow); 740c76f0793SBaptiste Daroussin RETURN_ERROR("Cannot build the pad window for text"); 741c76f0793SBaptiste Daroussin } 7428c4f4028SBaptiste Daroussin wbkgd(*textpad, t.dialog.color); 743c76f0793SBaptiste Daroussin } 744c76f0793SBaptiste Daroussin 745c76f0793SBaptiste Daroussin error = draw_widget_withtextpad(conf, *shadow, *widget, h, w, elev, 746c76f0793SBaptiste Daroussin *textpad, htextpad, text, buttons); 747c76f0793SBaptiste Daroussin 748c76f0793SBaptiste Daroussin return error; 749c76f0793SBaptiste Daroussin } 750c76f0793SBaptiste Daroussin 751c76f0793SBaptiste Daroussin void 752f499134dSBaptiste Daroussin end_widget_withtextpad(struct bsddialog_conf *conf, WINDOW *window, int h, int w, 753c76f0793SBaptiste Daroussin WINDOW *textpad, WINDOW *shadow) 754c76f0793SBaptiste Daroussin { 755c76f0793SBaptiste Daroussin int y, x; 756c76f0793SBaptiste Daroussin 757c76f0793SBaptiste Daroussin getbegyx(window, y, x); /* for clear, add y & x to args? */ 758c76f0793SBaptiste Daroussin 759f499134dSBaptiste Daroussin if (conf->sleep > 0) 760f499134dSBaptiste Daroussin sleep(conf->sleep); 761c76f0793SBaptiste Daroussin 762c76f0793SBaptiste Daroussin if (textpad != NULL) 763c76f0793SBaptiste Daroussin delwin(textpad); 764c76f0793SBaptiste Daroussin 765c76f0793SBaptiste Daroussin delwin(window); 766c76f0793SBaptiste Daroussin 767f499134dSBaptiste Daroussin if (conf->shadow) 768c76f0793SBaptiste Daroussin delwin(shadow); 769c76f0793SBaptiste Daroussin 770f499134dSBaptiste Daroussin if (conf->clear) 771c76f0793SBaptiste Daroussin hide_widget(y, x, h, w, shadow != NULL); 772c76f0793SBaptiste Daroussin 773f499134dSBaptiste Daroussin if (conf->get_height != NULL) 774f499134dSBaptiste Daroussin *conf->get_height = h; 775f499134dSBaptiste Daroussin if (conf->get_width != NULL) 776f499134dSBaptiste Daroussin *conf->get_width = w; 777c76f0793SBaptiste Daroussin } 778