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 #include <stdlib.h> 31c76f0793SBaptiste Daroussin #include <string.h> 32c76f0793SBaptiste Daroussin #include <unistd.h> 33c76f0793SBaptiste Daroussin 34c76f0793SBaptiste Daroussin #ifdef PORTNCURSES 35*8c4f4028SBaptiste Daroussin #include <ncurses/ncurses.h> 36c76f0793SBaptiste Daroussin #else 37*8c4f4028SBaptiste Daroussin #include <ncurses.h> 38c76f0793SBaptiste Daroussin #endif 39c76f0793SBaptiste Daroussin 40c76f0793SBaptiste Daroussin #include "bsddialog.h" 41c76f0793SBaptiste Daroussin #include "lib_util.h" 42c76f0793SBaptiste Daroussin #include "bsddialog_theme.h" 43c76f0793SBaptiste Daroussin 44c76f0793SBaptiste Daroussin extern struct bsddialog_theme t; 45c76f0793SBaptiste Daroussin 46c76f0793SBaptiste Daroussin /* Error buffer */ 47c76f0793SBaptiste Daroussin 48c76f0793SBaptiste Daroussin #define ERRBUFLEN 1024 49c76f0793SBaptiste Daroussin static char errorbuffer[ERRBUFLEN]; 50c76f0793SBaptiste Daroussin 51c76f0793SBaptiste Daroussin const char *get_error_string(void) 52c76f0793SBaptiste Daroussin { 53c76f0793SBaptiste Daroussin return errorbuffer; 54c76f0793SBaptiste Daroussin } 55c76f0793SBaptiste Daroussin 56c76f0793SBaptiste Daroussin void set_error_string(char *str) 57c76f0793SBaptiste Daroussin { 58c76f0793SBaptiste Daroussin 59c76f0793SBaptiste Daroussin strncpy(errorbuffer, str, ERRBUFLEN-1); 60c76f0793SBaptiste Daroussin } 61c76f0793SBaptiste Daroussin 62c76f0793SBaptiste Daroussin /* cleaner */ 63c76f0793SBaptiste Daroussin int hide_widget(int y, int x, int h, int w, bool withshadow) 64c76f0793SBaptiste Daroussin { 65c76f0793SBaptiste Daroussin WINDOW *clear; 66c76f0793SBaptiste Daroussin 67c76f0793SBaptiste Daroussin /* no check: y, x, h and w are checked by the builders */ 68f499134dSBaptiste Daroussin if ((clear = newwin(h, w, y + t.shadow.h, x + t.shadow.w)) == NULL) 69c76f0793SBaptiste Daroussin RETURN_ERROR("Cannot hide the widget"); 70f499134dSBaptiste Daroussin wbkgd(clear, t.terminal.color); 71c76f0793SBaptiste Daroussin 72c76f0793SBaptiste Daroussin if (withshadow) 73c76f0793SBaptiste Daroussin wrefresh(clear); 74c76f0793SBaptiste Daroussin 75c76f0793SBaptiste Daroussin mvwin(clear, y, x); 76c76f0793SBaptiste Daroussin wrefresh(clear); 77c76f0793SBaptiste Daroussin 78c76f0793SBaptiste Daroussin delwin(clear); 79c76f0793SBaptiste Daroussin 80c76f0793SBaptiste Daroussin return 0; 81c76f0793SBaptiste Daroussin } 82c76f0793SBaptiste Daroussin 83c76f0793SBaptiste Daroussin /* F1 help */ 84f499134dSBaptiste Daroussin int f1help(struct bsddialog_conf *conf) 85c76f0793SBaptiste Daroussin { 86c76f0793SBaptiste Daroussin int output; 87*8c4f4028SBaptiste Daroussin struct bsddialog_conf hconf; 88c76f0793SBaptiste Daroussin 89*8c4f4028SBaptiste Daroussin //memcpy(&hconf, conf, sizeof(struct bsddialog_conf)); 90*8c4f4028SBaptiste Daroussin bsddialog_initconf(&hconf); 91*8c4f4028SBaptiste Daroussin hconf.title = "HELP"; 92*8c4f4028SBaptiste Daroussin hconf.button.ok_label = "EXIT"; 93*8c4f4028SBaptiste Daroussin hconf.clear = true; 94*8c4f4028SBaptiste Daroussin hconf.ascii_lines = conf->ascii_lines; 95*8c4f4028SBaptiste Daroussin hconf.no_lines = conf->no_lines; 96*8c4f4028SBaptiste Daroussin hconf.shadow = conf->shadow; 97*8c4f4028SBaptiste Daroussin hconf.text.colors = conf->text.colors; 98c76f0793SBaptiste Daroussin 99*8c4f4028SBaptiste Daroussin output = BSDDIALOG_OK; 100*8c4f4028SBaptiste Daroussin if (conf->f1_message != NULL) 101*8c4f4028SBaptiste Daroussin output = bsddialog_msgbox(&hconf, conf->f1_message, 0, 0); 102c76f0793SBaptiste Daroussin 103*8c4f4028SBaptiste Daroussin if (output != BSDDIALOG_ERROR && conf->f1_file != NULL) 104*8c4f4028SBaptiste Daroussin output = bsddialog_textbox(&hconf, conf->f1_file, 0, 0); 105*8c4f4028SBaptiste Daroussin 106*8c4f4028SBaptiste Daroussin return (output == BSDDIALOG_ERROR ? BSDDIALOG_ERROR : 0); 107c76f0793SBaptiste Daroussin } 108c76f0793SBaptiste Daroussin 109c76f0793SBaptiste Daroussin /* Buttons */ 110c76f0793SBaptiste Daroussin void 111c76f0793SBaptiste Daroussin draw_button(WINDOW *window, int y, int x, int size, char *text, bool selected, 112c76f0793SBaptiste Daroussin bool shortkey) 113c76f0793SBaptiste Daroussin { 114c76f0793SBaptiste Daroussin int i, color_arrows, color_shortkey, color_button; 115c76f0793SBaptiste Daroussin 116c76f0793SBaptiste Daroussin if (selected) { 117f499134dSBaptiste Daroussin color_arrows = t.button.f_delimcolor; 118f499134dSBaptiste Daroussin color_shortkey = t.button.f_shortcutcolor; 119f499134dSBaptiste Daroussin color_button = t.button.f_color; 120c76f0793SBaptiste Daroussin } else { 121f499134dSBaptiste Daroussin color_arrows = t.button.delimcolor; 122f499134dSBaptiste Daroussin color_shortkey = t.button.shortcutcolor; 123f499134dSBaptiste Daroussin color_button = t.button.color; 124c76f0793SBaptiste Daroussin } 125c76f0793SBaptiste Daroussin 126c76f0793SBaptiste Daroussin wattron(window, color_arrows); 127f499134dSBaptiste Daroussin mvwaddch(window, y, x, t.button.leftch); 128c76f0793SBaptiste Daroussin wattroff(window, color_arrows); 129c76f0793SBaptiste Daroussin wattron(window, color_button); 130c76f0793SBaptiste Daroussin for(i = 1; i < size - 1; i++) 131c76f0793SBaptiste Daroussin waddch(window, ' '); 132c76f0793SBaptiste Daroussin wattroff(window, color_button); 133c76f0793SBaptiste Daroussin wattron(window, color_arrows); 134f499134dSBaptiste Daroussin mvwaddch(window, y, x + i, t.button.rightch); 135c76f0793SBaptiste Daroussin wattroff(window, color_arrows); 136c76f0793SBaptiste Daroussin 137c76f0793SBaptiste Daroussin x = x + 1 + ((size - 2 - strlen(text))/2); 138c76f0793SBaptiste Daroussin wattron(window, color_button); 139c76f0793SBaptiste Daroussin mvwaddstr(window, y, x, text); 140c76f0793SBaptiste Daroussin wattroff(window, color_button); 141c76f0793SBaptiste Daroussin 142c76f0793SBaptiste Daroussin if (shortkey) { 143c76f0793SBaptiste Daroussin wattron(window, color_shortkey); 144c76f0793SBaptiste Daroussin mvwaddch(window, y, x, text[0]); 145c76f0793SBaptiste Daroussin wattroff(window, color_shortkey); 146c76f0793SBaptiste Daroussin } 147c76f0793SBaptiste Daroussin } 148c76f0793SBaptiste Daroussin 149c76f0793SBaptiste Daroussin void 150c76f0793SBaptiste Daroussin draw_buttons(WINDOW *window, int y, int cols, struct buttons bs, bool shortkey) 151c76f0793SBaptiste Daroussin { 152c76f0793SBaptiste Daroussin int i, x, start_x; 153c76f0793SBaptiste Daroussin 154f499134dSBaptiste Daroussin start_x = bs.sizebutton * bs.nbuttons + (bs.nbuttons - 1) * t.button.space; 155c76f0793SBaptiste Daroussin start_x = cols/2 - start_x/2; 156c76f0793SBaptiste Daroussin 157c76f0793SBaptiste Daroussin for (i = 0; i < (int) bs.nbuttons; i++) { 158f499134dSBaptiste Daroussin x = i * (bs.sizebutton + t.button.space); 159c76f0793SBaptiste Daroussin draw_button(window, y, start_x + x, bs.sizebutton, bs.label[i], 160c76f0793SBaptiste Daroussin i == bs.curr, shortkey); 161c76f0793SBaptiste Daroussin } 162c76f0793SBaptiste Daroussin } 163c76f0793SBaptiste Daroussin 164c76f0793SBaptiste Daroussin void 165f499134dSBaptiste Daroussin get_buttons(struct bsddialog_conf *conf, struct buttons *bs, char *yesoklabel, 166c76f0793SBaptiste Daroussin char *extralabel, char *nocancellabel, char *helplabel) 167c76f0793SBaptiste Daroussin { 168c76f0793SBaptiste Daroussin int i; 169c76f0793SBaptiste Daroussin #define SIZEBUTTON 8 170c76f0793SBaptiste Daroussin #define DEFAULT_BUTTON_LABEL LABEL_ok_label 171*8c4f4028SBaptiste Daroussin #define DEFAULT_BUTTON_VALUE BSDDIALOG_OK 172c76f0793SBaptiste Daroussin 173c76f0793SBaptiste Daroussin 174c76f0793SBaptiste Daroussin bs->nbuttons = 0; 175c76f0793SBaptiste Daroussin bs->curr = 0; 176c76f0793SBaptiste Daroussin bs->sizebutton = 0; 177c76f0793SBaptiste Daroussin 178*8c4f4028SBaptiste Daroussin if (yesoklabel != NULL && conf->button.without_ok == false) { 179c76f0793SBaptiste Daroussin bs->label[0] = yesoklabel; 180*8c4f4028SBaptiste Daroussin bs->value[0] = BSDDIALOG_OK; 181c76f0793SBaptiste Daroussin bs->nbuttons += 1; 182c76f0793SBaptiste Daroussin } 183c76f0793SBaptiste Daroussin 184*8c4f4028SBaptiste Daroussin if (extralabel != NULL && conf->button.with_extra) { 185c76f0793SBaptiste Daroussin bs->label[bs->nbuttons] = extralabel; 186c76f0793SBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_EXTRA; 187c76f0793SBaptiste Daroussin bs->nbuttons += 1; 188c76f0793SBaptiste Daroussin } 189c76f0793SBaptiste Daroussin 190*8c4f4028SBaptiste Daroussin if (nocancellabel != NULL && conf->button.without_cancel == false) { 191c76f0793SBaptiste Daroussin bs->label[bs->nbuttons] = nocancellabel; 192*8c4f4028SBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_CANCEL; 193*8c4f4028SBaptiste Daroussin if (conf->button.default_cancel) 194c76f0793SBaptiste Daroussin bs->curr = bs->nbuttons; 195c76f0793SBaptiste Daroussin bs->nbuttons += 1; 196c76f0793SBaptiste Daroussin } 197c76f0793SBaptiste Daroussin 198*8c4f4028SBaptiste Daroussin if (helplabel != NULL && conf->button.with_help) { 199c76f0793SBaptiste Daroussin bs->label[bs->nbuttons] = helplabel; 200c76f0793SBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_HELP; 201c76f0793SBaptiste Daroussin bs->nbuttons += 1; 202c76f0793SBaptiste Daroussin } 203c76f0793SBaptiste Daroussin 204f499134dSBaptiste Daroussin if (conf->button.generic1_label != NULL) { 205f499134dSBaptiste Daroussin bs->label[bs->nbuttons] = conf->button.generic1_label; 206f499134dSBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_GENERIC1; 207f499134dSBaptiste Daroussin bs->nbuttons += 1; 208f499134dSBaptiste Daroussin } 209f499134dSBaptiste Daroussin 210f499134dSBaptiste Daroussin if (conf->button.generic2_label != NULL) { 211f499134dSBaptiste Daroussin bs->label[bs->nbuttons] = conf->button.generic2_label; 212f499134dSBaptiste Daroussin bs->value[bs->nbuttons] = BSDDIALOG_GENERIC2; 213f499134dSBaptiste Daroussin bs->nbuttons += 1; 214f499134dSBaptiste Daroussin } 215f499134dSBaptiste Daroussin 216c76f0793SBaptiste Daroussin if (bs->nbuttons == 0) { 217c76f0793SBaptiste Daroussin bs->label[0] = DEFAULT_BUTTON_LABEL; 218c76f0793SBaptiste Daroussin bs->value[0] = DEFAULT_BUTTON_VALUE; 219c76f0793SBaptiste Daroussin bs->nbuttons = 1; 220c76f0793SBaptiste Daroussin } 221c76f0793SBaptiste Daroussin 222f499134dSBaptiste Daroussin if (conf->button.default_label != NULL) { 223c76f0793SBaptiste Daroussin for (i=0; i<(int)bs->nbuttons; i++) { 224f499134dSBaptiste Daroussin if (strcmp(conf->button.default_label, bs->label[i]) == 0) 225c76f0793SBaptiste Daroussin bs->curr = i; 226c76f0793SBaptiste Daroussin } 227c76f0793SBaptiste Daroussin } 228c76f0793SBaptiste Daroussin 229c76f0793SBaptiste Daroussin bs->sizebutton = MAX(SIZEBUTTON - 2, strlen(bs->label[0])); 230c76f0793SBaptiste Daroussin for (i=1; i < (int) bs->nbuttons; i++) 231c76f0793SBaptiste Daroussin bs->sizebutton = MAX(bs->sizebutton, strlen(bs->label[i])); 232c76f0793SBaptiste Daroussin bs->sizebutton += 2; 233c76f0793SBaptiste Daroussin } 234c76f0793SBaptiste Daroussin 235c76f0793SBaptiste Daroussin /* Text */ 236f499134dSBaptiste Daroussin static bool is_ncurses_attr(char *text) 237f499134dSBaptiste Daroussin { 238c76f0793SBaptiste Daroussin 239f499134dSBaptiste Daroussin if (strnlen(text, 3) < 3) 240f499134dSBaptiste Daroussin return false; 241f499134dSBaptiste Daroussin 242f499134dSBaptiste Daroussin if (text[0] != '\\' || text[1] != 'Z') 243f499134dSBaptiste Daroussin return false; 244f499134dSBaptiste Daroussin 245f499134dSBaptiste Daroussin return (strchr("nbBrRuU01234567", text[2]) == NULL ? false : true); 246f499134dSBaptiste Daroussin } 247c76f0793SBaptiste Daroussin 248c76f0793SBaptiste Daroussin static bool check_set_ncurses_attr(WINDOW *win, char *text) 249c76f0793SBaptiste Daroussin { 250c76f0793SBaptiste Daroussin 251f499134dSBaptiste Daroussin if (is_ncurses_attr(text) == false) 252c76f0793SBaptiste Daroussin return false; 253c76f0793SBaptiste Daroussin 254f499134dSBaptiste Daroussin if ((text[2] - '0') >= 0 && (text[2] - '0') < 8) { 255*8c4f4028SBaptiste Daroussin wattron(win, bsddialog_color( text[2] - '0', COLOR_WHITE, 0)); 256c76f0793SBaptiste Daroussin return true; 257c76f0793SBaptiste Daroussin } 258c76f0793SBaptiste Daroussin 259c76f0793SBaptiste Daroussin switch (text[2]) { 260c76f0793SBaptiste Daroussin case 'n': 261c76f0793SBaptiste Daroussin wattrset(win, A_NORMAL); 262c76f0793SBaptiste Daroussin break; 263c76f0793SBaptiste Daroussin case 'b': 264c76f0793SBaptiste Daroussin wattron(win, A_BOLD); 265c76f0793SBaptiste Daroussin break; 266c76f0793SBaptiste Daroussin case 'B': 267c76f0793SBaptiste Daroussin wattroff(win, A_BOLD); 268c76f0793SBaptiste Daroussin break; 269c76f0793SBaptiste Daroussin case 'r': 270c76f0793SBaptiste Daroussin wattron(win, A_REVERSE); 271c76f0793SBaptiste Daroussin break; 272c76f0793SBaptiste Daroussin case 'R': 273c76f0793SBaptiste Daroussin wattroff(win, A_REVERSE); 274c76f0793SBaptiste Daroussin break; 275c76f0793SBaptiste Daroussin case 'u': 276c76f0793SBaptiste Daroussin wattron(win, A_UNDERLINE); 277c76f0793SBaptiste Daroussin break; 278c76f0793SBaptiste Daroussin case 'U': 279c76f0793SBaptiste Daroussin wattroff(win, A_UNDERLINE); 280c76f0793SBaptiste Daroussin break; 281c76f0793SBaptiste Daroussin } 282c76f0793SBaptiste Daroussin 283c76f0793SBaptiste Daroussin return true; 284c76f0793SBaptiste Daroussin } 285c76f0793SBaptiste Daroussin 286c76f0793SBaptiste Daroussin static void 287c76f0793SBaptiste Daroussin print_str(WINDOW *win, int *rows, int *y, int *x, int cols, char *str, bool color) 288c76f0793SBaptiste Daroussin { 289c76f0793SBaptiste Daroussin int i, j, len, reallen; 290c76f0793SBaptiste Daroussin 291c76f0793SBaptiste Daroussin if(strlen(str) == 0) 292c76f0793SBaptiste Daroussin return; 293c76f0793SBaptiste Daroussin 294c76f0793SBaptiste Daroussin len = reallen = strlen(str); 295c76f0793SBaptiste Daroussin if (color) { 296c76f0793SBaptiste Daroussin i=0; 297c76f0793SBaptiste Daroussin while (i < len) { 298c76f0793SBaptiste Daroussin if (is_ncurses_attr(str+i)) 299c76f0793SBaptiste Daroussin reallen -= 3; 300c76f0793SBaptiste Daroussin i++; 301c76f0793SBaptiste Daroussin } 302c76f0793SBaptiste Daroussin } 303c76f0793SBaptiste Daroussin 304c76f0793SBaptiste Daroussin i = 0; 305c76f0793SBaptiste Daroussin while (i < len) { 306c76f0793SBaptiste Daroussin if (*x + reallen > cols) { 307c76f0793SBaptiste Daroussin *y = (*x != 0 ? *y+1 : *y); 308c76f0793SBaptiste Daroussin if (*y >= *rows) { 309c76f0793SBaptiste Daroussin *rows = *y + 1; 310c76f0793SBaptiste Daroussin wresize(win, *rows, cols); 311c76f0793SBaptiste Daroussin } 312c76f0793SBaptiste Daroussin *x = 0; 313c76f0793SBaptiste Daroussin } 314c76f0793SBaptiste Daroussin j = *x; 315c76f0793SBaptiste Daroussin while (j < cols && i < len) { 316c76f0793SBaptiste Daroussin if (color && check_set_ncurses_attr(win, str+i)) { 317c76f0793SBaptiste Daroussin i += 3; 318c76f0793SBaptiste Daroussin } else { 319c76f0793SBaptiste Daroussin mvwaddch(win, *y, j, str[i]); 320c76f0793SBaptiste Daroussin i++; 321c76f0793SBaptiste Daroussin reallen--; 322c76f0793SBaptiste Daroussin j++; 323c76f0793SBaptiste Daroussin *x = j; 324c76f0793SBaptiste Daroussin } 325c76f0793SBaptiste Daroussin } 326c76f0793SBaptiste Daroussin } 327c76f0793SBaptiste Daroussin } 328c76f0793SBaptiste Daroussin 329c76f0793SBaptiste Daroussin int 330f499134dSBaptiste Daroussin get_text_properties(struct bsddialog_conf *conf, char *text, int *maxword, 331c76f0793SBaptiste Daroussin int *maxline, int *nlines) 332c76f0793SBaptiste Daroussin { 333c76f0793SBaptiste Daroussin int i, buflen, wordlen, linelen; 334c76f0793SBaptiste Daroussin 335c76f0793SBaptiste Daroussin 336*8c4f4028SBaptiste Daroussin buflen = strlen(text) + 1; 337c76f0793SBaptiste Daroussin *maxword = 0; 338c76f0793SBaptiste Daroussin wordlen = 0; 339c76f0793SBaptiste Daroussin for (i=0; i < buflen; i++) { 340*8c4f4028SBaptiste Daroussin if (text[i] == '\t' || text[i] == '\n' || text[i] == ' ' || text[i] == '\0') 341c76f0793SBaptiste Daroussin if (wordlen != 0) { 342c76f0793SBaptiste Daroussin *maxword = MAX(*maxword, wordlen); 343c76f0793SBaptiste Daroussin wordlen = 0; 344c76f0793SBaptiste Daroussin continue; 345c76f0793SBaptiste Daroussin } 346*8c4f4028SBaptiste Daroussin if (conf->text.colors && is_ncurses_attr(text + i)) 347c76f0793SBaptiste Daroussin i += 3; 348c76f0793SBaptiste Daroussin else 349c76f0793SBaptiste Daroussin wordlen++; 350c76f0793SBaptiste Daroussin } 351c76f0793SBaptiste Daroussin 352c76f0793SBaptiste Daroussin *maxline = linelen = 0; 353c76f0793SBaptiste Daroussin *nlines = 1; 354c76f0793SBaptiste Daroussin for (i=0; i < buflen; i++) { 355*8c4f4028SBaptiste Daroussin switch (text[i]) { 356c76f0793SBaptiste Daroussin case '\n': 357c76f0793SBaptiste Daroussin *nlines = *nlines + 1; 358c76f0793SBaptiste Daroussin case '\0': 359c76f0793SBaptiste Daroussin *maxline = MAX(*maxline, linelen); 360c76f0793SBaptiste Daroussin linelen = 0; 361c76f0793SBaptiste Daroussin break; 362c76f0793SBaptiste Daroussin default: 363*8c4f4028SBaptiste Daroussin if (conf->text.colors && is_ncurses_attr(text + i)) 364c76f0793SBaptiste Daroussin i += 3; 365c76f0793SBaptiste Daroussin else 366c76f0793SBaptiste Daroussin linelen++; 367c76f0793SBaptiste Daroussin } 368c76f0793SBaptiste Daroussin } 369c76f0793SBaptiste Daroussin if (*nlines == 1 && *maxline == 0) 370c76f0793SBaptiste Daroussin *nlines = 0; 371c76f0793SBaptiste Daroussin 372*8c4f4028SBaptiste Daroussin //free(buf); 373c76f0793SBaptiste Daroussin 374c76f0793SBaptiste Daroussin return 0; 375c76f0793SBaptiste Daroussin } 376c76f0793SBaptiste Daroussin 377f499134dSBaptiste Daroussin int 378f499134dSBaptiste Daroussin print_textpad(struct bsddialog_conf *conf, WINDOW *pad, int *rows, int cols, 379f499134dSBaptiste Daroussin char *text) 380c76f0793SBaptiste Daroussin { 381*8c4f4028SBaptiste Daroussin char *string; 382c76f0793SBaptiste Daroussin int i, j, x, y; 383c76f0793SBaptiste Daroussin bool loop; 384c76f0793SBaptiste Daroussin 385*8c4f4028SBaptiste Daroussin if ((string = malloc(strlen(text) + 1)) == NULL) 386c76f0793SBaptiste Daroussin RETURN_ERROR("Cannot build (analyze) text"); 387c76f0793SBaptiste Daroussin 388c76f0793SBaptiste Daroussin i = j = x = y = 0; 389c76f0793SBaptiste Daroussin loop = true; 390c76f0793SBaptiste Daroussin while (loop) { 391*8c4f4028SBaptiste Daroussin string[j] = text[i]; 392c76f0793SBaptiste Daroussin 393c76f0793SBaptiste Daroussin if (string[j] == '\0' || string[j] == '\n' || 394c76f0793SBaptiste Daroussin string[j] == '\t' || string[j] == ' ') { 395c76f0793SBaptiste Daroussin if (j != 0) { 396c76f0793SBaptiste Daroussin string[j] = '\0'; 397*8c4f4028SBaptiste Daroussin print_str(pad, rows, &y, &x, cols, string, 398*8c4f4028SBaptiste Daroussin conf->text.colors); 399c76f0793SBaptiste Daroussin } 400c76f0793SBaptiste Daroussin } 401c76f0793SBaptiste Daroussin 402*8c4f4028SBaptiste Daroussin switch (text[i]) { 403c76f0793SBaptiste Daroussin case '\0': 404c76f0793SBaptiste Daroussin loop = false; 405c76f0793SBaptiste Daroussin break; 406c76f0793SBaptiste Daroussin case '\n': 407c76f0793SBaptiste Daroussin j = -1; 408c76f0793SBaptiste Daroussin x = 0; 409c76f0793SBaptiste Daroussin y++; 410c76f0793SBaptiste Daroussin break; 411c76f0793SBaptiste Daroussin case '\t': 412c76f0793SBaptiste Daroussin for (j=0; j<4 /*tablen*/; j++) { 413c76f0793SBaptiste Daroussin x++; 414c76f0793SBaptiste Daroussin if (x >= cols) { 415c76f0793SBaptiste Daroussin x = 0; 416c76f0793SBaptiste Daroussin y++; 417c76f0793SBaptiste Daroussin } 418c76f0793SBaptiste Daroussin } 419c76f0793SBaptiste Daroussin j = -1; 420c76f0793SBaptiste Daroussin break; 421c76f0793SBaptiste Daroussin case ' ': 422c76f0793SBaptiste Daroussin x++; 423c76f0793SBaptiste Daroussin if (x >= cols) { 424c76f0793SBaptiste Daroussin x = 0; 425c76f0793SBaptiste Daroussin y++; 426c76f0793SBaptiste Daroussin } 427c76f0793SBaptiste Daroussin j = -1; 428c76f0793SBaptiste Daroussin } 429c76f0793SBaptiste Daroussin 430c76f0793SBaptiste Daroussin if (y >= *rows) { /* check for whitespaces */ 431c76f0793SBaptiste Daroussin *rows = y + 1; 432c76f0793SBaptiste Daroussin wresize(pad, *rows, cols); 433c76f0793SBaptiste Daroussin } 434c76f0793SBaptiste Daroussin 435c76f0793SBaptiste Daroussin j++; 436c76f0793SBaptiste Daroussin i++; 437c76f0793SBaptiste Daroussin } 438c76f0793SBaptiste Daroussin 439c76f0793SBaptiste Daroussin free(string); 440c76f0793SBaptiste Daroussin 441c76f0793SBaptiste Daroussin return 0; 442c76f0793SBaptiste Daroussin } 443c76f0793SBaptiste Daroussin 444c76f0793SBaptiste Daroussin /* autosize */ 445c76f0793SBaptiste Daroussin 446c76f0793SBaptiste Daroussin /* 447c76f0793SBaptiste Daroussin * max y, that is from 0 to LINES - 1 - t.shadowrows, 448c76f0793SBaptiste Daroussin * could not be max height but avoids problems with checksize 449c76f0793SBaptiste Daroussin */ 450f499134dSBaptiste Daroussin int widget_max_height(struct bsddialog_conf *conf) 451c76f0793SBaptiste Daroussin { 452c76f0793SBaptiste Daroussin int maxheight; 453c76f0793SBaptiste Daroussin 454f499134dSBaptiste Daroussin if ((maxheight = conf->shadow ? LINES - 1 - t.shadow.h : LINES - 1) <= 0) 455c76f0793SBaptiste Daroussin RETURN_ERROR("Terminal too small, LINES - shadow <= 0"); 456c76f0793SBaptiste Daroussin 457f499134dSBaptiste Daroussin if (conf->y > 0) 458f499134dSBaptiste Daroussin if ((maxheight -= conf->y) <=0) 459c76f0793SBaptiste Daroussin RETURN_ERROR("Terminal too small, LINES - shadow - y <= 0"); 460c76f0793SBaptiste Daroussin 461c76f0793SBaptiste Daroussin return maxheight; 462c76f0793SBaptiste Daroussin } 463c76f0793SBaptiste Daroussin 464c76f0793SBaptiste Daroussin /* 465c76f0793SBaptiste Daroussin * max x, that is from 0 to COLS - 1 - t.shadowcols, 466c76f0793SBaptiste Daroussin * * could not be max height but avoids problems with checksize 467c76f0793SBaptiste Daroussin */ 468f499134dSBaptiste Daroussin int widget_max_width(struct bsddialog_conf *conf) 469c76f0793SBaptiste Daroussin { 470c76f0793SBaptiste Daroussin int maxwidth; 471c76f0793SBaptiste Daroussin 472f499134dSBaptiste Daroussin if ((maxwidth = conf->shadow ? COLS - 1 - t.shadow.w : COLS - 1) <= 0) 473c76f0793SBaptiste Daroussin RETURN_ERROR("Terminal too small, COLS - shadow <= 0"); 474f499134dSBaptiste Daroussin if (conf->x > 0) 475f499134dSBaptiste Daroussin if ((maxwidth -= conf->x) <=0) 476c76f0793SBaptiste Daroussin RETURN_ERROR("Terminal too small, COLS - shadow - x <= 0"); 477c76f0793SBaptiste Daroussin 478c76f0793SBaptiste Daroussin return maxwidth; 479c76f0793SBaptiste Daroussin } 480c76f0793SBaptiste Daroussin 481c76f0793SBaptiste Daroussin int 482f499134dSBaptiste Daroussin set_widget_size(struct bsddialog_conf *conf, int rows, int cols, int *h, int *w) 483c76f0793SBaptiste Daroussin { 484c76f0793SBaptiste Daroussin int maxheight, maxwidth; 485c76f0793SBaptiste Daroussin 486c76f0793SBaptiste Daroussin if ((maxheight = widget_max_height(conf)) == BSDDIALOG_ERROR) 487c76f0793SBaptiste Daroussin return BSDDIALOG_ERROR; 488c76f0793SBaptiste Daroussin 489c76f0793SBaptiste Daroussin if (rows == BSDDIALOG_FULLSCREEN) 490c76f0793SBaptiste Daroussin *h = maxheight; 491c76f0793SBaptiste Daroussin else if (rows < BSDDIALOG_FULLSCREEN) 492c76f0793SBaptiste Daroussin RETURN_ERROR("Negative (less than -1) height"); 493c76f0793SBaptiste Daroussin else if (rows > BSDDIALOG_AUTOSIZE) { 494c76f0793SBaptiste Daroussin if ((*h = rows) > maxheight) 495c76f0793SBaptiste Daroussin RETURN_ERROR("Height too big (> terminal height - "\ 496c76f0793SBaptiste Daroussin "shadow"); 497c76f0793SBaptiste Daroussin } 498c76f0793SBaptiste Daroussin /* rows == AUTOSIZE: each widget has to set its size */ 499c76f0793SBaptiste Daroussin 500c76f0793SBaptiste Daroussin if ((maxwidth = widget_max_width(conf)) == BSDDIALOG_ERROR) 501c76f0793SBaptiste Daroussin return BSDDIALOG_ERROR; 502c76f0793SBaptiste Daroussin 503c76f0793SBaptiste Daroussin if (cols == BSDDIALOG_FULLSCREEN) 504c76f0793SBaptiste Daroussin *w = maxwidth; 505c76f0793SBaptiste Daroussin else if (cols < BSDDIALOG_FULLSCREEN) 506c76f0793SBaptiste Daroussin RETURN_ERROR("Negative (less than -1) width"); 507c76f0793SBaptiste Daroussin else if (cols > BSDDIALOG_AUTOSIZE) { 508c76f0793SBaptiste Daroussin if ((*w = cols) > maxwidth) 509c76f0793SBaptiste Daroussin RETURN_ERROR("Width too big (> terminal width - shadow)"); 510c76f0793SBaptiste Daroussin } 511c76f0793SBaptiste Daroussin /* cols == AUTOSIZE: each widget has to set its size */ 512c76f0793SBaptiste Daroussin 513c76f0793SBaptiste Daroussin return 0; 514c76f0793SBaptiste Daroussin } 515c76f0793SBaptiste Daroussin 516c76f0793SBaptiste Daroussin int 517f499134dSBaptiste Daroussin set_widget_position(struct bsddialog_conf *conf, int *y, int *x, int h, int w) 518c76f0793SBaptiste Daroussin { 519c76f0793SBaptiste Daroussin 520f499134dSBaptiste Daroussin if (conf->y == BSDDIALOG_CENTER) 521c76f0793SBaptiste Daroussin *y = LINES/2 - h/2; 522f499134dSBaptiste Daroussin else if (conf->y < BSDDIALOG_CENTER) 523c76f0793SBaptiste Daroussin RETURN_ERROR("Negative begin y (less than -1)"); 524f499134dSBaptiste Daroussin else if (conf->y >= LINES) 525c76f0793SBaptiste Daroussin RETURN_ERROR("Begin Y under the terminal"); 526c76f0793SBaptiste Daroussin else 527f499134dSBaptiste Daroussin *y = conf->y; 528c76f0793SBaptiste Daroussin 529f499134dSBaptiste Daroussin if ((*y + h + (conf->shadow ? (int) t.shadow.h : 0)) > LINES) 530c76f0793SBaptiste Daroussin RETURN_ERROR("The lower of the box under the terminal "\ 531c76f0793SBaptiste Daroussin "(begin Y + height (+ shadow) > terminal lines)"); 532c76f0793SBaptiste Daroussin 533c76f0793SBaptiste Daroussin 534f499134dSBaptiste Daroussin if (conf->x == BSDDIALOG_CENTER) 535c76f0793SBaptiste Daroussin *x = COLS/2 - w/2; 536f499134dSBaptiste Daroussin else if (conf->x < BSDDIALOG_CENTER) 537c76f0793SBaptiste Daroussin RETURN_ERROR("Negative begin x (less than -1)"); 538f499134dSBaptiste Daroussin else if (conf->x >= COLS) 539c76f0793SBaptiste Daroussin RETURN_ERROR("Begin X over the right of the terminal"); 540c76f0793SBaptiste Daroussin else 541f499134dSBaptiste Daroussin *x = conf->x; 542c76f0793SBaptiste Daroussin 543f499134dSBaptiste Daroussin if ((*x + w + (conf->shadow ? (int) t.shadow.w : 0)) > COLS) 544c76f0793SBaptiste Daroussin RETURN_ERROR("The right of the box over the terminal "\ 545c76f0793SBaptiste Daroussin "(begin X + width (+ shadow) > terminal cols)"); 546c76f0793SBaptiste Daroussin 547c76f0793SBaptiste Daroussin return 0; 548c76f0793SBaptiste Daroussin } 549c76f0793SBaptiste Daroussin 550c76f0793SBaptiste Daroussin /* Widgets builders */ 551c76f0793SBaptiste Daroussin void 552f499134dSBaptiste Daroussin draw_borders(struct bsddialog_conf *conf, WINDOW *win, int rows, int cols, 553c76f0793SBaptiste Daroussin enum elevation elev) 554c76f0793SBaptiste Daroussin { 555c76f0793SBaptiste Daroussin int leftcolor, rightcolor; 556c76f0793SBaptiste Daroussin int ls, rs, ts, bs, tl, tr, bl, br; 557c76f0793SBaptiste Daroussin int ltee, rtee; 558c76f0793SBaptiste Daroussin 559c76f0793SBaptiste Daroussin ls = rs = ACS_VLINE; 560c76f0793SBaptiste Daroussin ts = bs = ACS_HLINE; 561c76f0793SBaptiste Daroussin tl = ACS_ULCORNER; 562c76f0793SBaptiste Daroussin tr = ACS_URCORNER; 563c76f0793SBaptiste Daroussin bl = ACS_LLCORNER; 564c76f0793SBaptiste Daroussin br = ACS_LRCORNER; 565c76f0793SBaptiste Daroussin ltee = ACS_LTEE; 566c76f0793SBaptiste Daroussin rtee = ACS_RTEE; 567c76f0793SBaptiste Daroussin 568f499134dSBaptiste Daroussin if (conf->no_lines == false) { 569f499134dSBaptiste Daroussin if (conf->ascii_lines) { 570c76f0793SBaptiste Daroussin ls = rs = '|'; 571c76f0793SBaptiste Daroussin ts = bs = '-'; 572c76f0793SBaptiste Daroussin tl = tr = bl = br = ltee = rtee = '+'; 573c76f0793SBaptiste Daroussin } 574*8c4f4028SBaptiste Daroussin leftcolor = elev == RAISED ? 575*8c4f4028SBaptiste Daroussin t.dialog.lineraisecolor : t.dialog.linelowercolor; 576*8c4f4028SBaptiste Daroussin rightcolor = elev == RAISED ? 577*8c4f4028SBaptiste Daroussin t.dialog.linelowercolor : t.dialog.lineraisecolor; 578c76f0793SBaptiste Daroussin wattron(win, leftcolor); 579c76f0793SBaptiste Daroussin wborder(win, ls, rs, ts, bs, tl, tr, bl, br); 580c76f0793SBaptiste Daroussin wattroff(win, leftcolor); 581c76f0793SBaptiste Daroussin 582c76f0793SBaptiste Daroussin wattron(win, rightcolor); 583c76f0793SBaptiste Daroussin mvwaddch(win, 0, cols-1, tr); 584c76f0793SBaptiste Daroussin mvwvline(win, 1, cols-1, rs, rows-2); 585c76f0793SBaptiste Daroussin mvwaddch(win, rows-1, cols-1, br); 586c76f0793SBaptiste Daroussin mvwhline(win, rows-1, 1, bs, cols-2); 587c76f0793SBaptiste Daroussin wattroff(win, rightcolor); 588c76f0793SBaptiste Daroussin } 589c76f0793SBaptiste Daroussin } 590c76f0793SBaptiste Daroussin 591c76f0793SBaptiste Daroussin WINDOW * 592f499134dSBaptiste Daroussin new_boxed_window(struct bsddialog_conf *conf, int y, int x, int rows, int cols, 593c76f0793SBaptiste Daroussin enum elevation elev) 594c76f0793SBaptiste Daroussin { 595c76f0793SBaptiste Daroussin WINDOW *win; 596c76f0793SBaptiste Daroussin 597c76f0793SBaptiste Daroussin if ((win = newwin(rows, cols, y, x)) == NULL) { 598c76f0793SBaptiste Daroussin set_error_string("Cannot build boxed window"); 599c76f0793SBaptiste Daroussin return NULL; 600c76f0793SBaptiste Daroussin } 601c76f0793SBaptiste Daroussin 602*8c4f4028SBaptiste Daroussin wbkgd(win, t.dialog.color); 603c76f0793SBaptiste Daroussin 604c76f0793SBaptiste Daroussin draw_borders(conf, win, rows, cols, elev); 605c76f0793SBaptiste Daroussin 606c76f0793SBaptiste Daroussin return win; 607c76f0793SBaptiste Daroussin } 608c76f0793SBaptiste Daroussin 609c76f0793SBaptiste Daroussin /* 610c76f0793SBaptiste Daroussin * `enum elevation elev` could be useless because it should be always RAISED, 611c76f0793SBaptiste Daroussin * to check at the end. 612c76f0793SBaptiste Daroussin */ 613c76f0793SBaptiste Daroussin static int 614f499134dSBaptiste Daroussin draw_widget_withtextpad(struct bsddialog_conf *conf, WINDOW *shadow, 615c76f0793SBaptiste Daroussin WINDOW *widget, int h, int w, enum elevation elev, 616c76f0793SBaptiste Daroussin WINDOW *textpad, int *htextpad, char *text, bool buttons) 617c76f0793SBaptiste Daroussin { 618c76f0793SBaptiste Daroussin int ts, ltee, rtee; 619*8c4f4028SBaptiste Daroussin int colordelimtitle; 620c76f0793SBaptiste Daroussin 621f499134dSBaptiste Daroussin ts = conf->ascii_lines ? '-' : ACS_HLINE; 622f499134dSBaptiste Daroussin ltee = conf->ascii_lines ? '+' : ACS_LTEE; 623f499134dSBaptiste Daroussin rtee = conf->ascii_lines ? '+' : ACS_RTEE; 624*8c4f4028SBaptiste Daroussin colordelimtitle = elev == RAISED ? 625*8c4f4028SBaptiste Daroussin t.dialog.lineraisecolor : t.dialog.linelowercolor; 626c76f0793SBaptiste Daroussin 627c76f0793SBaptiste Daroussin if (shadow != NULL) 628c76f0793SBaptiste Daroussin wnoutrefresh(shadow); 629c76f0793SBaptiste Daroussin 630c76f0793SBaptiste Daroussin // move / resize now or the caller? 631c76f0793SBaptiste Daroussin draw_borders(conf, widget, h, w, elev); 632c76f0793SBaptiste Daroussin 633f499134dSBaptiste Daroussin if (conf->title != NULL) { 634*8c4f4028SBaptiste Daroussin if (t.dialog.delimtitle && conf->no_lines == false) { 635*8c4f4028SBaptiste Daroussin wattron(widget, colordelimtitle); 636f499134dSBaptiste Daroussin mvwaddch(widget, 0, w/2 - strlen(conf->title)/2 - 1, rtee); 637*8c4f4028SBaptiste Daroussin wattroff(widget, colordelimtitle); 638c76f0793SBaptiste Daroussin } 639*8c4f4028SBaptiste Daroussin wattron(widget, t.dialog.titlecolor); 640f499134dSBaptiste Daroussin mvwaddstr(widget, 0, w/2 - strlen(conf->title)/2, conf->title); 641*8c4f4028SBaptiste Daroussin wattroff(widget, t.dialog.titlecolor); 642*8c4f4028SBaptiste Daroussin if (t.dialog.delimtitle && conf->no_lines == false) { 643*8c4f4028SBaptiste Daroussin wattron(widget, colordelimtitle); 644c76f0793SBaptiste Daroussin waddch(widget, ltee); 645*8c4f4028SBaptiste Daroussin wattroff(widget, colordelimtitle); 646c76f0793SBaptiste Daroussin } 647c76f0793SBaptiste Daroussin } 648c76f0793SBaptiste Daroussin 649*8c4f4028SBaptiste Daroussin if (conf->bottomtitle != NULL) { 650*8c4f4028SBaptiste Daroussin wattron(widget, t.dialog.bottomtitlecolor); 651*8c4f4028SBaptiste Daroussin wmove(widget, h - 1, w/2 - strlen(conf->bottomtitle)/2 - 1); 652c76f0793SBaptiste Daroussin waddch(widget, '['); 653*8c4f4028SBaptiste Daroussin waddstr(widget, conf->bottomtitle); 654c76f0793SBaptiste Daroussin waddch(widget, ']'); 655*8c4f4028SBaptiste Daroussin wattroff(widget, t.dialog.bottomtitlecolor); 656c76f0793SBaptiste Daroussin } 657c76f0793SBaptiste Daroussin 658f499134dSBaptiste Daroussin //if (textpad == NULL && text != NULL) /* no pad, text null for textbox */ 659f499134dSBaptiste Daroussin // print_text(conf, widget, 1, 2, w-3, text); 660c76f0793SBaptiste Daroussin 661f499134dSBaptiste Daroussin if (buttons && conf->no_lines == false) { 662*8c4f4028SBaptiste Daroussin wattron(widget, t.dialog.lineraisecolor); 663c76f0793SBaptiste Daroussin mvwaddch(widget, h-3, 0, ltee); 664c76f0793SBaptiste Daroussin mvwhline(widget, h-3, 1, ts, w-2); 665*8c4f4028SBaptiste Daroussin wattroff(widget, t.dialog.lineraisecolor); 666c76f0793SBaptiste Daroussin 667*8c4f4028SBaptiste Daroussin wattron(widget, t.dialog.linelowercolor); 668c76f0793SBaptiste Daroussin mvwaddch(widget, h-3, w-1, rtee); 669*8c4f4028SBaptiste Daroussin wattroff(widget, t.dialog.linelowercolor); 670c76f0793SBaptiste Daroussin } 671c76f0793SBaptiste Daroussin 672c76f0793SBaptiste Daroussin wnoutrefresh(widget); 673c76f0793SBaptiste Daroussin 674c76f0793SBaptiste Daroussin if (textpad == NULL) 675c76f0793SBaptiste Daroussin return 0; /* widget_init() ends */ 676c76f0793SBaptiste Daroussin 677c76f0793SBaptiste Daroussin if (text != NULL) /* programbox etc */ 678c76f0793SBaptiste Daroussin if (print_textpad(conf, textpad, htextpad, 679f499134dSBaptiste Daroussin w - HBORDERS - t.text.hmargin * 2, text) !=0) 680c76f0793SBaptiste Daroussin return BSDDIALOG_ERROR; 681c76f0793SBaptiste Daroussin 682c76f0793SBaptiste Daroussin return 0; 683c76f0793SBaptiste Daroussin } 684c76f0793SBaptiste Daroussin 685c76f0793SBaptiste Daroussin /* 686c76f0793SBaptiste Daroussin * `enum elevation elev` could be useless because it should be always RAISED, 687c76f0793SBaptiste Daroussin * to check at the end. 688c76f0793SBaptiste Daroussin */ 689c76f0793SBaptiste Daroussin int 690f499134dSBaptiste Daroussin update_widget_withtextpad(struct bsddialog_conf *conf, WINDOW *shadow, 691c76f0793SBaptiste Daroussin WINDOW *widget, int h, int w, enum elevation elev, 692c76f0793SBaptiste Daroussin WINDOW *textpad, int *htextpad, char *text, bool buttons) 693c76f0793SBaptiste Daroussin { 694c76f0793SBaptiste Daroussin int error; 695c76f0793SBaptiste Daroussin 696c76f0793SBaptiste Daroussin /* nothing for now */ 697c76f0793SBaptiste Daroussin 698c76f0793SBaptiste Daroussin error = draw_widget_withtextpad(conf, shadow, widget, h, w, 699c76f0793SBaptiste Daroussin elev, textpad, htextpad, text, buttons); 700c76f0793SBaptiste Daroussin 701c76f0793SBaptiste Daroussin return error; 702c76f0793SBaptiste Daroussin } 703c76f0793SBaptiste Daroussin 704c76f0793SBaptiste Daroussin /* 705c76f0793SBaptiste Daroussin * `enum elevation elev` could be useless because it should be always RAISED, 706c76f0793SBaptiste Daroussin * to check at the end. 707c76f0793SBaptiste Daroussin */ 708c76f0793SBaptiste Daroussin int 709f499134dSBaptiste Daroussin new_widget_withtextpad(struct bsddialog_conf *conf, WINDOW **shadow, 710c76f0793SBaptiste Daroussin WINDOW **widget, int y, int x, int h, int w, enum elevation elev, 711c76f0793SBaptiste Daroussin WINDOW **textpad, int *htextpad, char *text, bool buttons) 712c76f0793SBaptiste Daroussin { 713c76f0793SBaptiste Daroussin int error; 714c76f0793SBaptiste Daroussin 715f499134dSBaptiste Daroussin if (conf->shadow) { 716f499134dSBaptiste Daroussin *shadow = newwin(h, w, y + t.shadow.h, x + t.shadow.w); 717c76f0793SBaptiste Daroussin if (*shadow == NULL) 718c76f0793SBaptiste Daroussin RETURN_ERROR("Cannot build shadow"); 719f499134dSBaptiste Daroussin wbkgd(*shadow, t.shadow.color); 720c76f0793SBaptiste Daroussin } 721c76f0793SBaptiste Daroussin 722c76f0793SBaptiste Daroussin if ((*widget = new_boxed_window(conf, y, x, h, w, elev)) == NULL) { 723f499134dSBaptiste Daroussin if (conf->shadow) 724c76f0793SBaptiste Daroussin delwin(*shadow); 725c76f0793SBaptiste Daroussin return BSDDIALOG_ERROR; 726c76f0793SBaptiste Daroussin } 727c76f0793SBaptiste Daroussin 728c76f0793SBaptiste Daroussin if (textpad == NULL) { /* widget_init() */ 729c76f0793SBaptiste Daroussin error = draw_widget_withtextpad(conf, *shadow, *widget, h, w, 730c76f0793SBaptiste Daroussin elev, NULL, NULL, text, buttons); 731c76f0793SBaptiste Daroussin return error; 732c76f0793SBaptiste Daroussin } 733c76f0793SBaptiste Daroussin 734c76f0793SBaptiste Daroussin if (text != NULL) { /* programbox etc */ 735c76f0793SBaptiste Daroussin *htextpad = 1; 736f499134dSBaptiste Daroussin *textpad = newpad(*htextpad, w - HBORDERS - t.text.hmargin * 2); 737c76f0793SBaptiste Daroussin if (*textpad == NULL) { 738c76f0793SBaptiste Daroussin delwin(*textpad); 739f499134dSBaptiste Daroussin if (conf->shadow) 740c76f0793SBaptiste Daroussin delwin(*shadow); 741c76f0793SBaptiste Daroussin RETURN_ERROR("Cannot build the pad window for text"); 742c76f0793SBaptiste Daroussin } 743*8c4f4028SBaptiste Daroussin wbkgd(*textpad, t.dialog.color); 744c76f0793SBaptiste Daroussin } 745c76f0793SBaptiste Daroussin 746c76f0793SBaptiste Daroussin error = draw_widget_withtextpad(conf, *shadow, *widget, h, w, elev, 747c76f0793SBaptiste Daroussin *textpad, htextpad, text, buttons); 748c76f0793SBaptiste Daroussin 749c76f0793SBaptiste Daroussin return error; 750c76f0793SBaptiste Daroussin } 751c76f0793SBaptiste Daroussin 752c76f0793SBaptiste Daroussin void 753f499134dSBaptiste Daroussin end_widget_withtextpad(struct bsddialog_conf *conf, WINDOW *window, int h, int w, 754c76f0793SBaptiste Daroussin WINDOW *textpad, WINDOW *shadow) 755c76f0793SBaptiste Daroussin { 756c76f0793SBaptiste Daroussin int y, x; 757c76f0793SBaptiste Daroussin 758c76f0793SBaptiste Daroussin getbegyx(window, y, x); /* for clear, add y & x to args? */ 759c76f0793SBaptiste Daroussin 760f499134dSBaptiste Daroussin if (conf->sleep > 0) 761f499134dSBaptiste Daroussin sleep(conf->sleep); 762c76f0793SBaptiste Daroussin 763c76f0793SBaptiste Daroussin if (textpad != NULL) 764c76f0793SBaptiste Daroussin delwin(textpad); 765c76f0793SBaptiste Daroussin 766c76f0793SBaptiste Daroussin delwin(window); 767c76f0793SBaptiste Daroussin 768f499134dSBaptiste Daroussin if (conf->shadow) 769c76f0793SBaptiste Daroussin delwin(shadow); 770c76f0793SBaptiste Daroussin 771f499134dSBaptiste Daroussin if (conf->clear) 772c76f0793SBaptiste Daroussin hide_widget(y, x, h, w, shadow != NULL); 773c76f0793SBaptiste Daroussin 774f499134dSBaptiste Daroussin if (conf->get_height != NULL) 775f499134dSBaptiste Daroussin *conf->get_height = h; 776f499134dSBaptiste Daroussin if (conf->get_width != NULL) 777f499134dSBaptiste Daroussin *conf->get_width = w; 778c76f0793SBaptiste Daroussin } 779