xref: /freebsd/contrib/bsddialog/lib/libbsddialog.c (revision 84823cc70824c8d842f503d8c2e6d7b0c2d95b61)
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 }