1c76f0793SBaptiste Daroussin /*- 2c76f0793SBaptiste Daroussin * SPDX-License-Identifier: BSD-2-Clause 3c76f0793SBaptiste Daroussin * 461ba55bcSBaptiste Daroussin * Copyright (c) 2021-2023 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 28263660c0SAlfonso Siciliano #include <curses.h> 29d93b4d32SBaptiste Daroussin #include <stdlib.h> 30d93b4d32SBaptiste Daroussin #include <string.h> 31d93b4d32SBaptiste Daroussin #include <unistd.h> 32b319d934SAlfonso S. Siciliano #include <wctype.h> 33c76f0793SBaptiste Daroussin 34c76f0793SBaptiste Daroussin #include "bsddialog.h" 35c76f0793SBaptiste Daroussin #include "bsddialog_theme.h" 36263660c0SAlfonso Siciliano #include "lib_util.h" 37c76f0793SBaptiste Daroussin 3861ba55bcSBaptiste Daroussin /* 3961ba55bcSBaptiste Daroussin * -1- Error and diagnostic 4061ba55bcSBaptiste Daroussin * 4161ba55bcSBaptiste Daroussin * get_error_string(); 4261ba55bcSBaptiste Daroussin * set_error_string(); 4361ba55bcSBaptiste Daroussin * set_fmt_error_string(); 4461ba55bcSBaptiste Daroussin * 4561ba55bcSBaptiste Daroussin * ---------------------------------------------------- 4661ba55bcSBaptiste Daroussin * -2- (Unicode) Multicolumn character strings 4761ba55bcSBaptiste Daroussin * 4861ba55bcSBaptiste Daroussin * alloc_mbstows(); 4961ba55bcSBaptiste Daroussin * mvwaddwch(); 5061ba55bcSBaptiste Daroussin * str_props(); 5161ba55bcSBaptiste Daroussin * strcols(); 5261ba55bcSBaptiste Daroussin * 5361ba55bcSBaptiste Daroussin * ---------------------------------------------------- 5461ba55bcSBaptiste Daroussin * -3- Buttons 5561ba55bcSBaptiste Daroussin * 5661ba55bcSBaptiste Daroussin * [static] buttons_min_width(); 5761ba55bcSBaptiste Daroussin * [static] draw_button(); 5861ba55bcSBaptiste Daroussin * draw_buttons(); 5961ba55bcSBaptiste Daroussin * set_buttons(); (to call 1 time after prepare_dialog()). 6061ba55bcSBaptiste Daroussin * shortcut_buttons(); 6161ba55bcSBaptiste Daroussin * 6261ba55bcSBaptiste Daroussin * ---------------------------------------------------- 6361ba55bcSBaptiste Daroussin * -4- (Auto) Sizing and (Auto) Position 6461ba55bcSBaptiste Daroussin * 6561ba55bcSBaptiste Daroussin * [static] widget_max_height(conf); 6661ba55bcSBaptiste Daroussin * [static] widget_max_width(struct bsddialog_conf *conf) 6761ba55bcSBaptiste Daroussin * [static] is_wtext_attr(); 6861ba55bcSBaptiste Daroussin * [static] text_properties(); 6961ba55bcSBaptiste Daroussin * [static] text_autosize(); 7061ba55bcSBaptiste Daroussin * [static] text_size(); 7161ba55bcSBaptiste Daroussin * [static] widget_min_height(conf, htext, hnotext, bool buttons); 7261ba55bcSBaptiste Daroussin * [static] widget_min_width(conf, wtext, minw, buttons); 7361ba55bcSBaptiste Daroussin * set_widget_size(); 7461ba55bcSBaptiste Daroussin * set_widget_autosize(); (not for all dialogs). 7561ba55bcSBaptiste Daroussin * widget_checksize(); (not for all dialogs). 7661ba55bcSBaptiste Daroussin * set_widget_position(); 7761ba55bcSBaptiste Daroussin * dialog_size_position(struct dialog); (not for all dialogs). 7861ba55bcSBaptiste Daroussin * 7961ba55bcSBaptiste Daroussin * ---------------------------------------------------- 8061ba55bcSBaptiste Daroussin * -5- (Dialog) Widget components and utils 8161ba55bcSBaptiste Daroussin * 8261ba55bcSBaptiste Daroussin * hide_dialog(struct dialog); 8361ba55bcSBaptiste Daroussin * f1help_dialog(conf); 8461ba55bcSBaptiste Daroussin * draw_borders(conf, win, elev); 8561ba55bcSBaptiste Daroussin * update_box(conf, win, y, x, h, w, elev); 8661ba55bcSBaptiste Daroussin * rtextpad(); (helper for pnoutrefresh(textpad)). 8761ba55bcSBaptiste Daroussin * 8861ba55bcSBaptiste Daroussin * ---------------------------------------------------- 8961ba55bcSBaptiste Daroussin * -6- Dialog init/build, update/draw, destroy 9061ba55bcSBaptiste Daroussin * 9161ba55bcSBaptiste Daroussin * end_dialog(struct dialog); 9261ba55bcSBaptiste Daroussin * [static] check_set_wtext_attr(); 9361ba55bcSBaptiste Daroussin * [static] print_string(); (word wrapping). 9461ba55bcSBaptiste Daroussin * [static] print_textpad(); 9561ba55bcSBaptiste Daroussin * draw_dialog(struct dialog); 9661ba55bcSBaptiste Daroussin * prepare_dialog(struct dialog); 9761ba55bcSBaptiste Daroussin */ 98c76f0793SBaptiste Daroussin 9961ba55bcSBaptiste Daroussin /* 10061ba55bcSBaptiste Daroussin * -1- Error and diagnostic 10161ba55bcSBaptiste Daroussin */ 10261ba55bcSBaptiste Daroussin #define ERRBUFLEN 1024 10361ba55bcSBaptiste Daroussin 104c76f0793SBaptiste Daroussin static char errorbuffer[ERRBUFLEN]; 105c76f0793SBaptiste Daroussin 106c76f0793SBaptiste Daroussin const char *get_error_string(void) 107c76f0793SBaptiste Daroussin { 108263660c0SAlfonso Siciliano return (errorbuffer); 109c76f0793SBaptiste Daroussin } 110c76f0793SBaptiste Daroussin 111bce40c02SAlfonso S. Siciliano void set_error_string(const char *str) 112c76f0793SBaptiste Daroussin { 113c76f0793SBaptiste Daroussin strncpy(errorbuffer, str, ERRBUFLEN-1); 114c76f0793SBaptiste Daroussin } 115c76f0793SBaptiste Daroussin 11661ba55bcSBaptiste Daroussin void set_fmt_error_string(const char *fmt, ...) 11761ba55bcSBaptiste Daroussin { 11861ba55bcSBaptiste Daroussin va_list arg_ptr; 11961ba55bcSBaptiste Daroussin 12061ba55bcSBaptiste Daroussin va_start(arg_ptr, fmt); 12161ba55bcSBaptiste Daroussin vsnprintf(errorbuffer, ERRBUFLEN-1, fmt, arg_ptr); 12261ba55bcSBaptiste Daroussin va_end(arg_ptr); 12361ba55bcSBaptiste Daroussin } 12461ba55bcSBaptiste Daroussin 12561ba55bcSBaptiste Daroussin /* 12661ba55bcSBaptiste Daroussin * -2- (Unicode) Multicolumn character strings 12761ba55bcSBaptiste Daroussin */ 128b319d934SAlfonso S. Siciliano wchar_t* alloc_mbstows(const char *mbstring) 129b319d934SAlfonso S. Siciliano { 130b319d934SAlfonso S. Siciliano size_t charlen, nchar; 131b319d934SAlfonso S. Siciliano mbstate_t mbs; 132b319d934SAlfonso S. Siciliano const char *pmbstring; 133b319d934SAlfonso S. Siciliano wchar_t *wstring; 134b319d934SAlfonso S. Siciliano 135b319d934SAlfonso S. Siciliano nchar = 1; 136b319d934SAlfonso S. Siciliano pmbstring = mbstring; 137b319d934SAlfonso S. Siciliano memset(&mbs, 0, sizeof(mbs)); 138b319d934SAlfonso S. Siciliano while ((charlen = mbrlen(pmbstring, MB_CUR_MAX, &mbs)) != 0 && 139b319d934SAlfonso S. Siciliano charlen != (size_t)-1 && charlen != (size_t)-2) { 140b319d934SAlfonso S. Siciliano pmbstring += charlen; 141b319d934SAlfonso S. Siciliano nchar++; 142b319d934SAlfonso S. Siciliano } 143b319d934SAlfonso S. Siciliano 144b319d934SAlfonso S. Siciliano if ((wstring = calloc(nchar, sizeof(wchar_t))) == NULL) 145b319d934SAlfonso S. Siciliano return (NULL); 146b319d934SAlfonso S. Siciliano mbstowcs(wstring, mbstring, nchar); 147b319d934SAlfonso S. Siciliano 148b319d934SAlfonso S. Siciliano return (wstring); 149b319d934SAlfonso S. Siciliano } 150b319d934SAlfonso S. Siciliano 151b319d934SAlfonso S. Siciliano void mvwaddwch(WINDOW *w, int y, int x, wchar_t wch) 152b319d934SAlfonso S. Siciliano { 153b319d934SAlfonso S. Siciliano wchar_t ws[2]; 154b319d934SAlfonso S. Siciliano 155b319d934SAlfonso S. Siciliano ws[0] = wch; 156b319d934SAlfonso S. Siciliano ws[1] = L'\0'; 157b319d934SAlfonso S. Siciliano mvwaddwstr(w, y, x, ws); 158b319d934SAlfonso S. Siciliano } 159b319d934SAlfonso S. Siciliano 160b319d934SAlfonso S. Siciliano int str_props(const char *mbstring, unsigned int *cols, bool *has_multi_col) 161b319d934SAlfonso S. Siciliano { 162b319d934SAlfonso S. Siciliano bool multicol; 163b319d934SAlfonso S. Siciliano int w; 164b319d934SAlfonso S. Siciliano unsigned int ncol; 165b319d934SAlfonso S. Siciliano size_t charlen, mb_cur_max; 166b319d934SAlfonso S. Siciliano wchar_t wch; 167b319d934SAlfonso S. Siciliano mbstate_t mbs; 168b319d934SAlfonso S. Siciliano 169b319d934SAlfonso S. Siciliano multicol = false; 170b319d934SAlfonso S. Siciliano mb_cur_max = MB_CUR_MAX; 171b319d934SAlfonso S. Siciliano ncol = 0; 172b319d934SAlfonso S. Siciliano memset(&mbs, 0, sizeof(mbs)); 173b319d934SAlfonso S. Siciliano while ((charlen = mbrlen(mbstring, mb_cur_max, &mbs)) != 0 && 174b319d934SAlfonso S. Siciliano charlen != (size_t)-1 && charlen != (size_t)-2) { 175b319d934SAlfonso S. Siciliano if (mbtowc(&wch, mbstring, mb_cur_max) < 0) 176b319d934SAlfonso S. Siciliano return (-1); 177b319d934SAlfonso S. Siciliano w = (wch == L'\t') ? TABSIZE : wcwidth(wch); 178b319d934SAlfonso S. Siciliano ncol += (w < 0) ? 0 : w; 179b319d934SAlfonso S. Siciliano if (w > 1 && wch != L'\t') 180b319d934SAlfonso S. Siciliano multicol = true; 181b319d934SAlfonso S. Siciliano mbstring += charlen; 182b319d934SAlfonso S. Siciliano } 183b319d934SAlfonso S. Siciliano 184b319d934SAlfonso S. Siciliano if (cols != NULL) 185b319d934SAlfonso S. Siciliano *cols = ncol; 186b319d934SAlfonso S. Siciliano if (has_multi_col != NULL) 187b319d934SAlfonso S. Siciliano *has_multi_col = multicol; 188b319d934SAlfonso S. Siciliano 189b319d934SAlfonso S. Siciliano return (0); 190b319d934SAlfonso S. Siciliano } 191b319d934SAlfonso S. Siciliano 192b319d934SAlfonso S. Siciliano unsigned int strcols(const char *mbstring) 193b319d934SAlfonso S. Siciliano { 194b319d934SAlfonso S. Siciliano int w; 195b319d934SAlfonso S. Siciliano unsigned int ncol; 196b319d934SAlfonso S. Siciliano size_t charlen, mb_cur_max; 197b319d934SAlfonso S. Siciliano wchar_t wch; 198b319d934SAlfonso S. Siciliano mbstate_t mbs; 199b319d934SAlfonso S. Siciliano 200b319d934SAlfonso S. Siciliano mb_cur_max = MB_CUR_MAX; 201b319d934SAlfonso S. Siciliano ncol = 0; 202b319d934SAlfonso S. Siciliano memset(&mbs, 0, sizeof(mbs)); 203b319d934SAlfonso S. Siciliano while ((charlen = mbrlen(mbstring, mb_cur_max, &mbs)) != 0 && 204b319d934SAlfonso S. Siciliano charlen != (size_t)-1 && charlen != (size_t)-2) { 205b319d934SAlfonso S. Siciliano if (mbtowc(&wch, mbstring, mb_cur_max) < 0) 206b319d934SAlfonso S. Siciliano return (0); 207b319d934SAlfonso S. Siciliano w = (wch == L'\t') ? TABSIZE : wcwidth(wch); 208b319d934SAlfonso S. Siciliano ncol += (w < 0) ? 0 : w; 209b319d934SAlfonso S. Siciliano mbstring += charlen; 210b319d934SAlfonso S. Siciliano } 211b319d934SAlfonso S. Siciliano 212b319d934SAlfonso S. Siciliano return (ncol); 213b319d934SAlfonso S. Siciliano } 214b319d934SAlfonso S. Siciliano 21561ba55bcSBaptiste Daroussin /* 21661ba55bcSBaptiste Daroussin * -3- Buttons 21761ba55bcSBaptiste Daroussin */ 21861ba55bcSBaptiste Daroussin static int buttons_min_width(struct buttons *bs) 219c76f0793SBaptiste Daroussin { 22061ba55bcSBaptiste Daroussin unsigned int width; 221c76f0793SBaptiste Daroussin 22261ba55bcSBaptiste Daroussin width = bs->nbuttons * bs->sizebutton; 22361ba55bcSBaptiste Daroussin if (bs->nbuttons > 0) 22461ba55bcSBaptiste Daroussin width += (bs->nbuttons - 1) * t.button.minmargin; 225c76f0793SBaptiste Daroussin 22661ba55bcSBaptiste Daroussin return (width); 227c76f0793SBaptiste Daroussin } 228c76f0793SBaptiste Daroussin 229263660c0SAlfonso Siciliano static void 230263660c0SAlfonso Siciliano draw_button(WINDOW *window, int y, int x, int size, const char *text, 231b319d934SAlfonso S. Siciliano wchar_t first, bool selected, bool shortcut) 232c76f0793SBaptiste Daroussin { 233c76f0793SBaptiste Daroussin int i, color_arrows, color_shortkey, color_button; 234c76f0793SBaptiste Daroussin 235c76f0793SBaptiste Daroussin if (selected) { 236f499134dSBaptiste Daroussin color_arrows = t.button.f_delimcolor; 237f499134dSBaptiste Daroussin color_shortkey = t.button.f_shortcutcolor; 238f499134dSBaptiste Daroussin color_button = t.button.f_color; 239c76f0793SBaptiste Daroussin } else { 240f499134dSBaptiste Daroussin color_arrows = t.button.delimcolor; 241f499134dSBaptiste Daroussin color_shortkey = t.button.shortcutcolor; 242f499134dSBaptiste Daroussin color_button = t.button.color; 243c76f0793SBaptiste Daroussin } 244c76f0793SBaptiste Daroussin 245c76f0793SBaptiste Daroussin wattron(window, color_arrows); 246bce40c02SAlfonso S. Siciliano mvwaddch(window, y, x, t.button.leftdelim); 247c76f0793SBaptiste Daroussin wattroff(window, color_arrows); 248c76f0793SBaptiste Daroussin wattron(window, color_button); 249c76f0793SBaptiste Daroussin for (i = 1; i < size - 1; i++) 250c76f0793SBaptiste Daroussin waddch(window, ' '); 251c76f0793SBaptiste Daroussin wattroff(window, color_button); 252c76f0793SBaptiste Daroussin wattron(window, color_arrows); 253bce40c02SAlfonso S. Siciliano mvwaddch(window, y, x + i, t.button.rightdelim); 254c76f0793SBaptiste Daroussin wattroff(window, color_arrows); 255c76f0793SBaptiste Daroussin 256b319d934SAlfonso S. Siciliano x = x + 1 + ((size - 2 - strcols(text))/2); 257c76f0793SBaptiste Daroussin wattron(window, color_button); 258c76f0793SBaptiste Daroussin mvwaddstr(window, y, x, text); 259c76f0793SBaptiste Daroussin wattroff(window, color_button); 260c76f0793SBaptiste Daroussin 261263660c0SAlfonso Siciliano if (shortcut) { 262c76f0793SBaptiste Daroussin wattron(window, color_shortkey); 263b319d934SAlfonso S. Siciliano mvwaddwch(window, y, x, first); 264c76f0793SBaptiste Daroussin wattroff(window, color_shortkey); 265c76f0793SBaptiste Daroussin } 266c76f0793SBaptiste Daroussin } 267c76f0793SBaptiste Daroussin 26861ba55bcSBaptiste Daroussin void draw_buttons(struct dialog *d) 269c76f0793SBaptiste Daroussin { 27061ba55bcSBaptiste Daroussin int i, x, startx, y; 271b319d934SAlfonso S. Siciliano unsigned int newmargin, margin, wbuttons; 272c76f0793SBaptiste Daroussin 27361ba55bcSBaptiste Daroussin y = d->h - 2; 274263660c0SAlfonso Siciliano 27561ba55bcSBaptiste Daroussin newmargin = d->w - BORDERS - (d->bs.nbuttons * d->bs.sizebutton); 27661ba55bcSBaptiste Daroussin newmargin /= (d->bs.nbuttons + 1); 277b319d934SAlfonso S. Siciliano newmargin = MIN(newmargin, t.button.maxmargin); 278b319d934SAlfonso S. Siciliano if (newmargin == 0) { 279b319d934SAlfonso S. Siciliano margin = t.button.minmargin; 28061ba55bcSBaptiste Daroussin wbuttons = buttons_min_width(&d->bs); 281b319d934SAlfonso S. Siciliano } else { 282b319d934SAlfonso S. Siciliano margin = newmargin; 28361ba55bcSBaptiste Daroussin wbuttons = d->bs.nbuttons * d->bs.sizebutton; 28461ba55bcSBaptiste Daroussin wbuttons += (d->bs.nbuttons + 1) * margin; 285b319d934SAlfonso S. Siciliano } 286c76f0793SBaptiste Daroussin 28761ba55bcSBaptiste Daroussin startx = d->w/2 - wbuttons/2 + newmargin; 28861ba55bcSBaptiste Daroussin for (i = 0; i < (int)d->bs.nbuttons; i++) { 28961ba55bcSBaptiste Daroussin x = i * (d->bs.sizebutton + margin); 29061ba55bcSBaptiste Daroussin draw_button(d->widget, y, startx + x, d->bs.sizebutton, 29161ba55bcSBaptiste Daroussin d->bs.label[i], d->bs.first[i], i == d->bs.curr, 29261ba55bcSBaptiste Daroussin d->bs.shortcut); 293c76f0793SBaptiste Daroussin } 294c76f0793SBaptiste Daroussin } 295c76f0793SBaptiste Daroussin 296c76f0793SBaptiste Daroussin void 29761ba55bcSBaptiste Daroussin set_buttons(struct dialog *d, bool shortcut, const char *oklabel, 29861ba55bcSBaptiste Daroussin const char *cancellabel) 299c76f0793SBaptiste Daroussin { 300c76f0793SBaptiste Daroussin int i; 301c76f0793SBaptiste Daroussin #define SIZEBUTTON 8 30261ba55bcSBaptiste Daroussin #define DEFAULT_BUTTON_LABEL OK_LABEL 3038c4f4028SBaptiste Daroussin #define DEFAULT_BUTTON_VALUE BSDDIALOG_OK 304b319d934SAlfonso S. Siciliano wchar_t first; 305c76f0793SBaptiste Daroussin 30661ba55bcSBaptiste Daroussin d->bs.nbuttons = 0; 30761ba55bcSBaptiste Daroussin d->bs.curr = 0; 30861ba55bcSBaptiste Daroussin d->bs.sizebutton = 0; 30961ba55bcSBaptiste Daroussin d->bs.shortcut = shortcut; 310c76f0793SBaptiste Daroussin 31161ba55bcSBaptiste Daroussin if (d->conf->button.left1_label != NULL) { 31261ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.left1_label; 31361ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_LEFT1; 31461ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 315c76f0793SBaptiste Daroussin } 316c76f0793SBaptiste Daroussin 31761ba55bcSBaptiste Daroussin if (d->conf->button.left2_label != NULL) { 31861ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.left2_label; 31961ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_LEFT2; 32061ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 321c76f0793SBaptiste Daroussin } 322c76f0793SBaptiste Daroussin 32361ba55bcSBaptiste Daroussin if (d->conf->button.left3_label != NULL) { 32461ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.left3_label; 32561ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_LEFT3; 32661ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 327c76f0793SBaptiste Daroussin } 328c76f0793SBaptiste Daroussin 32961ba55bcSBaptiste Daroussin if (oklabel != NULL && d->conf->button.without_ok == false) { 33061ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.ok_label != NULL ? 33161ba55bcSBaptiste Daroussin d->conf->button.ok_label : oklabel; 33261ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_OK; 33361ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 334c76f0793SBaptiste Daroussin } 335c76f0793SBaptiste Daroussin 33661ba55bcSBaptiste Daroussin if (d->conf->button.with_extra) { 33761ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.extra_label != NULL ? 33861ba55bcSBaptiste Daroussin d->conf->button.extra_label : "Extra"; 33961ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_EXTRA; 34061ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 341f499134dSBaptiste Daroussin } 342f499134dSBaptiste Daroussin 34361ba55bcSBaptiste Daroussin if (cancellabel != NULL && d->conf->button.without_cancel == false) { 34461ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.cancel_label ? 34561ba55bcSBaptiste Daroussin d->conf->button.cancel_label : cancellabel; 34661ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_CANCEL; 34761ba55bcSBaptiste Daroussin if (d->conf->button.default_cancel) 34861ba55bcSBaptiste Daroussin d->bs.curr = d->bs.nbuttons; 34961ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 350f499134dSBaptiste Daroussin } 351f499134dSBaptiste Daroussin 35261ba55bcSBaptiste Daroussin if (d->conf->button.with_help) { 35361ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.help_label != NULL ? 35461ba55bcSBaptiste Daroussin d->conf->button.help_label : "Help"; 35561ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_HELP; 35661ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 357c76f0793SBaptiste Daroussin } 358c76f0793SBaptiste Daroussin 35961ba55bcSBaptiste Daroussin if (d->conf->button.right1_label != NULL) { 36061ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.right1_label; 36161ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_RIGHT1; 36261ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 363b319d934SAlfonso S. Siciliano } 364b319d934SAlfonso S. Siciliano 36561ba55bcSBaptiste Daroussin if (d->conf->button.right2_label != NULL) { 36661ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.right2_label; 36761ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_RIGHT2; 36861ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 36961ba55bcSBaptiste Daroussin } 37061ba55bcSBaptiste Daroussin 37161ba55bcSBaptiste Daroussin if (d->conf->button.right3_label != NULL) { 37261ba55bcSBaptiste Daroussin d->bs.label[d->bs.nbuttons] = d->conf->button.right3_label; 37361ba55bcSBaptiste Daroussin d->bs.value[d->bs.nbuttons] = BSDDIALOG_RIGHT3; 37461ba55bcSBaptiste Daroussin d->bs.nbuttons += 1; 37561ba55bcSBaptiste Daroussin } 37661ba55bcSBaptiste Daroussin 37761ba55bcSBaptiste Daroussin if (d->bs.nbuttons == 0) { 37861ba55bcSBaptiste Daroussin d->bs.label[0] = DEFAULT_BUTTON_LABEL; 37961ba55bcSBaptiste Daroussin d->bs.value[0] = DEFAULT_BUTTON_VALUE; 38061ba55bcSBaptiste Daroussin d->bs.nbuttons = 1; 38161ba55bcSBaptiste Daroussin } 38261ba55bcSBaptiste Daroussin 38361ba55bcSBaptiste Daroussin for (i = 0; i < (int)d->bs.nbuttons; i++) { 38461ba55bcSBaptiste Daroussin mbtowc(&first, d->bs.label[i], MB_CUR_MAX); 38561ba55bcSBaptiste Daroussin d->bs.first[i] = first; 38661ba55bcSBaptiste Daroussin } 38761ba55bcSBaptiste Daroussin 38861ba55bcSBaptiste Daroussin if (d->conf->button.default_label != NULL) { 38961ba55bcSBaptiste Daroussin for (i = 0; i < (int)d->bs.nbuttons; i++) { 39061ba55bcSBaptiste Daroussin if (strcmp(d->conf->button.default_label, 39161ba55bcSBaptiste Daroussin d->bs.label[i]) == 0) 39261ba55bcSBaptiste Daroussin d->bs.curr = i; 393c76f0793SBaptiste Daroussin } 394c76f0793SBaptiste Daroussin } 395c76f0793SBaptiste Daroussin 39661ba55bcSBaptiste Daroussin d->bs.sizebutton = MAX(SIZEBUTTON - 2, strcols(d->bs.label[0])); 39761ba55bcSBaptiste Daroussin for (i = 1; i < (int)d->bs.nbuttons; i++) 39861ba55bcSBaptiste Daroussin d->bs.sizebutton = MAX(d->bs.sizebutton, strcols(d->bs.label[i])); 39961ba55bcSBaptiste Daroussin d->bs.sizebutton += 2; 400bce40c02SAlfonso S. Siciliano } 401bce40c02SAlfonso S. Siciliano 402b319d934SAlfonso S. Siciliano bool shortcut_buttons(wint_t key, struct buttons *bs) 403f499134dSBaptiste Daroussin { 404263660c0SAlfonso Siciliano bool match; 405263660c0SAlfonso Siciliano unsigned int i; 406c76f0793SBaptiste Daroussin 407263660c0SAlfonso Siciliano match = false; 408263660c0SAlfonso Siciliano for (i = 0; i < bs->nbuttons; i++) { 409b319d934SAlfonso S. Siciliano if (towlower(key) == towlower(bs->first[i])) { 410263660c0SAlfonso Siciliano bs->curr = i; 411263660c0SAlfonso Siciliano match = true; 412263660c0SAlfonso Siciliano break; 413263660c0SAlfonso Siciliano } 414263660c0SAlfonso Siciliano } 415263660c0SAlfonso Siciliano 416263660c0SAlfonso Siciliano return (match); 417263660c0SAlfonso Siciliano } 418263660c0SAlfonso Siciliano 41961ba55bcSBaptiste Daroussin /* 42061ba55bcSBaptiste Daroussin * -4- (Auto) Sizing and (Auto) Position 42161ba55bcSBaptiste Daroussin */ 42261ba55bcSBaptiste Daroussin static int widget_max_height(struct bsddialog_conf *conf) 42361ba55bcSBaptiste Daroussin { 42461ba55bcSBaptiste Daroussin int maxheight; 42561ba55bcSBaptiste Daroussin 42661ba55bcSBaptiste Daroussin maxheight = conf->shadow ? SCREENLINES - (int)t.shadow.y : SCREENLINES; 42761ba55bcSBaptiste Daroussin if (maxheight <= 0) 42861ba55bcSBaptiste Daroussin RETURN_ERROR("Terminal too small, screen lines - shadow <= 0"); 42961ba55bcSBaptiste Daroussin 43061ba55bcSBaptiste Daroussin if (conf->y != BSDDIALOG_CENTER && conf->auto_topmargin > 0) 43161ba55bcSBaptiste Daroussin RETURN_ERROR("conf.y > 0 and conf->auto_topmargin > 0"); 43261ba55bcSBaptiste Daroussin else if (conf->y == BSDDIALOG_CENTER) { 43361ba55bcSBaptiste Daroussin maxheight -= conf->auto_topmargin; 43461ba55bcSBaptiste Daroussin if (maxheight <= 0) 43561ba55bcSBaptiste Daroussin RETURN_ERROR("Terminal too small, screen lines - top " 43661ba55bcSBaptiste Daroussin "margins <= 0"); 43761ba55bcSBaptiste Daroussin } else if (conf->y > 0) { 43861ba55bcSBaptiste Daroussin maxheight -= conf->y; 43961ba55bcSBaptiste Daroussin if (maxheight <= 0) 44061ba55bcSBaptiste Daroussin RETURN_ERROR("Terminal too small, screen lines - " 44161ba55bcSBaptiste Daroussin "shadow - y <= 0"); 44261ba55bcSBaptiste Daroussin } 44361ba55bcSBaptiste Daroussin 44461ba55bcSBaptiste Daroussin maxheight -= conf->auto_downmargin; 44561ba55bcSBaptiste Daroussin if (maxheight <= 0) 44661ba55bcSBaptiste Daroussin RETURN_ERROR("Terminal too small, screen lines - Down margins " 44761ba55bcSBaptiste Daroussin "<= 0"); 44861ba55bcSBaptiste Daroussin 44961ba55bcSBaptiste Daroussin return (maxheight); 45061ba55bcSBaptiste Daroussin } 45161ba55bcSBaptiste Daroussin 45261ba55bcSBaptiste Daroussin static int widget_max_width(struct bsddialog_conf *conf) 45361ba55bcSBaptiste Daroussin { 45461ba55bcSBaptiste Daroussin int maxwidth; 45561ba55bcSBaptiste Daroussin 45661ba55bcSBaptiste Daroussin maxwidth = conf->shadow ? SCREENCOLS - (int)t.shadow.x : SCREENCOLS; 45761ba55bcSBaptiste Daroussin if (maxwidth <= 0) 45861ba55bcSBaptiste Daroussin RETURN_ERROR("Terminal too small, screen cols - shadow <= 0"); 45961ba55bcSBaptiste Daroussin 46061ba55bcSBaptiste Daroussin if (conf->x > 0) { 46161ba55bcSBaptiste Daroussin maxwidth -= conf->x; 46261ba55bcSBaptiste Daroussin if (maxwidth <= 0) 46361ba55bcSBaptiste Daroussin RETURN_ERROR("Terminal too small, screen cols - shadow " 46461ba55bcSBaptiste Daroussin "- x <= 0"); 46561ba55bcSBaptiste Daroussin } 46661ba55bcSBaptiste Daroussin 46761ba55bcSBaptiste Daroussin return (maxwidth); 46861ba55bcSBaptiste Daroussin } 46961ba55bcSBaptiste Daroussin 470b319d934SAlfonso S. Siciliano static bool is_wtext_attr(const wchar_t *wtext) 471263660c0SAlfonso Siciliano { 47261ba55bcSBaptiste Daroussin bool att; 47361ba55bcSBaptiste Daroussin 474b319d934SAlfonso S. Siciliano if (wcsnlen(wtext, 3) < 3) 475263660c0SAlfonso Siciliano return (false); 476b319d934SAlfonso S. Siciliano if (wtext[0] != L'\\' || wtext[1] != L'Z') 477263660c0SAlfonso Siciliano return (false); 478f499134dSBaptiste Daroussin 47961ba55bcSBaptiste Daroussin att = wcschr(L"nbBdDkKrRsSuU01234567", wtext[2]) == NULL ? false : true; 48061ba55bcSBaptiste Daroussin 48161ba55bcSBaptiste Daroussin return (att); 482f499134dSBaptiste Daroussin } 483c76f0793SBaptiste Daroussin 484263660c0SAlfonso Siciliano #define NL -1 485263660c0SAlfonso Siciliano #define WS -2 486b319d934SAlfonso S. Siciliano #define TB -3 487b319d934SAlfonso S. Siciliano 488b319d934SAlfonso S. Siciliano struct textproperties { 489b319d934SAlfonso S. Siciliano int nword; 490b319d934SAlfonso S. Siciliano int *words; 491b319d934SAlfonso S. Siciliano uint8_t *wletters; 492b319d934SAlfonso S. Siciliano int maxwordcols; 493b319d934SAlfonso S. Siciliano int maxline; 494b319d934SAlfonso S. Siciliano bool hasnewline; 495b319d934SAlfonso S. Siciliano }; 496b319d934SAlfonso S. Siciliano 497b319d934SAlfonso S. Siciliano static int 498b319d934SAlfonso S. Siciliano text_properties(struct bsddialog_conf *conf, const char *text, 499b319d934SAlfonso S. Siciliano struct textproperties *tp) 500b319d934SAlfonso S. Siciliano { 501b319d934SAlfonso S. Siciliano int i, l, currlinecols, maxwords, wtextlen, tablen, wordcols; 502b319d934SAlfonso S. Siciliano wchar_t *wtext; 503b319d934SAlfonso S. Siciliano 504b319d934SAlfonso S. Siciliano tablen = (conf->text.tablen == 0) ? TABSIZE : (int)conf->text.tablen; 505c76f0793SBaptiste Daroussin 506263660c0SAlfonso Siciliano maxwords = 1024; 507b319d934SAlfonso S. Siciliano if ((tp->words = calloc(maxwords, sizeof(int))) == NULL) 508263660c0SAlfonso Siciliano RETURN_ERROR("Cannot alloc memory for text autosize"); 509263660c0SAlfonso Siciliano 510b319d934SAlfonso S. Siciliano if ((wtext = alloc_mbstows(text)) == NULL) 511b319d934SAlfonso S. Siciliano RETURN_ERROR("Cannot allocate/autosize text in wchar_t*"); 512b319d934SAlfonso S. Siciliano wtextlen = wcslen(wtext); 513b319d934SAlfonso S. Siciliano if ((tp->wletters = calloc(wtextlen, sizeof(uint8_t))) == NULL) 514b319d934SAlfonso S. Siciliano RETURN_ERROR("Cannot allocate wletters for text autosizing"); 515263660c0SAlfonso Siciliano 516b319d934SAlfonso S. Siciliano tp->nword = 0; 517b319d934SAlfonso S. Siciliano tp->maxline = 0; 518b319d934SAlfonso S. Siciliano tp->maxwordcols = 0; 519b319d934SAlfonso S. Siciliano tp->hasnewline = false; 520b319d934SAlfonso S. Siciliano currlinecols = 0; 521b319d934SAlfonso S. Siciliano wordcols = 0; 522b319d934SAlfonso S. Siciliano l = 0; 523b319d934SAlfonso S. Siciliano for (i = 0; i < wtextlen; i++) { 52461ba55bcSBaptiste Daroussin if (conf->text.escape && is_wtext_attr(wtext + i)) { 525b319d934SAlfonso S. Siciliano i += 2; /* +1 for update statement */ 526263660c0SAlfonso Siciliano continue; 527263660c0SAlfonso Siciliano } 528263660c0SAlfonso Siciliano 529b319d934SAlfonso S. Siciliano if (tp->nword + 1 >= maxwords) { 530263660c0SAlfonso Siciliano maxwords += 1024; 531b319d934SAlfonso S. Siciliano tp->words = realloc(tp->words, maxwords * sizeof(int)); 532b319d934SAlfonso S. Siciliano if (tp->words == NULL) 533263660c0SAlfonso Siciliano RETURN_ERROR("Cannot realloc memory for text " 534263660c0SAlfonso Siciliano "autosize"); 535263660c0SAlfonso Siciliano } 536263660c0SAlfonso Siciliano 537b319d934SAlfonso S. Siciliano if (wcschr(L"\t\n ", wtext[i]) != NULL) { 538b319d934SAlfonso S. Siciliano tp->maxwordcols = MAX(wordcols, tp->maxwordcols); 539b319d934SAlfonso S. Siciliano 540b319d934SAlfonso S. Siciliano if (wordcols != 0) { 541b319d934SAlfonso S. Siciliano /* line */ 542b319d934SAlfonso S. Siciliano currlinecols += wordcols; 543b319d934SAlfonso S. Siciliano /* word */ 544b319d934SAlfonso S. Siciliano tp->words[tp->nword] = wordcols; 545b319d934SAlfonso S. Siciliano tp->nword += 1; 546b319d934SAlfonso S. Siciliano wordcols = 0; 547b319d934SAlfonso S. Siciliano } 548b319d934SAlfonso S. Siciliano 549b319d934SAlfonso S. Siciliano switch (wtext[i]) { 550b319d934SAlfonso S. Siciliano case L'\t': 551b319d934SAlfonso S. Siciliano /* line */ 552b319d934SAlfonso S. Siciliano currlinecols += tablen; 553b319d934SAlfonso S. Siciliano /* word */ 554b319d934SAlfonso S. Siciliano tp->words[tp->nword] = TB; 555b319d934SAlfonso S. Siciliano break; 556b319d934SAlfonso S. Siciliano case L'\n': 557b319d934SAlfonso S. Siciliano /* line */ 558b319d934SAlfonso S. Siciliano tp->hasnewline = true; 559b319d934SAlfonso S. Siciliano tp->maxline = MAX(tp->maxline, currlinecols); 560b319d934SAlfonso S. Siciliano currlinecols = 0; 561b319d934SAlfonso S. Siciliano /* word */ 562b319d934SAlfonso S. Siciliano tp->words[tp->nword] = NL; 563b319d934SAlfonso S. Siciliano break; 564b319d934SAlfonso S. Siciliano case L' ': 565b319d934SAlfonso S. Siciliano /* line */ 566b319d934SAlfonso S. Siciliano currlinecols += 1; 567b319d934SAlfonso S. Siciliano /* word */ 568b319d934SAlfonso S. Siciliano tp->words[tp->nword] = WS; 569263660c0SAlfonso Siciliano break; 570263660c0SAlfonso Siciliano } 571b319d934SAlfonso S. Siciliano tp->nword += 1; 572263660c0SAlfonso Siciliano } else { 573b319d934SAlfonso S. Siciliano tp->wletters[l] = wcwidth(wtext[i]); 574b319d934SAlfonso S. Siciliano wordcols += tp->wletters[l]; 575b319d934SAlfonso S. Siciliano l++; 576263660c0SAlfonso Siciliano } 577263660c0SAlfonso Siciliano } 578b319d934SAlfonso S. Siciliano /* word */ 579b319d934SAlfonso S. Siciliano if (wordcols != 0) { 580b319d934SAlfonso S. Siciliano tp->words[tp->nword] = wordcols; 581b319d934SAlfonso S. Siciliano tp->nword += 1; 582b319d934SAlfonso S. Siciliano tp->maxwordcols = MAX(wordcols, tp->maxwordcols); 583b319d934SAlfonso S. Siciliano } 584b319d934SAlfonso S. Siciliano /* line */ 585b319d934SAlfonso S. Siciliano tp->maxline = MAX(tp->maxline, currlinecols); 586263660c0SAlfonso Siciliano 587b319d934SAlfonso S. Siciliano free(wtext); 588b319d934SAlfonso S. Siciliano 589b319d934SAlfonso S. Siciliano return (0); 590263660c0SAlfonso Siciliano } 591263660c0SAlfonso Siciliano 592b319d934SAlfonso S. Siciliano static int 593b319d934SAlfonso S. Siciliano text_autosize(struct bsddialog_conf *conf, struct textproperties *tp, 594b319d934SAlfonso S. Siciliano int maxrows, int mincols, bool increasecols, int *h, int *w) 595b319d934SAlfonso S. Siciliano { 596b319d934SAlfonso S. Siciliano int i, j, x, y, z, l, line, maxwidth, tablen; 597b319d934SAlfonso S. Siciliano 59861ba55bcSBaptiste Daroussin maxwidth = widget_max_width(conf) - BORDERS - TEXTHMARGINS; 599b319d934SAlfonso S. Siciliano tablen = (conf->text.tablen == 0) ? TABSIZE : (int)conf->text.tablen; 600b319d934SAlfonso S. Siciliano 601263660c0SAlfonso Siciliano if (increasecols) { 602b319d934SAlfonso S. Siciliano mincols = MAX(mincols, tp->maxwordcols); 603263660c0SAlfonso Siciliano mincols = MAX(mincols, 60461ba55bcSBaptiste Daroussin (int)conf->auto_minwidth - BORDERS - TEXTHMARGINS); 605263660c0SAlfonso Siciliano mincols = MIN(mincols, maxwidth); 606263660c0SAlfonso Siciliano } 607263660c0SAlfonso Siciliano 608263660c0SAlfonso Siciliano while (true) { 609263660c0SAlfonso Siciliano x = 0; 610263660c0SAlfonso Siciliano y = 1; 611263660c0SAlfonso Siciliano line=0; 612b319d934SAlfonso S. Siciliano l = 0; 613b319d934SAlfonso S. Siciliano for (i = 0; i < tp->nword; i++) { 614b319d934SAlfonso S. Siciliano switch (tp->words[i]) { 615b319d934SAlfonso S. Siciliano case TB: 616b319d934SAlfonso S. Siciliano for (j = 0; j < tablen; j++) { 617b319d934SAlfonso S. Siciliano if (x >= mincols) { 618b319d934SAlfonso S. Siciliano x = 0; 619b319d934SAlfonso S. Siciliano y++; 620b319d934SAlfonso S. Siciliano } 621b319d934SAlfonso S. Siciliano x++; 622b319d934SAlfonso S. Siciliano } 623b319d934SAlfonso S. Siciliano break; 624b319d934SAlfonso S. Siciliano case NL: 625263660c0SAlfonso Siciliano y++; 626263660c0SAlfonso Siciliano x = 0; 627b319d934SAlfonso S. Siciliano break; 628b319d934SAlfonso S. Siciliano case WS: 629263660c0SAlfonso Siciliano x++; 630263660c0SAlfonso Siciliano if (x >= mincols) { 631263660c0SAlfonso Siciliano x = 0; 632263660c0SAlfonso Siciliano y++; 633263660c0SAlfonso Siciliano } 634b319d934SAlfonso S. Siciliano break; 635b319d934SAlfonso S. Siciliano default: 636b319d934SAlfonso S. Siciliano if (tp->words[i] + x <= mincols) { 637b319d934SAlfonso S. Siciliano x += tp->words[i]; 638b319d934SAlfonso S. Siciliano for (z = 0 ; z != tp->words[i]; l++ ) 639b319d934SAlfonso S. Siciliano z += tp->wletters[l]; 640b319d934SAlfonso S. Siciliano } else if (tp->words[i] <= mincols) { 641263660c0SAlfonso Siciliano y++; 642b319d934SAlfonso S. Siciliano x = tp->words[i]; 643b319d934SAlfonso S. Siciliano for (z = 0 ; z != tp->words[i]; l++ ) 644b319d934SAlfonso S. Siciliano z += tp->wletters[l]; 645b319d934SAlfonso S. Siciliano } else { 646b319d934SAlfonso S. Siciliano for (j = tp->words[i]; j > 0; ) { 647b319d934SAlfonso S. Siciliano y = (x == 0) ? y : y + 1; 648b319d934SAlfonso S. Siciliano z = 0; 649b319d934SAlfonso S. Siciliano while (z != j && z < mincols) { 650b319d934SAlfonso S. Siciliano z += tp->wletters[l]; 651b319d934SAlfonso S. Siciliano l++; 652b319d934SAlfonso S. Siciliano } 653b319d934SAlfonso S. Siciliano x = z; 654b319d934SAlfonso S. Siciliano line = MAX(line, x); 655b319d934SAlfonso S. Siciliano j -= z; 656263660c0SAlfonso Siciliano } 657263660c0SAlfonso Siciliano } 658263660c0SAlfonso Siciliano } 659263660c0SAlfonso Siciliano line = MAX(line, x); 660263660c0SAlfonso Siciliano } 661263660c0SAlfonso Siciliano 662263660c0SAlfonso Siciliano if (increasecols == false) 663263660c0SAlfonso Siciliano break; 664b319d934SAlfonso S. Siciliano if (mincols >= maxwidth) 665b319d934SAlfonso S. Siciliano break; 666b319d934SAlfonso S. Siciliano if (line >= y * (int)conf->text.cols_per_row && y <= maxrows) 667263660c0SAlfonso Siciliano break; 668263660c0SAlfonso Siciliano mincols++; 669263660c0SAlfonso Siciliano } 670263660c0SAlfonso Siciliano 671b319d934SAlfonso S. Siciliano *h = (tp->nword == 0) ? 0 : y; 672263660c0SAlfonso Siciliano *w = MIN(mincols, line); /* wtext can be less than mincols */ 673263660c0SAlfonso Siciliano 674263660c0SAlfonso Siciliano return (0); 675263660c0SAlfonso Siciliano } 676263660c0SAlfonso Siciliano 67761ba55bcSBaptiste Daroussin static int 678263660c0SAlfonso Siciliano text_size(struct bsddialog_conf *conf, int rows, int cols, const char *text, 679263660c0SAlfonso Siciliano struct buttons *bs, int rowsnotext, int startwtext, int *htext, int *wtext) 680263660c0SAlfonso Siciliano { 681263660c0SAlfonso Siciliano bool changewtext; 682b319d934SAlfonso S. Siciliano int wbuttons, maxhtext; 683b319d934SAlfonso S. Siciliano struct textproperties tp; 684263660c0SAlfonso Siciliano 685263660c0SAlfonso Siciliano wbuttons = 0; 68661ba55bcSBaptiste Daroussin if (bs->nbuttons > 0) 68761ba55bcSBaptiste Daroussin wbuttons = buttons_min_width(bs); 688263660c0SAlfonso Siciliano 689b319d934SAlfonso S. Siciliano /* Rows */ 690b319d934SAlfonso S. Siciliano if (rows == BSDDIALOG_AUTOSIZE || rows == BSDDIALOG_FULLSCREEN) { 69161ba55bcSBaptiste Daroussin maxhtext = widget_max_height(conf) - BORDERS - rowsnotext; 692b319d934SAlfonso S. Siciliano } else { /* fixed */ 69361ba55bcSBaptiste Daroussin maxhtext = rows - BORDERS - rowsnotext; 694b319d934SAlfonso S. Siciliano } 69561ba55bcSBaptiste Daroussin if (bs->nbuttons > 0) 696b319d934SAlfonso S. Siciliano maxhtext -= 2; 697b319d934SAlfonso S. Siciliano if (maxhtext <= 0) 698b319d934SAlfonso S. Siciliano maxhtext = 1; /* text_autosize() computes always htext */ 699b319d934SAlfonso S. Siciliano 700b319d934SAlfonso S. Siciliano /* Cols */ 701263660c0SAlfonso Siciliano if (cols == BSDDIALOG_AUTOSIZE) { 702263660c0SAlfonso Siciliano startwtext = MAX(startwtext, wbuttons - TEXTHMARGINS); 703263660c0SAlfonso Siciliano changewtext = true; 704263660c0SAlfonso Siciliano } else if (cols == BSDDIALOG_FULLSCREEN) { 70561ba55bcSBaptiste Daroussin startwtext = widget_max_width(conf) - BORDERS - TEXTHMARGINS; 706263660c0SAlfonso Siciliano changewtext = false; 707263660c0SAlfonso Siciliano } else { /* fixed */ 70861ba55bcSBaptiste Daroussin startwtext = cols - BORDERS - TEXTHMARGINS; 709263660c0SAlfonso Siciliano changewtext = false; 710263660c0SAlfonso Siciliano } 711263660c0SAlfonso Siciliano 712263660c0SAlfonso Siciliano if (startwtext <= 0 && changewtext) 713263660c0SAlfonso Siciliano startwtext = 1; 714263660c0SAlfonso Siciliano 715b319d934SAlfonso S. Siciliano /* Sizing calculation */ 716b319d934SAlfonso S. Siciliano if (text_properties(conf, text, &tp) != 0) 717b319d934SAlfonso S. Siciliano return (BSDDIALOG_ERROR); 71861ba55bcSBaptiste Daroussin if (tp.nword > 0 && startwtext <= 0) 71961ba55bcSBaptiste Daroussin RETURN_FMTERROR("(fixed cols or fullscreen) " 72061ba55bcSBaptiste Daroussin "needed at least %d cols to draw text", 72161ba55bcSBaptiste Daroussin BORDERS + TEXTHMARGINS + 1); 722b319d934SAlfonso S. Siciliano if (text_autosize(conf, &tp, maxhtext, startwtext, changewtext, htext, 723b319d934SAlfonso S. Siciliano wtext) != 0) 724263660c0SAlfonso Siciliano return (BSDDIALOG_ERROR); 725263660c0SAlfonso Siciliano 726b319d934SAlfonso S. Siciliano free(tp.words); 727b319d934SAlfonso S. Siciliano free(tp.wletters); 728b319d934SAlfonso S. Siciliano 729263660c0SAlfonso Siciliano return (0); 730263660c0SAlfonso Siciliano } 731263660c0SAlfonso Siciliano 73261ba55bcSBaptiste Daroussin static int 73361ba55bcSBaptiste Daroussin widget_min_height(struct bsddialog_conf *conf, int htext, int hnotext, 734263660c0SAlfonso Siciliano bool withbuttons) 735263660c0SAlfonso Siciliano { 736263660c0SAlfonso Siciliano int min; 737263660c0SAlfonso Siciliano 73861ba55bcSBaptiste Daroussin /* dialog borders */ 73961ba55bcSBaptiste Daroussin min = BORDERS; 740263660c0SAlfonso Siciliano 741263660c0SAlfonso Siciliano /* text */ 742263660c0SAlfonso Siciliano min += htext; 743263660c0SAlfonso Siciliano 74461ba55bcSBaptiste Daroussin /* specific widget lines without text */ 74561ba55bcSBaptiste Daroussin min += hnotext; 746263660c0SAlfonso Siciliano 74761ba55bcSBaptiste Daroussin /* buttons */ 74861ba55bcSBaptiste Daroussin if (withbuttons) 74961ba55bcSBaptiste Daroussin min += HBUTTONS; /* buttons and their up-border */ 75061ba55bcSBaptiste Daroussin 751263660c0SAlfonso Siciliano /* conf.auto_minheight */ 752263660c0SAlfonso Siciliano min = MAX(min, (int)conf->auto_minheight); 753263660c0SAlfonso Siciliano 754263660c0SAlfonso Siciliano return (min); 755263660c0SAlfonso Siciliano } 756263660c0SAlfonso Siciliano 75761ba55bcSBaptiste Daroussin static int 758263660c0SAlfonso Siciliano widget_min_width(struct bsddialog_conf *conf, int wtext, int minwidget, 759263660c0SAlfonso Siciliano struct buttons *bs) 760263660c0SAlfonso Siciliano 761263660c0SAlfonso Siciliano { 762b319d934SAlfonso S. Siciliano int min, delimtitle, wbottomtitle, wtitle; 763263660c0SAlfonso Siciliano 764263660c0SAlfonso Siciliano min = 0; 765263660c0SAlfonso Siciliano 766263660c0SAlfonso Siciliano /* buttons */ 76761ba55bcSBaptiste Daroussin if (bs->nbuttons > 0) 76861ba55bcSBaptiste Daroussin min += buttons_min_width(bs); 769263660c0SAlfonso Siciliano 770263660c0SAlfonso Siciliano /* text */ 771263660c0SAlfonso Siciliano if (wtext > 0) 772263660c0SAlfonso Siciliano min = MAX(min, wtext + TEXTHMARGINS); 773263660c0SAlfonso Siciliano 774263660c0SAlfonso Siciliano /* specific widget min width */ 775263660c0SAlfonso Siciliano min = MAX(min, minwidget); 776263660c0SAlfonso Siciliano 777263660c0SAlfonso Siciliano /* title */ 778263660c0SAlfonso Siciliano if (conf->title != NULL) { 779263660c0SAlfonso Siciliano delimtitle = t.dialog.delimtitle ? 2 : 0; 780b319d934SAlfonso S. Siciliano wtitle = strcols(conf->title); 781b319d934SAlfonso S. Siciliano min = MAX(min, wtitle + 2 + delimtitle); 782263660c0SAlfonso Siciliano } 783263660c0SAlfonso Siciliano 784263660c0SAlfonso Siciliano /* bottom title */ 785b319d934SAlfonso S. Siciliano if (conf->bottomtitle != NULL) { 786b319d934SAlfonso S. Siciliano wbottomtitle = strcols(conf->bottomtitle); 787b319d934SAlfonso S. Siciliano min = MAX(min, wbottomtitle + 4); 788b319d934SAlfonso S. Siciliano } 789263660c0SAlfonso Siciliano 790263660c0SAlfonso Siciliano /* dialog borders */ 79161ba55bcSBaptiste Daroussin min += BORDERS; 792263660c0SAlfonso Siciliano /* conf.auto_minwidth */ 793263660c0SAlfonso Siciliano min = MAX(min, (int)conf->auto_minwidth); 794263660c0SAlfonso Siciliano 795263660c0SAlfonso Siciliano return (min); 796c76f0793SBaptiste Daroussin } 797c76f0793SBaptiste Daroussin 798c76f0793SBaptiste Daroussin int 799f499134dSBaptiste Daroussin set_widget_size(struct bsddialog_conf *conf, int rows, int cols, int *h, int *w) 800c76f0793SBaptiste Daroussin { 801c76f0793SBaptiste Daroussin int maxheight, maxwidth; 802c76f0793SBaptiste Daroussin 803c76f0793SBaptiste Daroussin if ((maxheight = widget_max_height(conf)) == BSDDIALOG_ERROR) 804263660c0SAlfonso Siciliano return (BSDDIALOG_ERROR); 805c76f0793SBaptiste Daroussin 806c76f0793SBaptiste Daroussin if (rows == BSDDIALOG_FULLSCREEN) 807c76f0793SBaptiste Daroussin *h = maxheight; 808c76f0793SBaptiste Daroussin else if (rows < BSDDIALOG_FULLSCREEN) 809c76f0793SBaptiste Daroussin RETURN_ERROR("Negative (less than -1) height"); 81084823cc7SAlfonso S. Siciliano else if (rows > BSDDIALOG_AUTOSIZE) /* fixed rows */ 81184823cc7SAlfonso S. Siciliano *h = MIN(rows, maxheight); /* rows is at most maxheight */ 812c76f0793SBaptiste Daroussin /* rows == AUTOSIZE: each widget has to set its size */ 813c76f0793SBaptiste Daroussin 814c76f0793SBaptiste Daroussin if ((maxwidth = widget_max_width(conf)) == BSDDIALOG_ERROR) 815263660c0SAlfonso Siciliano return (BSDDIALOG_ERROR); 816c76f0793SBaptiste Daroussin 817c76f0793SBaptiste Daroussin if (cols == BSDDIALOG_FULLSCREEN) 818c76f0793SBaptiste Daroussin *w = maxwidth; 819c76f0793SBaptiste Daroussin else if (cols < BSDDIALOG_FULLSCREEN) 820c76f0793SBaptiste Daroussin RETURN_ERROR("Negative (less than -1) width"); 82184823cc7SAlfonso S. Siciliano else if (cols > BSDDIALOG_AUTOSIZE) /* fixed cols */ 82284823cc7SAlfonso S. Siciliano *w = MIN(cols, maxwidth); /* cols is at most maxwidth */ 823c76f0793SBaptiste Daroussin /* cols == AUTOSIZE: each widget has to set its size */ 824c76f0793SBaptiste Daroussin 825263660c0SAlfonso Siciliano return (0); 826c76f0793SBaptiste Daroussin } 827c76f0793SBaptiste Daroussin 828c76f0793SBaptiste Daroussin int 82961ba55bcSBaptiste Daroussin set_widget_autosize(struct bsddialog_conf *conf, int rows, int cols, int *h, 83061ba55bcSBaptiste Daroussin int *w, const char *text, int *rowstext, struct buttons *bs, int hnotext, 83161ba55bcSBaptiste Daroussin int minw) 83261ba55bcSBaptiste Daroussin { 83361ba55bcSBaptiste Daroussin int htext, wtext; 83461ba55bcSBaptiste Daroussin 83561ba55bcSBaptiste Daroussin if (rows == BSDDIALOG_AUTOSIZE || cols == BSDDIALOG_AUTOSIZE || 83661ba55bcSBaptiste Daroussin rowstext != NULL) { 83761ba55bcSBaptiste Daroussin if (text_size(conf, rows, cols, text, bs, hnotext, minw, 83861ba55bcSBaptiste Daroussin &htext, &wtext) != 0) 83961ba55bcSBaptiste Daroussin return (BSDDIALOG_ERROR); 84061ba55bcSBaptiste Daroussin if (rowstext != NULL) 84161ba55bcSBaptiste Daroussin *rowstext = htext; 84261ba55bcSBaptiste Daroussin } 84361ba55bcSBaptiste Daroussin 84461ba55bcSBaptiste Daroussin if (rows == BSDDIALOG_AUTOSIZE) { 84561ba55bcSBaptiste Daroussin *h = widget_min_height(conf, htext, hnotext, bs->nbuttons > 0); 84661ba55bcSBaptiste Daroussin *h = MIN(*h, widget_max_height(conf)); 84761ba55bcSBaptiste Daroussin } 84861ba55bcSBaptiste Daroussin 84961ba55bcSBaptiste Daroussin if (cols == BSDDIALOG_AUTOSIZE) { 85061ba55bcSBaptiste Daroussin *w = widget_min_width(conf, wtext, minw, bs); 85161ba55bcSBaptiste Daroussin *w = MIN(*w, widget_max_width(conf)); 85261ba55bcSBaptiste Daroussin } 85361ba55bcSBaptiste Daroussin 85461ba55bcSBaptiste Daroussin return (0); 85561ba55bcSBaptiste Daroussin } 85661ba55bcSBaptiste Daroussin 85761ba55bcSBaptiste Daroussin int widget_checksize(int h, int w, struct buttons *bs, int hnotext, int minw) 85861ba55bcSBaptiste Daroussin { 85961ba55bcSBaptiste Daroussin int minheight, minwidth; 86061ba55bcSBaptiste Daroussin 86161ba55bcSBaptiste Daroussin minheight = BORDERS + hnotext; 86261ba55bcSBaptiste Daroussin if (bs->nbuttons > 0) 86361ba55bcSBaptiste Daroussin minheight += HBUTTONS; 86461ba55bcSBaptiste Daroussin if (h < minheight) 86561ba55bcSBaptiste Daroussin RETURN_FMTERROR("Current rows: %d, needed at least: %d", 86661ba55bcSBaptiste Daroussin h, minheight); 86761ba55bcSBaptiste Daroussin 86861ba55bcSBaptiste Daroussin minwidth = 0; 86961ba55bcSBaptiste Daroussin if (bs->nbuttons > 0) 87061ba55bcSBaptiste Daroussin minwidth = buttons_min_width(bs); 87161ba55bcSBaptiste Daroussin minwidth = MAX(minwidth, minw); 87261ba55bcSBaptiste Daroussin minwidth += BORDERS; 87361ba55bcSBaptiste Daroussin if (w < minwidth) 87461ba55bcSBaptiste Daroussin RETURN_FMTERROR("Current cols: %d, nedeed at least %d", 87561ba55bcSBaptiste Daroussin w, minwidth); 87661ba55bcSBaptiste Daroussin 87761ba55bcSBaptiste Daroussin return (0); 87861ba55bcSBaptiste Daroussin } 87961ba55bcSBaptiste Daroussin 88061ba55bcSBaptiste Daroussin int 881f499134dSBaptiste Daroussin set_widget_position(struct bsddialog_conf *conf, int *y, int *x, int h, int w) 882c76f0793SBaptiste Daroussin { 883b319d934SAlfonso S. Siciliano int hshadow = conf->shadow ? (int)t.shadow.y : 0; 884b319d934SAlfonso S. Siciliano int wshadow = conf->shadow ? (int)t.shadow.x : 0; 885b319d934SAlfonso S. Siciliano 886b319d934SAlfonso S. Siciliano if (conf->y == BSDDIALOG_CENTER) { 887b319d934SAlfonso S. Siciliano *y = SCREENLINES/2 - (h + hshadow)/2; 888b319d934SAlfonso S. Siciliano if (*y < (int)conf->auto_topmargin) 889b319d934SAlfonso S. Siciliano *y = conf->auto_topmargin; 890b319d934SAlfonso S. Siciliano if (*y + h + hshadow > SCREENLINES - (int)conf->auto_downmargin) 891b319d934SAlfonso S. Siciliano *y = SCREENLINES - h - hshadow - conf->auto_downmargin; 892b319d934SAlfonso S. Siciliano } 893f499134dSBaptiste Daroussin else if (conf->y < BSDDIALOG_CENTER) 894c76f0793SBaptiste Daroussin RETURN_ERROR("Negative begin y (less than -1)"); 895263660c0SAlfonso Siciliano else if (conf->y >= SCREENLINES) 896c76f0793SBaptiste Daroussin RETURN_ERROR("Begin Y under the terminal"); 897c76f0793SBaptiste Daroussin else 898f499134dSBaptiste Daroussin *y = conf->y; 899c76f0793SBaptiste Daroussin 900b319d934SAlfonso S. Siciliano if (*y + h + hshadow > SCREENLINES) 901263660c0SAlfonso Siciliano RETURN_ERROR("The lower of the box under the terminal " 902c76f0793SBaptiste Daroussin "(begin Y + height (+ shadow) > terminal lines)"); 903c76f0793SBaptiste Daroussin 904c76f0793SBaptiste Daroussin 905f499134dSBaptiste Daroussin if (conf->x == BSDDIALOG_CENTER) 906b319d934SAlfonso S. Siciliano *x = SCREENCOLS/2 - (w + wshadow)/2; 907f499134dSBaptiste Daroussin else if (conf->x < BSDDIALOG_CENTER) 908c76f0793SBaptiste Daroussin RETURN_ERROR("Negative begin x (less than -1)"); 909263660c0SAlfonso Siciliano else if (conf->x >= SCREENCOLS) 910c76f0793SBaptiste Daroussin RETURN_ERROR("Begin X over the right of the terminal"); 911c76f0793SBaptiste Daroussin else 912f499134dSBaptiste Daroussin *x = conf->x; 913c76f0793SBaptiste Daroussin 914b319d934SAlfonso S. Siciliano if ((*x + w + wshadow) > SCREENCOLS) 915263660c0SAlfonso Siciliano RETURN_ERROR("The right of the box over the terminal " 916c76f0793SBaptiste Daroussin "(begin X + width (+ shadow) > terminal cols)"); 917c76f0793SBaptiste Daroussin 918263660c0SAlfonso Siciliano return (0); 919c76f0793SBaptiste Daroussin } 920c76f0793SBaptiste Daroussin 92161ba55bcSBaptiste Daroussin int dialog_size_position(struct dialog *d, int hnotext, int minw, int *htext) 922c76f0793SBaptiste Daroussin { 92361ba55bcSBaptiste Daroussin if (set_widget_size(d->conf, d->rows, d->cols, &d->h, &d->w) != 0) 92461ba55bcSBaptiste Daroussin return (BSDDIALOG_ERROR); 92561ba55bcSBaptiste Daroussin if (set_widget_autosize(d->conf, d->rows, d->cols, &d->h, &d->w, 92661ba55bcSBaptiste Daroussin d->text, htext, &d->bs, hnotext, minw) != 0) 92761ba55bcSBaptiste Daroussin return (BSDDIALOG_ERROR); 92861ba55bcSBaptiste Daroussin if (widget_checksize(d->h, d->w, &d->bs, hnotext, minw) != 0) 92961ba55bcSBaptiste Daroussin return (BSDDIALOG_ERROR); 93061ba55bcSBaptiste Daroussin if (set_widget_position(d->conf, &d->y, &d->x, d->h, d->w) != 0) 93161ba55bcSBaptiste Daroussin return (BSDDIALOG_ERROR); 93261ba55bcSBaptiste Daroussin 93361ba55bcSBaptiste Daroussin return (0); 93461ba55bcSBaptiste Daroussin } 93561ba55bcSBaptiste Daroussin 93661ba55bcSBaptiste Daroussin /* 93761ba55bcSBaptiste Daroussin * -5- Widget components and utilities 93861ba55bcSBaptiste Daroussin */ 93961ba55bcSBaptiste Daroussin int hide_dialog(struct dialog *d) 94061ba55bcSBaptiste Daroussin { 94161ba55bcSBaptiste Daroussin WINDOW *clear; 94261ba55bcSBaptiste Daroussin 94361ba55bcSBaptiste Daroussin if ((clear = newwin(d->h, d->w, d->y, d->x)) == NULL) 94461ba55bcSBaptiste Daroussin RETURN_ERROR("Cannot hide the widget"); 94561ba55bcSBaptiste Daroussin wbkgd(clear, t.screen.color); 94661ba55bcSBaptiste Daroussin wrefresh(clear); 94761ba55bcSBaptiste Daroussin 94861ba55bcSBaptiste Daroussin if (d->conf->shadow) { 94961ba55bcSBaptiste Daroussin mvwin(clear, d->y + t.shadow.y, d->x + t.shadow.x); 95061ba55bcSBaptiste Daroussin wrefresh(clear); 95161ba55bcSBaptiste Daroussin } 95261ba55bcSBaptiste Daroussin 95361ba55bcSBaptiste Daroussin delwin(clear); 95461ba55bcSBaptiste Daroussin 95561ba55bcSBaptiste Daroussin return (0); 95661ba55bcSBaptiste Daroussin } 95761ba55bcSBaptiste Daroussin 95861ba55bcSBaptiste Daroussin int f1help_dialog(struct bsddialog_conf *conf) 95961ba55bcSBaptiste Daroussin { 96061ba55bcSBaptiste Daroussin int output; 96161ba55bcSBaptiste Daroussin struct bsddialog_conf hconf; 96261ba55bcSBaptiste Daroussin 96361ba55bcSBaptiste Daroussin bsddialog_initconf(&hconf); 96461ba55bcSBaptiste Daroussin hconf.title = "HELP"; 96561ba55bcSBaptiste Daroussin hconf.button.ok_label = "EXIT"; 96661ba55bcSBaptiste Daroussin hconf.clear = true; 96761ba55bcSBaptiste Daroussin hconf.ascii_lines = conf->ascii_lines; 96861ba55bcSBaptiste Daroussin hconf.no_lines = conf->no_lines; 96961ba55bcSBaptiste Daroussin hconf.shadow = conf->shadow; 97061ba55bcSBaptiste Daroussin hconf.text.escape = conf->text.escape; 97161ba55bcSBaptiste Daroussin 97261ba55bcSBaptiste Daroussin output = BSDDIALOG_OK; 97361ba55bcSBaptiste Daroussin if (conf->key.f1_message != NULL) 97461ba55bcSBaptiste Daroussin output = bsddialog_msgbox(&hconf, conf->key.f1_message, 0, 0); 97561ba55bcSBaptiste Daroussin 97661ba55bcSBaptiste Daroussin if (output != BSDDIALOG_ERROR && conf->key.f1_file != NULL) 97761ba55bcSBaptiste Daroussin output = bsddialog_textbox(&hconf, conf->key.f1_file, 0, 0); 97861ba55bcSBaptiste Daroussin 97961ba55bcSBaptiste Daroussin return (output == BSDDIALOG_ERROR ? BSDDIALOG_ERROR : 0); 98061ba55bcSBaptiste Daroussin } 98161ba55bcSBaptiste Daroussin 98261ba55bcSBaptiste Daroussin void draw_borders(struct bsddialog_conf *conf, WINDOW *win, enum elevation elev) 98361ba55bcSBaptiste Daroussin { 98461ba55bcSBaptiste Daroussin int h, w; 985c76f0793SBaptiste Daroussin int leftcolor, rightcolor; 986*a6d8be45SAlfonso S. Siciliano cchar_t *ls, *rs, *ts, *bs, *tl, *tr, *bl, *br; 987*a6d8be45SAlfonso S. Siciliano cchar_t hline, vline, corner; 988c76f0793SBaptiste Daroussin 989263660c0SAlfonso Siciliano if (conf->no_lines) 990263660c0SAlfonso Siciliano return; 991263660c0SAlfonso Siciliano 992263660c0SAlfonso Siciliano if (conf->ascii_lines) { 993*a6d8be45SAlfonso S. Siciliano setcchar(&hline, L"|", 0, 0, NULL); 994*a6d8be45SAlfonso S. Siciliano ls = rs = &hline; 995*a6d8be45SAlfonso S. Siciliano setcchar(&vline, L"-", 0, 0, NULL); 996*a6d8be45SAlfonso S. Siciliano ts = bs = &vline; 997*a6d8be45SAlfonso S. Siciliano setcchar(&corner, L"+", 0, 0, NULL); 998*a6d8be45SAlfonso S. Siciliano tl = tr = bl = br = &corner; 999263660c0SAlfonso Siciliano } else { 1000*a6d8be45SAlfonso S. Siciliano ls = rs = WACS_VLINE; 1001*a6d8be45SAlfonso S. Siciliano ts = bs = WACS_HLINE; 1002*a6d8be45SAlfonso S. Siciliano tl = WACS_ULCORNER; 1003*a6d8be45SAlfonso S. Siciliano tr = WACS_URCORNER; 1004*a6d8be45SAlfonso S. Siciliano bl = WACS_LLCORNER; 1005*a6d8be45SAlfonso S. Siciliano br = WACS_LRCORNER; 1006c76f0793SBaptiste Daroussin } 1007263660c0SAlfonso Siciliano 100861ba55bcSBaptiste Daroussin getmaxyx(win, h, w); 1009*a6d8be45SAlfonso S. Siciliano leftcolor = (elev == RAISED) ? 10108c4f4028SBaptiste Daroussin t.dialog.lineraisecolor : t.dialog.linelowercolor; 1011*a6d8be45SAlfonso S. Siciliano rightcolor = (elev == RAISED) ? 10128c4f4028SBaptiste Daroussin t.dialog.linelowercolor : t.dialog.lineraisecolor; 101361ba55bcSBaptiste Daroussin 1014c76f0793SBaptiste Daroussin wattron(win, leftcolor); 1015*a6d8be45SAlfonso S. Siciliano wborder_set(win, ls, rs, ts, bs, tl, tr, bl, br); 1016c76f0793SBaptiste Daroussin wattroff(win, leftcolor); 1017c76f0793SBaptiste Daroussin 1018c76f0793SBaptiste Daroussin wattron(win, rightcolor); 1019*a6d8be45SAlfonso S. Siciliano mvwadd_wch(win, 0, w-1, tr); 1020*a6d8be45SAlfonso S. Siciliano mvwvline_set(win, 1, w-1, rs, h-2); 1021*a6d8be45SAlfonso S. Siciliano mvwadd_wch(win, h-1, w-1, br); 1022*a6d8be45SAlfonso S. Siciliano mvwhline_set(win, h-1, 1, bs, w-2); 1023c76f0793SBaptiste Daroussin wattroff(win, rightcolor); 1024c76f0793SBaptiste Daroussin } 1025c76f0793SBaptiste Daroussin 102661ba55bcSBaptiste Daroussin void 102761ba55bcSBaptiste Daroussin update_box(struct bsddialog_conf *conf, WINDOW *win, int y, int x, int h, int w, 1028c76f0793SBaptiste Daroussin enum elevation elev) 1029c76f0793SBaptiste Daroussin { 103061ba55bcSBaptiste Daroussin wclear(win); 103161ba55bcSBaptiste Daroussin wresize(win, h, w); 103261ba55bcSBaptiste Daroussin mvwin(win, y, x); 103361ba55bcSBaptiste Daroussin draw_borders(conf, win, elev); 1034c76f0793SBaptiste Daroussin } 1035c76f0793SBaptiste Daroussin 103661ba55bcSBaptiste Daroussin void 103761ba55bcSBaptiste Daroussin rtextpad(struct dialog *d, int ytext, int xtext, int upnotext, int downnotext) 103861ba55bcSBaptiste Daroussin { 103961ba55bcSBaptiste Daroussin pnoutrefresh(d->textpad, ytext, xtext, 104061ba55bcSBaptiste Daroussin d->y + BORDER + upnotext, 104161ba55bcSBaptiste Daroussin d->x + BORDER + TEXTHMARGIN, 104261ba55bcSBaptiste Daroussin d->y + d->h - 1 - downnotext - BORDER, 104361ba55bcSBaptiste Daroussin d->x + d->w - TEXTHMARGIN - BORDER); 104461ba55bcSBaptiste Daroussin } 1045c76f0793SBaptiste Daroussin 104661ba55bcSBaptiste Daroussin /* 104761ba55bcSBaptiste Daroussin * -6- Dialog init/build, update/draw, destroy 104861ba55bcSBaptiste Daroussin */ 104961ba55bcSBaptiste Daroussin void end_dialog(struct dialog *d) 105061ba55bcSBaptiste Daroussin { 105161ba55bcSBaptiste Daroussin if (d->conf->sleep > 0) 105261ba55bcSBaptiste Daroussin sleep(d->conf->sleep); 1053c76f0793SBaptiste Daroussin 105461ba55bcSBaptiste Daroussin delwin(d->textpad); 105561ba55bcSBaptiste Daroussin delwin(d->widget); 105661ba55bcSBaptiste Daroussin if (d->conf->shadow) 105761ba55bcSBaptiste Daroussin delwin(d->shadow); 105861ba55bcSBaptiste Daroussin 105961ba55bcSBaptiste Daroussin if (d->conf->clear) 106061ba55bcSBaptiste Daroussin hide_dialog(d); 106161ba55bcSBaptiste Daroussin 106261ba55bcSBaptiste Daroussin if (d->conf->get_height != NULL) 106361ba55bcSBaptiste Daroussin *d->conf->get_height = d->h; 106461ba55bcSBaptiste Daroussin if (d->conf->get_width != NULL) 106561ba55bcSBaptiste Daroussin *d->conf->get_width = d->w; 106661ba55bcSBaptiste Daroussin } 106761ba55bcSBaptiste Daroussin 106861ba55bcSBaptiste Daroussin static bool check_set_wtext_attr(WINDOW *win, wchar_t *wtext) 106961ba55bcSBaptiste Daroussin { 107061ba55bcSBaptiste Daroussin enum bsddialog_color bg; 107161ba55bcSBaptiste Daroussin 107261ba55bcSBaptiste Daroussin if (is_wtext_attr(wtext) == false) 107361ba55bcSBaptiste Daroussin return (false); 107461ba55bcSBaptiste Daroussin 107561ba55bcSBaptiste Daroussin if ((wtext[2] >= L'0') && (wtext[2] <= L'7')) { 107661ba55bcSBaptiste Daroussin bsddialog_color_attrs(t.dialog.color, NULL, &bg, NULL); 107761ba55bcSBaptiste Daroussin wattron(win, bsddialog_color(wtext[2] - L'0', bg, 0)); 107861ba55bcSBaptiste Daroussin return (true); 107961ba55bcSBaptiste Daroussin } 108061ba55bcSBaptiste Daroussin 108161ba55bcSBaptiste Daroussin switch (wtext[2]) { 108261ba55bcSBaptiste Daroussin case L'n': 108361ba55bcSBaptiste Daroussin wattron(win, t.dialog.color); 108461ba55bcSBaptiste Daroussin wattrset(win, A_NORMAL); 108561ba55bcSBaptiste Daroussin break; 108661ba55bcSBaptiste Daroussin case L'b': 108761ba55bcSBaptiste Daroussin wattron(win, A_BOLD); 108861ba55bcSBaptiste Daroussin break; 108961ba55bcSBaptiste Daroussin case L'B': 109061ba55bcSBaptiste Daroussin wattroff(win, A_BOLD); 109161ba55bcSBaptiste Daroussin break; 109261ba55bcSBaptiste Daroussin case L'd': 109361ba55bcSBaptiste Daroussin wattron(win, A_DIM); 109461ba55bcSBaptiste Daroussin break; 109561ba55bcSBaptiste Daroussin case L'D': 109661ba55bcSBaptiste Daroussin wattroff(win, A_DIM); 109761ba55bcSBaptiste Daroussin break; 109861ba55bcSBaptiste Daroussin case L'k': 109961ba55bcSBaptiste Daroussin wattron(win, A_BLINK); 110061ba55bcSBaptiste Daroussin break; 110161ba55bcSBaptiste Daroussin case L'K': 110261ba55bcSBaptiste Daroussin wattroff(win, A_BLINK); 110361ba55bcSBaptiste Daroussin break; 110461ba55bcSBaptiste Daroussin case L'r': 110561ba55bcSBaptiste Daroussin wattron(win, A_REVERSE); 110661ba55bcSBaptiste Daroussin break; 110761ba55bcSBaptiste Daroussin case L'R': 110861ba55bcSBaptiste Daroussin wattroff(win, A_REVERSE); 110961ba55bcSBaptiste Daroussin break; 111061ba55bcSBaptiste Daroussin case L's': 111161ba55bcSBaptiste Daroussin wattron(win, A_STANDOUT); 111261ba55bcSBaptiste Daroussin break; 111361ba55bcSBaptiste Daroussin case L'S': 111461ba55bcSBaptiste Daroussin wattroff(win, A_STANDOUT); 111561ba55bcSBaptiste Daroussin break; 111661ba55bcSBaptiste Daroussin case L'u': 111761ba55bcSBaptiste Daroussin wattron(win, A_UNDERLINE); 111861ba55bcSBaptiste Daroussin break; 111961ba55bcSBaptiste Daroussin case L'U': 112061ba55bcSBaptiste Daroussin wattroff(win, A_UNDERLINE); 112161ba55bcSBaptiste Daroussin break; 112261ba55bcSBaptiste Daroussin } 112361ba55bcSBaptiste Daroussin 112461ba55bcSBaptiste Daroussin return (true); 112561ba55bcSBaptiste Daroussin } 112661ba55bcSBaptiste Daroussin 112761ba55bcSBaptiste Daroussin static void 112861ba55bcSBaptiste Daroussin print_string(WINDOW *win, int *rows, int cols, int *y, int *x, wchar_t *str, 112961ba55bcSBaptiste Daroussin bool color) 113061ba55bcSBaptiste Daroussin { 1131*a6d8be45SAlfonso S. Siciliano int charwidth, i, j, strlen, strwidth; 113261ba55bcSBaptiste Daroussin wchar_t ws[2]; 113361ba55bcSBaptiste Daroussin 113461ba55bcSBaptiste Daroussin ws[1] = L'\0'; 113561ba55bcSBaptiste Daroussin 1136*a6d8be45SAlfonso S. Siciliano strlen = wcslen(str); 113761ba55bcSBaptiste Daroussin if (color) { 1138*a6d8be45SAlfonso S. Siciliano strwidth = 0; 113961ba55bcSBaptiste Daroussin i=0; 1140*a6d8be45SAlfonso S. Siciliano while (i < strlen) { 114161ba55bcSBaptiste Daroussin if (is_wtext_attr(str+i) == false) { 1142*a6d8be45SAlfonso S. Siciliano strwidth += wcwidth(str[i]); 114361ba55bcSBaptiste Daroussin i++; 114461ba55bcSBaptiste Daroussin } else { 114561ba55bcSBaptiste Daroussin i += 3; 114661ba55bcSBaptiste Daroussin } 114761ba55bcSBaptiste Daroussin } 114861ba55bcSBaptiste Daroussin } else 1149*a6d8be45SAlfonso S. Siciliano strwidth = wcswidth(str, strlen); 115061ba55bcSBaptiste Daroussin 115161ba55bcSBaptiste Daroussin i = 0; 1152*a6d8be45SAlfonso S. Siciliano while (i < strlen) { 1153*a6d8be45SAlfonso S. Siciliano if (*x + strwidth > cols) { 1154*a6d8be45SAlfonso S. Siciliano if (*x != 0) 1155*a6d8be45SAlfonso S. Siciliano *y = *y + 1; 115661ba55bcSBaptiste Daroussin if (*y >= *rows) { 115761ba55bcSBaptiste Daroussin *rows = *y + 1; 115861ba55bcSBaptiste Daroussin wresize(win, *rows, cols); 115961ba55bcSBaptiste Daroussin } 116061ba55bcSBaptiste Daroussin *x = 0; 116161ba55bcSBaptiste Daroussin } 116261ba55bcSBaptiste Daroussin j = *x; 1163*a6d8be45SAlfonso S. Siciliano while (i < strlen) { 116461ba55bcSBaptiste Daroussin if (color && check_set_wtext_attr(win, str+i)) { 116561ba55bcSBaptiste Daroussin i += 3; 1166*a6d8be45SAlfonso S. Siciliano continue; 1167*a6d8be45SAlfonso S. Siciliano } 1168*a6d8be45SAlfonso S. Siciliano 1169*a6d8be45SAlfonso S. Siciliano charwidth = wcwidth(str[i]); 1170*a6d8be45SAlfonso S. Siciliano if (j + wcwidth(str[i]) > cols) 117161ba55bcSBaptiste Daroussin break; 117261ba55bcSBaptiste Daroussin /* inline mvwaddwch() for efficiency */ 117361ba55bcSBaptiste Daroussin ws[0] = str[i]; 117461ba55bcSBaptiste Daroussin mvwaddwstr(win, *y, j, ws); 1175*a6d8be45SAlfonso S. Siciliano strwidth -= charwidth; 1176*a6d8be45SAlfonso S. Siciliano j += charwidth; 117761ba55bcSBaptiste Daroussin *x = j; 1178*a6d8be45SAlfonso S. Siciliano i++; 117961ba55bcSBaptiste Daroussin } 118061ba55bcSBaptiste Daroussin } 1181c76f0793SBaptiste Daroussin } 1182c76f0793SBaptiste Daroussin 1183c76f0793SBaptiste Daroussin static int 118461ba55bcSBaptiste Daroussin print_textpad(struct bsddialog_conf *conf, WINDOW *pad, const char *text) 1185c76f0793SBaptiste Daroussin { 118661ba55bcSBaptiste Daroussin bool loop; 118761ba55bcSBaptiste Daroussin int i, j, z, rows, cols, x, y, tablen; 118861ba55bcSBaptiste Daroussin wchar_t *wtext, *string; 1189c76f0793SBaptiste Daroussin 119061ba55bcSBaptiste Daroussin if ((wtext = alloc_mbstows(text)) == NULL) 119161ba55bcSBaptiste Daroussin RETURN_ERROR("Cannot allocate/print text in wchar_t*"); 1192263660c0SAlfonso Siciliano 119361ba55bcSBaptiste Daroussin if ((string = calloc(wcslen(wtext) + 1, sizeof(wchar_t))) == NULL) 119461ba55bcSBaptiste Daroussin RETURN_ERROR("Cannot build (analyze) text"); 1195c76f0793SBaptiste Daroussin 119661ba55bcSBaptiste Daroussin getmaxyx(pad, rows, cols); 119761ba55bcSBaptiste Daroussin tablen = (conf->text.tablen == 0) ? TABSIZE : (int)conf->text.tablen; 1198c76f0793SBaptiste Daroussin 119961ba55bcSBaptiste Daroussin i = j = x = y = 0; 120061ba55bcSBaptiste Daroussin loop = true; 120161ba55bcSBaptiste Daroussin while (loop) { 120261ba55bcSBaptiste Daroussin string[j] = wtext[i]; 1203c76f0793SBaptiste Daroussin 120461ba55bcSBaptiste Daroussin if (wcschr(L"\n\t ", string[j]) != NULL || string[j] == L'\0') { 120561ba55bcSBaptiste Daroussin string[j] = L'\0'; 120661ba55bcSBaptiste Daroussin print_string(pad, &rows, cols, &y, &x, string, 120761ba55bcSBaptiste Daroussin conf->text.escape); 120861ba55bcSBaptiste Daroussin } 120961ba55bcSBaptiste Daroussin 121061ba55bcSBaptiste Daroussin switch (wtext[i]) { 121161ba55bcSBaptiste Daroussin case L'\0': 121261ba55bcSBaptiste Daroussin loop = false; 121361ba55bcSBaptiste Daroussin break; 121461ba55bcSBaptiste Daroussin case L'\n': 121561ba55bcSBaptiste Daroussin x = 0; 121661ba55bcSBaptiste Daroussin y++; 121761ba55bcSBaptiste Daroussin j = -1; 121861ba55bcSBaptiste Daroussin break; 121961ba55bcSBaptiste Daroussin case L'\t': 122061ba55bcSBaptiste Daroussin for (z = 0; z < tablen; z++) { 122161ba55bcSBaptiste Daroussin if (x >= cols) { 122261ba55bcSBaptiste Daroussin x = 0; 122361ba55bcSBaptiste Daroussin y++; 122461ba55bcSBaptiste Daroussin } 122561ba55bcSBaptiste Daroussin x++; 122661ba55bcSBaptiste Daroussin } 122761ba55bcSBaptiste Daroussin j = -1; 122861ba55bcSBaptiste Daroussin break; 122961ba55bcSBaptiste Daroussin case L' ': 123061ba55bcSBaptiste Daroussin x++; 123161ba55bcSBaptiste Daroussin if (x >= cols) { 123261ba55bcSBaptiste Daroussin x = 0; 123361ba55bcSBaptiste Daroussin y++; 123461ba55bcSBaptiste Daroussin } 123561ba55bcSBaptiste Daroussin j = -1; 123661ba55bcSBaptiste Daroussin } 123761ba55bcSBaptiste Daroussin 123861ba55bcSBaptiste Daroussin if (y >= rows) { 123961ba55bcSBaptiste Daroussin rows = y + 1; 124061ba55bcSBaptiste Daroussin wresize(pad, rows, cols); 124161ba55bcSBaptiste Daroussin } 124261ba55bcSBaptiste Daroussin 124361ba55bcSBaptiste Daroussin j++; 124461ba55bcSBaptiste Daroussin i++; 124561ba55bcSBaptiste Daroussin } 124661ba55bcSBaptiste Daroussin 124761ba55bcSBaptiste Daroussin free(wtext); 124861ba55bcSBaptiste Daroussin free(string); 124961ba55bcSBaptiste Daroussin 125061ba55bcSBaptiste Daroussin return (0); 125161ba55bcSBaptiste Daroussin } 125261ba55bcSBaptiste Daroussin 125361ba55bcSBaptiste Daroussin int draw_dialog(struct dialog *d) 125461ba55bcSBaptiste Daroussin { 1255*a6d8be45SAlfonso S. Siciliano int wtitle, wbottomtitle; 1256*a6d8be45SAlfonso S. Siciliano cchar_t ts, ltee, rtee; 125761ba55bcSBaptiste Daroussin 1258*a6d8be45SAlfonso S. Siciliano if (d->conf->ascii_lines) { 1259*a6d8be45SAlfonso S. Siciliano setcchar(&ts, L"-", 0, 0, NULL); 1260*a6d8be45SAlfonso S. Siciliano setcchar(<ee, L"+", 0, 0,NULL); 1261*a6d8be45SAlfonso S. Siciliano setcchar(&rtee, L"+", 0, 0, NULL); 1262*a6d8be45SAlfonso S. Siciliano } else { 1263*a6d8be45SAlfonso S. Siciliano ts = *WACS_HLINE; 1264*a6d8be45SAlfonso S. Siciliano ltee = *WACS_LTEE; 1265*a6d8be45SAlfonso S. Siciliano rtee = *WACS_RTEE; 1266*a6d8be45SAlfonso S. Siciliano } 126761ba55bcSBaptiste Daroussin 126861ba55bcSBaptiste Daroussin if (d->conf->shadow) { 126961ba55bcSBaptiste Daroussin wclear(d->shadow); 127061ba55bcSBaptiste Daroussin wresize(d->shadow, d->h, d->w); 127161ba55bcSBaptiste Daroussin mvwin(d->shadow, d->y + t.shadow.y, d->x + t.shadow.x); 127261ba55bcSBaptiste Daroussin wnoutrefresh(d->shadow); 127361ba55bcSBaptiste Daroussin } 127461ba55bcSBaptiste Daroussin 127561ba55bcSBaptiste Daroussin wclear(d->widget); 127661ba55bcSBaptiste Daroussin wresize(d->widget, d->h, d->w); 127761ba55bcSBaptiste Daroussin mvwin(d->widget, d->y, d->x); 127861ba55bcSBaptiste Daroussin draw_borders(d->conf, d->widget, RAISED); 127961ba55bcSBaptiste Daroussin 128061ba55bcSBaptiste Daroussin if (d->conf->title != NULL) { 128161ba55bcSBaptiste Daroussin if ((wtitle = strcols(d->conf->title)) < 0) 1282b319d934SAlfonso S. Siciliano return (BSDDIALOG_ERROR); 128361ba55bcSBaptiste Daroussin if (t.dialog.delimtitle && d->conf->no_lines == false) { 128461ba55bcSBaptiste Daroussin wattron(d->widget, t.dialog.lineraisecolor); 1285*a6d8be45SAlfonso S. Siciliano mvwadd_wch(d->widget, 0, d->w/2 - wtitle/2 -1, &rtee); 128661ba55bcSBaptiste Daroussin wattroff(d->widget, t.dialog.lineraisecolor); 1287c76f0793SBaptiste Daroussin } 128861ba55bcSBaptiste Daroussin wattron(d->widget, t.dialog.titlecolor); 128961ba55bcSBaptiste Daroussin mvwaddstr(d->widget, 0, d->w/2 - wtitle/2, d->conf->title); 129061ba55bcSBaptiste Daroussin wattroff(d->widget, t.dialog.titlecolor); 129161ba55bcSBaptiste Daroussin if (t.dialog.delimtitle && d->conf->no_lines == false) { 129261ba55bcSBaptiste Daroussin wattron(d->widget, t.dialog.lineraisecolor); 1293*a6d8be45SAlfonso S. Siciliano wadd_wch(d->widget, <ee); 129461ba55bcSBaptiste Daroussin wattroff(d->widget, t.dialog.lineraisecolor); 1295c76f0793SBaptiste Daroussin } 1296c76f0793SBaptiste Daroussin } 1297c76f0793SBaptiste Daroussin 129861ba55bcSBaptiste Daroussin if (d->bs.nbuttons > 0) { 129961ba55bcSBaptiste Daroussin if (d->conf->no_lines == false) { 130061ba55bcSBaptiste Daroussin wattron(d->widget, t.dialog.lineraisecolor); 1301*a6d8be45SAlfonso S. Siciliano mvwadd_wch(d->widget, d->h-3, 0, <ee); 1302*a6d8be45SAlfonso S. Siciliano mvwhline_set(d->widget, d->h-3, 1, &ts, d->w-2); 130361ba55bcSBaptiste Daroussin wattroff(d->widget, t.dialog.lineraisecolor); 1304c76f0793SBaptiste Daroussin 130561ba55bcSBaptiste Daroussin wattron(d->widget, t.dialog.linelowercolor); 1306*a6d8be45SAlfonso S. Siciliano mvwadd_wch(d->widget, d->h-3, d->w-1, &rtee); 130761ba55bcSBaptiste Daroussin wattroff(d->widget, t.dialog.linelowercolor); 1308c76f0793SBaptiste Daroussin } 130961ba55bcSBaptiste Daroussin draw_buttons(d); 1310263660c0SAlfonso Siciliano } 1311263660c0SAlfonso Siciliano 131261ba55bcSBaptiste Daroussin if (d->conf->bottomtitle != NULL) { 131361ba55bcSBaptiste Daroussin if ((wbottomtitle = strcols(d->conf->bottomtitle)) < 0) 1314b319d934SAlfonso S. Siciliano return (BSDDIALOG_ERROR); 131561ba55bcSBaptiste Daroussin wattron(d->widget, t.dialog.bottomtitlecolor); 131661ba55bcSBaptiste Daroussin wmove(d->widget, d->h - 1, d->w/2 - wbottomtitle/2 - 1); 131761ba55bcSBaptiste Daroussin waddch(d->widget, ' '); 131861ba55bcSBaptiste Daroussin waddstr(d->widget, d->conf->bottomtitle); 131961ba55bcSBaptiste Daroussin waddch(d->widget, ' '); 132061ba55bcSBaptiste Daroussin wattroff(d->widget, t.dialog.bottomtitlecolor); 1321263660c0SAlfonso Siciliano } 1322c76f0793SBaptiste Daroussin 132361ba55bcSBaptiste Daroussin wnoutrefresh(d->widget); 1324c76f0793SBaptiste Daroussin 132561ba55bcSBaptiste Daroussin wclear(d->textpad); 132661ba55bcSBaptiste Daroussin /* `infobox "" 0 2` fails but text is empty and textpad remains 1 1 */ 132761ba55bcSBaptiste Daroussin wresize(d->textpad, 1, d->w - BORDERS - TEXTHMARGINS); 132861ba55bcSBaptiste Daroussin 132961ba55bcSBaptiste Daroussin if (print_textpad(d->conf, d->textpad, d->text) != 0) 1330263660c0SAlfonso Siciliano return (BSDDIALOG_ERROR); 1331c76f0793SBaptiste Daroussin 133261ba55bcSBaptiste Daroussin d->built = true; 133361ba55bcSBaptiste Daroussin 1334263660c0SAlfonso Siciliano return (0); 1335c76f0793SBaptiste Daroussin } 1336c76f0793SBaptiste Daroussin 1337c76f0793SBaptiste Daroussin int 133861ba55bcSBaptiste Daroussin prepare_dialog(struct bsddialog_conf *conf, const char *text, int rows, 133961ba55bcSBaptiste Daroussin int cols, struct dialog *d) 1340c76f0793SBaptiste Daroussin { 134161ba55bcSBaptiste Daroussin CHECK_PTR(conf); 1342c76f0793SBaptiste Daroussin 134361ba55bcSBaptiste Daroussin d->built = false; 134461ba55bcSBaptiste Daroussin d->conf = conf; 134561ba55bcSBaptiste Daroussin d->rows = rows; 134661ba55bcSBaptiste Daroussin d->cols = cols; 134761ba55bcSBaptiste Daroussin d->text = CHECK_STR(text); 134861ba55bcSBaptiste Daroussin d->bs.nbuttons = 0; 134961ba55bcSBaptiste Daroussin 135061ba55bcSBaptiste Daroussin if (d->conf->shadow) { 135161ba55bcSBaptiste Daroussin if ((d->shadow = newwin(1, 1, 1, 1)) == NULL) 135261ba55bcSBaptiste Daroussin RETURN_ERROR("Cannot build WINDOW shadow"); 135361ba55bcSBaptiste Daroussin wbkgd(d->shadow, t.shadow.color); 1354c76f0793SBaptiste Daroussin } 1355c76f0793SBaptiste Daroussin 135661ba55bcSBaptiste Daroussin if ((d->widget = newwin(1, 1, 1, 1)) == NULL) 135761ba55bcSBaptiste Daroussin RETURN_ERROR("Cannot build WINDOW widget"); 135861ba55bcSBaptiste Daroussin wbkgd(d->widget, t.dialog.color); 1359263660c0SAlfonso Siciliano 136061ba55bcSBaptiste Daroussin /* fake for textpad */ 136161ba55bcSBaptiste Daroussin if ((d->textpad = newpad(1, 1)) == NULL) 136261ba55bcSBaptiste Daroussin RETURN_ERROR("Cannot build the pad WINDOW for text"); 136361ba55bcSBaptiste Daroussin wbkgd(d->textpad, t.dialog.color); 1364263660c0SAlfonso Siciliano 136561ba55bcSBaptiste Daroussin return (0); 1366c76f0793SBaptiste Daroussin }