xref: /freebsd/contrib/bsddialog/lib/libbsddialog.c (revision c76f07938c44264c7ebd400c23f218e561960d23)
1*c76f0793SBaptiste Daroussin /*-
2*c76f0793SBaptiste Daroussin  * SPDX-License-Identifier: BSD-2-Clause
3*c76f0793SBaptiste Daroussin  *
4*c76f0793SBaptiste Daroussin  * Copyright (c) 2021 Alfonso Sabato Siciliano
5*c76f0793SBaptiste Daroussin  *
6*c76f0793SBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
7*c76f0793SBaptiste Daroussin  * modification, are permitted provided that the following conditions
8*c76f0793SBaptiste Daroussin  * are met:
9*c76f0793SBaptiste Daroussin  * 1. Redistributions of source code must retain the above copyright
10*c76f0793SBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer.
11*c76f0793SBaptiste Daroussin  * 2. Redistributions in binary form must reproduce the above copyright
12*c76f0793SBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer in the
13*c76f0793SBaptiste Daroussin  *    documentation and/or other materials provided with the distribution.
14*c76f0793SBaptiste Daroussin  *
15*c76f0793SBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*c76f0793SBaptiste Daroussin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*c76f0793SBaptiste Daroussin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*c76f0793SBaptiste Daroussin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*c76f0793SBaptiste Daroussin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*c76f0793SBaptiste Daroussin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*c76f0793SBaptiste Daroussin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*c76f0793SBaptiste Daroussin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*c76f0793SBaptiste Daroussin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*c76f0793SBaptiste Daroussin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*c76f0793SBaptiste Daroussin  * SUCH DAMAGE.
26*c76f0793SBaptiste Daroussin  */
27*c76f0793SBaptiste Daroussin 
28*c76f0793SBaptiste Daroussin #include <stdlib.h>
29*c76f0793SBaptiste Daroussin #include <string.h>
30*c76f0793SBaptiste Daroussin #include <unistd.h>
31*c76f0793SBaptiste Daroussin 
32*c76f0793SBaptiste Daroussin #ifdef PORTNCURSES
33*c76f0793SBaptiste Daroussin #include <ncurses/curses.h>
34*c76f0793SBaptiste Daroussin #else
35*c76f0793SBaptiste Daroussin #include <curses.h>
36*c76f0793SBaptiste Daroussin #endif
37*c76f0793SBaptiste Daroussin 
38*c76f0793SBaptiste Daroussin #include "bsddialog.h"
39*c76f0793SBaptiste Daroussin #include "lib_util.h"
40*c76f0793SBaptiste Daroussin #include "bsddialog_theme.h"
41*c76f0793SBaptiste Daroussin 
42*c76f0793SBaptiste Daroussin /*
43*c76f0793SBaptiste Daroussin  * This file implements some public function not related to a specific widget.
44*c76f0793SBaptiste Daroussin  * utils.h/c provides private functions to implement the library.
45*c76f0793SBaptiste Daroussin  * theme.h/c is public API related to theme.
46*c76f0793SBaptiste Daroussin  * Widgets implementation:
47*c76f0793SBaptiste Daroussin  *  infobox.c    infobox
48*c76f0793SBaptiste Daroussin  *  messgebox.c  msgbox - yesno
49*c76f0793SBaptiste Daroussin  *  menubox.c    buildlist - checklist - menu - mixedlist - radiolist - treeview
50*c76f0793SBaptiste Daroussin  *  formbox.c    inputbox - passwordbox - form - passwordform - mixedform
51*c76f0793SBaptiste Daroussin  *  editorbox.c  editbox
52*c76f0793SBaptiste Daroussin  *  barbox.c     gauge - mixedgauge - rangebox - pause
53*c76f0793SBaptiste Daroussin  *  timebox.c    timebox - calendar
54*c76f0793SBaptiste Daroussin  *  commandbox.c prgbox - programbox - progressbox
55*c76f0793SBaptiste Daroussin  *  tailbox.c    tailbox - tailboxbg - textbox
56*c76f0793SBaptiste Daroussin  *  filebox.c    dselect - fselect
57*c76f0793SBaptiste Daroussin  */
58*c76f0793SBaptiste Daroussin 
59*c76f0793SBaptiste Daroussin extern struct bsddialog_theme t;
60*c76f0793SBaptiste Daroussin 
61*c76f0793SBaptiste Daroussin int bsddialog_init(void)
62*c76f0793SBaptiste Daroussin {
63*c76f0793SBaptiste Daroussin 	int i, j, c = 1, error = OK;
64*c76f0793SBaptiste Daroussin 
65*c76f0793SBaptiste Daroussin 	set_error_string("");
66*c76f0793SBaptiste Daroussin 
67*c76f0793SBaptiste Daroussin 	if(initscr() == NULL)
68*c76f0793SBaptiste Daroussin 		RETURN_ERROR("Cannot init ncurses (initscr)");
69*c76f0793SBaptiste Daroussin 
70*c76f0793SBaptiste Daroussin 	error += keypad(stdscr, TRUE);
71*c76f0793SBaptiste Daroussin 	nl();
72*c76f0793SBaptiste Daroussin 	error += cbreak();
73*c76f0793SBaptiste Daroussin 	error += noecho();
74*c76f0793SBaptiste Daroussin 	curs_set(0);
75*c76f0793SBaptiste Daroussin 	if(error != OK) {
76*c76f0793SBaptiste Daroussin 		bsddialog_end();
77*c76f0793SBaptiste Daroussin 		RETURN_ERROR("Cannot init ncurses (keypad and cursor)");
78*c76f0793SBaptiste Daroussin 	}
79*c76f0793SBaptiste Daroussin 
80*c76f0793SBaptiste Daroussin 	error += start_color();
81*c76f0793SBaptiste Daroussin 	for (i=0; i<8; i++)
82*c76f0793SBaptiste Daroussin 		for(j=0; j<8; j++) {
83*c76f0793SBaptiste Daroussin 			error += init_pair(c, i, j);
84*c76f0793SBaptiste Daroussin 			c++;
85*c76f0793SBaptiste Daroussin 	}
86*c76f0793SBaptiste Daroussin 	if(error != OK) {
87*c76f0793SBaptiste Daroussin 		bsddialog_end();
88*c76f0793SBaptiste Daroussin 		RETURN_ERROR("Cannot init ncurses (colors)");
89*c76f0793SBaptiste Daroussin 	}
90*c76f0793SBaptiste Daroussin 
91*c76f0793SBaptiste Daroussin 	if (bsddialog_set_default_theme(BSDDIALOG_THEME_DIALOG) != 0)
92*c76f0793SBaptiste Daroussin 		error = BSDDIALOG_ERROR;
93*c76f0793SBaptiste Daroussin 
94*c76f0793SBaptiste Daroussin 	return error;
95*c76f0793SBaptiste Daroussin }
96*c76f0793SBaptiste Daroussin 
97*c76f0793SBaptiste Daroussin int bsddialog_end(void)
98*c76f0793SBaptiste Daroussin {
99*c76f0793SBaptiste Daroussin 
100*c76f0793SBaptiste Daroussin 	if (endwin() != OK)
101*c76f0793SBaptiste Daroussin 		RETURN_ERROR("Cannot end ncurses (endwin)");
102*c76f0793SBaptiste Daroussin 
103*c76f0793SBaptiste Daroussin 	return 0;
104*c76f0793SBaptiste Daroussin }
105*c76f0793SBaptiste Daroussin 
106*c76f0793SBaptiste Daroussin int bsddialog_backtitle(struct bsddialog_conf conf, char *backtitle)
107*c76f0793SBaptiste Daroussin {
108*c76f0793SBaptiste Daroussin 
109*c76f0793SBaptiste Daroussin 	mvaddstr(0, 1, backtitle);
110*c76f0793SBaptiste Daroussin 	if (conf.no_lines != true)
111*c76f0793SBaptiste Daroussin 		mvhline(1, 1, conf.ascii_lines ? '-' : ACS_HLINE, COLS-2);
112*c76f0793SBaptiste Daroussin 
113*c76f0793SBaptiste Daroussin 	refresh();
114*c76f0793SBaptiste Daroussin 
115*c76f0793SBaptiste Daroussin 	return 0;
116*c76f0793SBaptiste Daroussin }
117*c76f0793SBaptiste Daroussin 
118*c76f0793SBaptiste Daroussin const char *bsddialog_geterror(void)
119*c76f0793SBaptiste Daroussin {
120*c76f0793SBaptiste Daroussin 
121*c76f0793SBaptiste Daroussin 	return get_error_string();
122*c76f0793SBaptiste Daroussin }
123*c76f0793SBaptiste Daroussin 
124*c76f0793SBaptiste Daroussin int bsddialog_terminalheight(void)
125*c76f0793SBaptiste Daroussin {
126*c76f0793SBaptiste Daroussin 
127*c76f0793SBaptiste Daroussin 	return LINES;
128*c76f0793SBaptiste Daroussin }
129*c76f0793SBaptiste Daroussin 
130*c76f0793SBaptiste Daroussin int bsddialog_terminalwidth(void)
131*c76f0793SBaptiste Daroussin {
132*c76f0793SBaptiste Daroussin 
133*c76f0793SBaptiste Daroussin 	return COLS;
134*c76f0793SBaptiste Daroussin }
135*c76f0793SBaptiste Daroussin 
136*c76f0793SBaptiste Daroussin void bsddialog_initconf(struct bsddialog_conf *conf)
137*c76f0793SBaptiste Daroussin {
138*c76f0793SBaptiste Daroussin 
139*c76f0793SBaptiste Daroussin 	memset(conf, 0, sizeof(struct bsddialog_conf));
140*c76f0793SBaptiste Daroussin 	conf->x = conf->y = BSDDIALOG_CENTER;
141*c76f0793SBaptiste Daroussin 	conf->shadow = true;
142*c76f0793SBaptiste Daroussin }
143