1c76f0793SBaptiste Daroussin /*- 2c76f0793SBaptiste Daroussin * SPDX-License-Identifier: BSD-2-Clause 3c76f0793SBaptiste Daroussin * 4*61ba55bcSBaptiste 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 <string.h> 30c76f0793SBaptiste Daroussin 31c76f0793SBaptiste Daroussin #include "bsddialog.h" 32c76f0793SBaptiste Daroussin #include "bsddialog_theme.h" 33263660c0SAlfonso Siciliano #include "lib_util.h" 34c76f0793SBaptiste Daroussin 35*61ba55bcSBaptiste Daroussin #define DEFAULT_COLS_PER_ROW 10 /* Default conf.text.columns_per_row */ 36*61ba55bcSBaptiste Daroussin 37*61ba55bcSBaptiste Daroussin static bool in_bsddialog_mode = false; 38b319d934SAlfonso S. Siciliano 39b319d934SAlfonso S. Siciliano int bsddialog_init_notheme(void) 40c76f0793SBaptiste Daroussin { 41d93b4d32SBaptiste Daroussin int i, j, c, error; 42c76f0793SBaptiste Daroussin 43c76f0793SBaptiste Daroussin set_error_string(""); 44c76f0793SBaptiste Daroussin 45c76f0793SBaptiste Daroussin if (initscr() == NULL) 468ea2d22eSAlfonso Siciliano RETURN_ERROR("Cannot init curses (initscr)"); 47c76f0793SBaptiste Daroussin 48d93b4d32SBaptiste Daroussin error = OK; 49c76f0793SBaptiste Daroussin error += keypad(stdscr, TRUE); 50c76f0793SBaptiste Daroussin nl(); 51c76f0793SBaptiste Daroussin error += cbreak(); 52c76f0793SBaptiste Daroussin error += noecho(); 53c76f0793SBaptiste Daroussin curs_set(0); 54c76f0793SBaptiste Daroussin if (error != OK) { 55c76f0793SBaptiste Daroussin bsddialog_end(); 568ea2d22eSAlfonso Siciliano RETURN_ERROR("Cannot init curses (keypad and cursor)"); 57c76f0793SBaptiste Daroussin } 58*61ba55bcSBaptiste Daroussin in_bsddialog_mode = true; 59c76f0793SBaptiste Daroussin 60d93b4d32SBaptiste Daroussin c = 1; 61c76f0793SBaptiste Daroussin error += start_color(); 62bce40c02SAlfonso S. Siciliano for (i = 0; i < 8; i++) { 63c76f0793SBaptiste Daroussin for (j = 0; j < 8; j++) { 64c76f0793SBaptiste Daroussin error += init_pair(c, i, j); 65c76f0793SBaptiste Daroussin c++; 66c76f0793SBaptiste Daroussin } 67bce40c02SAlfonso S. Siciliano } 68c76f0793SBaptiste Daroussin 69b319d934SAlfonso S. Siciliano hastermcolors = (error == OK && has_colors()) ? true : false; 70b319d934SAlfonso S. Siciliano 71b319d934SAlfonso S. Siciliano return (BSDDIALOG_OK); 72b319d934SAlfonso S. Siciliano } 73b319d934SAlfonso S. Siciliano 74b319d934SAlfonso S. Siciliano int bsddialog_init(void) 75b319d934SAlfonso S. Siciliano { 76b319d934SAlfonso S. Siciliano enum bsddialog_default_theme theme; 77b319d934SAlfonso S. Siciliano 78b319d934SAlfonso S. Siciliano bsddialog_init_notheme(); 79b319d934SAlfonso S. Siciliano 80b319d934SAlfonso S. Siciliano if (bsddialog_hascolors()) 81bce40c02SAlfonso S. Siciliano theme = BSDDIALOG_THEME_FLAT; 828ea2d22eSAlfonso Siciliano else 838ea2d22eSAlfonso Siciliano theme = BSDDIALOG_THEME_BLACKWHITE; 848ea2d22eSAlfonso Siciliano 858ea2d22eSAlfonso Siciliano if (bsddialog_set_default_theme(theme) != 0) { 868c4f4028SBaptiste Daroussin bsddialog_end(); 87*61ba55bcSBaptiste Daroussin in_bsddialog_mode = false; 888c4f4028SBaptiste Daroussin return (BSDDIALOG_ERROR); 898c4f4028SBaptiste Daroussin } 90c76f0793SBaptiste Daroussin 91d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 92c76f0793SBaptiste Daroussin } 93c76f0793SBaptiste Daroussin 94c76f0793SBaptiste Daroussin int bsddialog_end(void) 95c76f0793SBaptiste Daroussin { 96c76f0793SBaptiste Daroussin if (endwin() != OK) 97263660c0SAlfonso Siciliano RETURN_ERROR("Cannot end curses (endwin)"); 98*61ba55bcSBaptiste Daroussin in_bsddialog_mode = false; 99c76f0793SBaptiste Daroussin 100d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 101c76f0793SBaptiste Daroussin } 102c76f0793SBaptiste Daroussin 103263660c0SAlfonso Siciliano int bsddialog_backtitle(struct bsddialog_conf *conf, const char *backtitle) 104c76f0793SBaptiste Daroussin { 105*61ba55bcSBaptiste Daroussin CHECK_PTR(conf); 106*61ba55bcSBaptiste Daroussin 10784823cc7SAlfonso S. Siciliano move(0, 1); 10884823cc7SAlfonso S. Siciliano clrtoeol(); 109*61ba55bcSBaptiste Daroussin addstr(CHECK_STR(backtitle)); 110f499134dSBaptiste Daroussin if (conf->no_lines != true) 111263660c0SAlfonso Siciliano mvhline(1, 1, conf->ascii_lines ? '-' : ACS_HLINE, 112263660c0SAlfonso Siciliano SCREENCOLS - 2); 113c76f0793SBaptiste Daroussin 114c76f0793SBaptiste Daroussin refresh(); 115c76f0793SBaptiste Daroussin 116d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 117c76f0793SBaptiste Daroussin } 118c76f0793SBaptiste Daroussin 119*61ba55bcSBaptiste Daroussin bool bsddialog_inmode(void) 120*61ba55bcSBaptiste Daroussin { 121*61ba55bcSBaptiste Daroussin return (in_bsddialog_mode); 122*61ba55bcSBaptiste Daroussin } 123*61ba55bcSBaptiste Daroussin 124c76f0793SBaptiste Daroussin const char *bsddialog_geterror(void) 125c76f0793SBaptiste Daroussin { 1268c4f4028SBaptiste Daroussin return (get_error_string()); 127c76f0793SBaptiste Daroussin } 128c76f0793SBaptiste Daroussin 1298c4f4028SBaptiste Daroussin int bsddialog_initconf(struct bsddialog_conf *conf) 130c76f0793SBaptiste Daroussin { 131*61ba55bcSBaptiste Daroussin CHECK_PTR(conf); 132c76f0793SBaptiste Daroussin 133c76f0793SBaptiste Daroussin memset(conf, 0, sizeof(struct bsddialog_conf)); 1348c4f4028SBaptiste Daroussin conf->y = BSDDIALOG_CENTER; 1358c4f4028SBaptiste Daroussin conf->x = BSDDIALOG_CENTER; 136c76f0793SBaptiste Daroussin conf->shadow = true; 137*61ba55bcSBaptiste Daroussin conf->text.cols_per_row = DEFAULT_COLS_PER_ROW; 1388c4f4028SBaptiste Daroussin 139d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 1408c4f4028SBaptiste Daroussin } 1418c4f4028SBaptiste Daroussin 142*61ba55bcSBaptiste Daroussin void bsddialog_refresh(void) 1438c4f4028SBaptiste Daroussin { 1448c4f4028SBaptiste Daroussin refresh(); 145*61ba55bcSBaptiste Daroussin } 1468c4f4028SBaptiste Daroussin 147*61ba55bcSBaptiste Daroussin void bsddialog_clear(unsigned int y) 148*61ba55bcSBaptiste Daroussin { 149*61ba55bcSBaptiste Daroussin move(y, 0); 150*61ba55bcSBaptiste Daroussin clrtobot(); 151*61ba55bcSBaptiste Daroussin refresh(); 152c76f0793SBaptiste Daroussin }