1c76f0793SBaptiste Daroussin /*- 2c76f0793SBaptiste Daroussin * SPDX-License-Identifier: BSD-2-Clause 3c76f0793SBaptiste Daroussin * 4263660c0SAlfonso Siciliano * Copyright (c) 2021-2022 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> 32c76f0793SBaptiste Daroussin 33c76f0793SBaptiste Daroussin #include "bsddialog.h" 34c76f0793SBaptiste Daroussin #include "bsddialog_theme.h" 35263660c0SAlfonso Siciliano #include "lib_util.h" 36c76f0793SBaptiste Daroussin 37b319d934SAlfonso S. Siciliano #define COLSPERROW 10 /* Default conf.text.columns_per_row */ 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 } 58c76f0793SBaptiste Daroussin 59d93b4d32SBaptiste Daroussin c = 1; 60c76f0793SBaptiste Daroussin error += start_color(); 61bce40c02SAlfonso S. Siciliano for (i = 0; i < 8; i++) { 62c76f0793SBaptiste Daroussin for (j = 0; j < 8; j++) { 63c76f0793SBaptiste Daroussin error += init_pair(c, i, j); 64c76f0793SBaptiste Daroussin c++; 65c76f0793SBaptiste Daroussin } 66bce40c02SAlfonso S. Siciliano } 67c76f0793SBaptiste Daroussin 68b319d934SAlfonso S. Siciliano hastermcolors = (error == OK && has_colors()) ? true : false; 69b319d934SAlfonso S. Siciliano 70b319d934SAlfonso S. Siciliano return (BSDDIALOG_OK); 71b319d934SAlfonso S. Siciliano } 72b319d934SAlfonso S. Siciliano 73b319d934SAlfonso S. Siciliano int bsddialog_init(void) 74b319d934SAlfonso S. Siciliano { 75b319d934SAlfonso S. Siciliano enum bsddialog_default_theme theme; 76b319d934SAlfonso S. Siciliano 77b319d934SAlfonso S. Siciliano bsddialog_init_notheme(); 78b319d934SAlfonso S. Siciliano 79b319d934SAlfonso S. Siciliano if (bsddialog_hascolors()) 80bce40c02SAlfonso S. Siciliano theme = BSDDIALOG_THEME_FLAT; 818ea2d22eSAlfonso Siciliano else 828ea2d22eSAlfonso Siciliano theme = BSDDIALOG_THEME_BLACKWHITE; 838ea2d22eSAlfonso Siciliano 848ea2d22eSAlfonso Siciliano if (bsddialog_set_default_theme(theme) != 0) { 858c4f4028SBaptiste Daroussin bsddialog_end(); 868c4f4028SBaptiste Daroussin return (BSDDIALOG_ERROR); 878c4f4028SBaptiste Daroussin } 88c76f0793SBaptiste Daroussin 89d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 90c76f0793SBaptiste Daroussin } 91c76f0793SBaptiste Daroussin 92c76f0793SBaptiste Daroussin int bsddialog_end(void) 93c76f0793SBaptiste Daroussin { 94c76f0793SBaptiste Daroussin if (endwin() != OK) 95263660c0SAlfonso Siciliano RETURN_ERROR("Cannot end curses (endwin)"); 96c76f0793SBaptiste Daroussin 97d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 98c76f0793SBaptiste Daroussin } 99c76f0793SBaptiste Daroussin 100263660c0SAlfonso Siciliano int bsddialog_backtitle(struct bsddialog_conf *conf, const char *backtitle) 101c76f0793SBaptiste Daroussin { 102*84823cc7SAlfonso S. Siciliano move(0, 1); 103*84823cc7SAlfonso S. Siciliano clrtoeol(); 104*84823cc7SAlfonso S. Siciliano addstr(backtitle); 105f499134dSBaptiste Daroussin if (conf->no_lines != true) 106263660c0SAlfonso Siciliano mvhline(1, 1, conf->ascii_lines ? '-' : ACS_HLINE, 107263660c0SAlfonso Siciliano SCREENCOLS - 2); 108c76f0793SBaptiste Daroussin 109c76f0793SBaptiste Daroussin refresh(); 110c76f0793SBaptiste Daroussin 111d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 112c76f0793SBaptiste Daroussin } 113c76f0793SBaptiste Daroussin 114c76f0793SBaptiste Daroussin const char *bsddialog_geterror(void) 115c76f0793SBaptiste Daroussin { 1168c4f4028SBaptiste Daroussin return (get_error_string()); 117c76f0793SBaptiste Daroussin } 118c76f0793SBaptiste Daroussin 1198c4f4028SBaptiste Daroussin int bsddialog_initconf(struct bsddialog_conf *conf) 120c76f0793SBaptiste Daroussin { 1218c4f4028SBaptiste Daroussin if (conf == NULL) 1228c4f4028SBaptiste Daroussin RETURN_ERROR("conf is NULL"); 1238c4f4028SBaptiste Daroussin if (sizeof(*conf) != sizeof(struct bsddialog_conf)) 1248c4f4028SBaptiste Daroussin RETURN_ERROR("Bad conf size"); 125c76f0793SBaptiste Daroussin 126c76f0793SBaptiste Daroussin memset(conf, 0, sizeof(struct bsddialog_conf)); 1278c4f4028SBaptiste Daroussin conf->y = BSDDIALOG_CENTER; 1288c4f4028SBaptiste Daroussin conf->x = BSDDIALOG_CENTER; 129c76f0793SBaptiste Daroussin conf->shadow = true; 130b319d934SAlfonso S. Siciliano conf->text.cols_per_row = COLSPERROW; 1318c4f4028SBaptiste Daroussin 132d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 1338c4f4028SBaptiste Daroussin } 1348c4f4028SBaptiste Daroussin 1358c4f4028SBaptiste Daroussin int bsddialog_clearterminal(void) 1368c4f4028SBaptiste Daroussin { 1378c4f4028SBaptiste Daroussin if (clear() != OK) 1388c4f4028SBaptiste Daroussin RETURN_ERROR("Cannot clear the terminal"); 1398c4f4028SBaptiste Daroussin refresh(); 1408c4f4028SBaptiste Daroussin 141d93b4d32SBaptiste Daroussin return (BSDDIALOG_OK); 142c76f0793SBaptiste Daroussin }