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 <string.h> 30c76f0793SBaptiste Daroussin 31c76f0793SBaptiste Daroussin #include "bsddialog.h" 32c76f0793SBaptiste Daroussin #include "bsddialog_theme.h" 33263660c0SAlfonso Siciliano #include "lib_util.h" 34c76f0793SBaptiste Daroussin 3561ba55bcSBaptiste Daroussin #define DEFAULT_COLS_PER_ROW 10 /* Default conf.text.columns_per_row */ 3661ba55bcSBaptiste Daroussin 3761ba55bcSBaptiste 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 } 5861ba55bcSBaptiste 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(); 8761ba55bcSBaptiste 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)"); 9861ba55bcSBaptiste 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 { 10561ba55bcSBaptiste Daroussin CHECK_PTR(conf); 10661ba55bcSBaptiste Daroussin 10784823cc7SAlfonso S. Siciliano move(0, 1); 10884823cc7SAlfonso S. Siciliano clrtoeol(); 10961ba55bcSBaptiste Daroussin addstr(CHECK_STR(backtitle)); 110*a6d8be45SAlfonso S. Siciliano if (conf->no_lines != true) { 111*a6d8be45SAlfonso S. Siciliano if (conf->ascii_lines) 112*a6d8be45SAlfonso S. Siciliano mvhline(1, 1, '-', SCREENCOLS - 2); 113*a6d8be45SAlfonso S. Siciliano else 114*a6d8be45SAlfonso S. Siciliano mvhline_set(1, 1, WACS_HLINE, SCREENCOLS - 2); 115*a6d8be45SAlfonso S. Siciliano } 116c76f0793SBaptiste Daroussin 117c76f0793SBaptiste Daroussin refresh(); 118c76f0793SBaptiste Daroussin 119d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 120c76f0793SBaptiste Daroussin } 121c76f0793SBaptiste Daroussin 12261ba55bcSBaptiste Daroussin bool bsddialog_inmode(void) 12361ba55bcSBaptiste Daroussin { 12461ba55bcSBaptiste Daroussin return (in_bsddialog_mode); 12561ba55bcSBaptiste Daroussin } 12661ba55bcSBaptiste Daroussin 127c76f0793SBaptiste Daroussin const char *bsddialog_geterror(void) 128c76f0793SBaptiste Daroussin { 1298c4f4028SBaptiste Daroussin return (get_error_string()); 130c76f0793SBaptiste Daroussin } 131c76f0793SBaptiste Daroussin 1328c4f4028SBaptiste Daroussin int bsddialog_initconf(struct bsddialog_conf *conf) 133c76f0793SBaptiste Daroussin { 13461ba55bcSBaptiste Daroussin CHECK_PTR(conf); 135c76f0793SBaptiste Daroussin 136c76f0793SBaptiste Daroussin memset(conf, 0, sizeof(struct bsddialog_conf)); 1378c4f4028SBaptiste Daroussin conf->y = BSDDIALOG_CENTER; 1388c4f4028SBaptiste Daroussin conf->x = BSDDIALOG_CENTER; 139c76f0793SBaptiste Daroussin conf->shadow = true; 14061ba55bcSBaptiste Daroussin conf->text.cols_per_row = DEFAULT_COLS_PER_ROW; 1418c4f4028SBaptiste Daroussin 142d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 1438c4f4028SBaptiste Daroussin } 1448c4f4028SBaptiste Daroussin 14561ba55bcSBaptiste Daroussin void bsddialog_refresh(void) 1468c4f4028SBaptiste Daroussin { 1478c4f4028SBaptiste Daroussin refresh(); 14861ba55bcSBaptiste Daroussin } 1498c4f4028SBaptiste Daroussin 15061ba55bcSBaptiste Daroussin void bsddialog_clear(unsigned int y) 15161ba55bcSBaptiste Daroussin { 15261ba55bcSBaptiste Daroussin move(y, 0); 15361ba55bcSBaptiste Daroussin clrtobot(); 15461ba55bcSBaptiste Daroussin refresh(); 155c76f0793SBaptiste Daroussin }