bsddialog: Import version0.2

This version provides improvements and fixes mainly to use bsddialog
utility in bsdinstall/scripts. The lib API is not broken so the
previous converted utilities (tzsetup, distextract, etc.) are OK.

Approved by:		bapt (mentor)
Differential Revision:	https://reviews.freebsd.org/D34458
This commit is contained in:
Alfonso S. Siciliano 2022-03-13 02:34:57 +01:00
parent 02db4a1234
commit 2f8d441841
No known key found for this signature in database
GPG Key ID: 3F9EEFACFD371E37
54 changed files with 957 additions and 432 deletions

1
.gitignore vendored
View File

@ -6,6 +6,7 @@ examples_library/buildlist
examples_library/checklist
examples_library/datebox
examples_library/form
examples_library/formw
examples_library/menu
examples_library/mixedlist
examples_library/radiolist

61
CHANGELOG Normal file
View File

@ -0,0 +1,61 @@
2022-03-02 version 0.2
Utility:
* add: (this) CHANGELOG.
* add: "menus" print item with focus (except with OK and ERROR).
* add: pause.sh example.
* add: timebox.sh example.
* change: --theme name "default" -> "flat".
* delete: treeview.sh example.
* fix: --separate-output does not quote (except with --quoted).
* fix: --datebox and --date-format month in output.
* improve: examples handle exit status.
Library:
* add: conf.form.enable_wchar for wide characters in bsddialog_form().
* add: theme.menu.f_selectorcolor.
* add: formw.c example.
* change: move conf.f1_file and conf.f1_message in conf.key.
* change: theme.button.[left|right]ch -> theme.button.[left|right]delim.
* change: theme.button.space -> theme.button.hmargin.
* change: theme.menu.arrowcolor -> theme.dialog.arrowcolor.
* change: default menu item depth 4 -> 2.
* fix: disable HOME, PPAGE, END and NPAGE keys in bsddialog_form().
* fix: visible cursor for timebox.c and form.c in VM VirtualBox.
* fix: mixedlist, center position of separator with big pad.
* fix: timebox and datebox set values only with BSDDIALOG_OK.
* fix: menurows autosize with fullscreen.
* fix: bar color with 0%.
* fix: bar label position.
* improve: timebox and datebox navigation (keys, buttons and shortcuts).
* improve: "menus" colors for accessibility.
2022-01-27 version 0.1
* Common-Options: --ascii-lines, --backtitle <backtitle>, --begin-x <x>,
--begin-y <y>, --cancel-label <label>, --clear, --colors, --cr-wrap,
--date-format <format>, --defaultno, --default-button <label>,
--default-no, --default-item <name>, --disable-esc,
--esc-cancelvalue, --exit-label <label>, --extra-button,
--extra-label <label>, --generic-button1 <label>,
--generic-button2 <label>, --help, --help-button,
--help-label <label>, --help-status, --help-tags,
--hfile <filename>, --hline <string>, --hmsg <string>, --ignore,
--insecure, --item-depth, --item-help, --items-prefix,
--max-input <size>, --no-cancel, --nocancel, --no-collapse,
--no-items, --no-label <label>, --no-lines, --no-nl-expand,
--no-ok, --nook, --no-shadow, --no-tags, --ok-label <label>,
--output-fd <fd>, --output-separator <sep>, --print-maxsize,
--print-size, --print-version, --quoted, --separate-output,
--separator <sep>, --shadow, --single-quoted, --sleep <secs>,
--stderr, --stdout, --tab-len <spaces>,
--theme <blackwhite|bsddialog|default|dialog>,
--time-format <format>, --title <title>, --trim, --version,
--yes-label <label>.
* Dialogs: --checklist, --datebox, --form, --gauge, --infobox,
--inputbox, --menu, --mixedform, --mixedgauge, --msgbox,
--passwordbox, --passwordform, --pause, --radiolist, --rangebox,
--textbox, --timebox, --treeview, --yesno.
* Manuals: bsddialog.1, bsddialog.3.

View File

@ -8,7 +8,7 @@ SOURCES= bsddialog.c
OBJECTS= $(SOURCES:.c=.o)
LIBPATH= ./lib
LIBBSDDIALOG= $(LIBPATH)/libbsddialog.so
CFLAGS= -Wall -I$(LIBPATH)
CFLAGS= -Wall -Wextra -Wno-unused-parameter -I$(LIBPATH)
LDFLAGS= -Wl,-rpath=$(LIBPATH) -L$(LIBPATH) -lbsddialog
RM = rm -f

View File

@ -9,13 +9,7 @@ OBJECTS= ${SOURCES:.c=.o}
LIBPATH= ${.CURDIR}/lib
LIBBSDDIALOG= ${LIBPATH}/libbsddialog.so
CFLAGS+= -I${LIBPATH} -std=gnu99 -Wno-format-zero-length \
-fstack-protector-strong -Wsystem-headers -Werror -Wall -Wno-format-y2k -W \
-Wno-unused-parameter -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith \
-Wno-uninitialized -Wno-pointer-sign -Wno-empty-body -Wno-string-plus-int \
-Wno-unused-const-variable -Wno-tautological-compare -Wno-unused-value \
-Wno-parentheses-equality -Wno-unused-function -Wno-enum-conversion \
-Wno-unused-local-typedef -Wno-address-of-packed-member -Qunused-arguments
CFLAGS+= -I${LIBPATH} -std=gnu99 -Wall -Wextra -Werror -Wno-unused-parameter
# `make -DDEBUG`
.if defined(DEBUG)
CFLAGS= -g -Wall -I${LIBPATH}

View File

@ -1,4 +1,4 @@
# BSDDialog 0.1
# BSDDialog 0.2
This project provides **bsddialog** and **libbsddialog**, an utility and a
@ -75,8 +75,9 @@ in the _Public Domain_ to build new projects:
% sh ./examples_utility/msgbox.sh
% sh ./examples_utility/passwordbox.sh
% sh ./examples_utility/passwordform.sh
% sh ./examples_utility/pause.sh
% sh ./examples_utility/radiolist.sh
% sh ./examples_utility/treeview.sh
% sh ./examples_utility/timebox.sh
% sh ./examples_utility/yesno.sh
```

View File

@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd January 26, 2022
.Dd February 3, 2022
.Dt BSDDIALOG 1
.Os
.Sh NAME
@ -34,12 +34,12 @@
.Nm
.Fl Fl version
.Nm
.Op Fl Fl common-opts
.Op Fl Fl common-option
.Fl Fl dialog
.Ar text
.Ar rows
.Ar cols
.Op Ar dialog-opts
.Op Ar dialog-parameter
.Sh DESCRIPTION
The
.Nm bsddialog
@ -263,7 +263,7 @@ Print version.
.It Fl Fl quoted
Quote items in output, default only when necessary.
.It Fl Fl separate-output
Separate selected items with a new line.
Separate selected items with a new line and avoid to quote.
.It Fl Fl separator Ar sep
Equivalent to
.Fl Fl output-separator .
@ -283,7 +283,7 @@ Print input from user interface to standard output.
Number of spaces to print a TAB in
.Ar text .
.It Fl Fl theme Ar theme
Set a graphical style: blackwhite, bsddialog, default or dialog.
Set a graphical style: blackwhite, bsddialog, flat or dialog.
.It Fl Fl time-format Ar format
String accepted by
.Xr strftime 3
@ -586,5 +586,5 @@ utility first appeared in
was written by
.An Alfonso Sabato Siciliano Aq Mt alf.siciliano@gmail.com .
.Sh BUGS
The forms do not resize the dialog after a terminal change and does not provides
Forms do not resize the dialog after a terminal change and do not provide
scrolling for items.

View File

@ -39,7 +39,7 @@
#include <bsddialog.h>
#include <bsddialog_theme.h>
#define BSDDIALOG_VERSION "0.1"
#define BSDDIALOG_VERSION "0.2"
enum OPTS {
/* Common options */
@ -125,22 +125,22 @@ enum OPTS {
YESNO
};
/* Menus flags and options */
/* Menus options */
static bool item_prefix_opt, item_bottomdesc_opt, item_output_sepnl_opt;
static bool item_singlequote_opt, list_items_on_opt, item_tag_help_opt;
static bool item_always_quote_opt, item_depth_opt;
static char *item_output_sep_opt, *item_default_opt;
/* Time and calendar options */
/* Date and Time options */
static char *date_fmt_opt, *time_fmt_opt;
/* Forms */
/* Forms options */
static int unsigned max_input_form_opt;
/* General flags and options */
/* General options */
static int output_fd_opt;
static void
custom_text(bool cr_wrap, bool no_collapse, bool no_nl_expand, bool trim,
char *text, char *buf);
static void sigint_handler(int sig);
/* Dialogs */
@ -192,7 +192,7 @@ static void usage(void)
"--print-size, --print-version, --quoted, --separate-output, "
"--separator <sep>, --shadow, --single-quoted, --sleep <secs>, "
"--stderr, --stdout, --tab-len <spaces>, "
"--theme <blackwhite|bsddialog|default|dialog>, "
"--theme <blackwhite|bsddialog|flat|dialog>, "
"--time-format <format>, --title <title>, --trim, --version, "
"--yes-label <label>.\n");
printf("\n");
@ -239,7 +239,8 @@ int main(int argc, char *argv[argc])
int input, rows, cols, output, getH, getW;
int (*dialogbuilder)(BUILDER_ARGS) = NULL;
enum bsddialog_default_theme theme_opt;
char *text, *backtitle_opt, errorbuilder[1024];
char *text, *backtitle_opt;
char errorbuilder[1024];
struct winsize ws;
struct bsddialog_conf conf;
@ -249,15 +250,16 @@ int main(int argc, char *argv[argc])
conf.key.enable_esc = true;
conf.menu.on_without_ok = true;
conf.form.value_without_ok = true;
conf.form.enable_wchar = true;
backtitle_opt = NULL;
theme_opt = BSDDIALOG_THEME_DEFAULT;
theme_opt = BSDDIALOG_THEME_FLAT;
output_fd_opt = STDERR_FILENO;
print_maxsize_opt = false;
ignore_opt = false;
errorbuilder[0] = '\0';
cr_wrap_opt = no_collapse_opt = no_nl_expand_opt = trim_opt = false;
esc_cancelvalue_opt = false;
errorbuilder[0] = '\0';
item_output_sepnl_opt = item_singlequote_opt = false;
item_prefix_opt = item_bottomdesc_opt = item_depth_opt = false;
@ -375,7 +377,7 @@ int main(int argc, char *argv[argc])
case BEGIN_X:
conf.x = (int)strtol(optarg, NULL, 10);
if (conf.x < BSDDIALOG_CENTER) {
printf("Error: --begin-x %d < %d",
printf("Error: --begin-x %d < %d",
conf.x, BSDDIALOG_CENTER);
return (255);
}
@ -449,13 +451,13 @@ int main(int argc, char *argv[argc])
item_tag_help_opt = true;
break;
case HFILE:
conf.f1_file = optarg;
conf.key.f1_file = optarg;
break;
case HLINE:
conf.bottomtitle = optarg;
break;
case HMSG:
conf.f1_message = optarg;
conf.key.f1_message = optarg;
break;
case IGNORE:
ignore_opt = true;
@ -515,7 +517,7 @@ int main(int argc, char *argv[argc])
print_maxsize_opt = true;
break;
case PRINT_SIZE:
conf.get_height = &getH;;
conf.get_height = &getH;
conf.get_width = &getW;
break;
case PRINT_VERSION:
@ -547,8 +549,8 @@ int main(int argc, char *argv[argc])
theme_opt = BSDDIALOG_THEME_BSDDIALOG;
else if (strcasecmp(optarg, "blackwhite") == 0)
theme_opt = BSDDIALOG_THEME_BLACKWHITE;
else if (strcasecmp(optarg, "default") == 0)
theme_opt = BSDDIALOG_THEME_DEFAULT;
else if (strcasecmp(optarg, "flat") == 0)
theme_opt = BSDDIALOG_THEME_FLAT;
else if (strcasecmp(optarg, "dialog") == 0)
theme_opt = BSDDIALOG_THEME_DIALOG;
else {
@ -673,12 +675,13 @@ int main(int argc, char *argv[argc])
signal(SIGINT, sigint_handler);
if (theme_opt != BSDDIALOG_THEME_DEFAULT)
if (theme_opt != BSDDIALOG_THEME_FLAT)
bsddialog_set_default_theme(theme_opt);
if (backtitle_opt != NULL)
bsddialog_backtitle(&conf, backtitle_opt);
errorbuilder[0] = '\0';
output = BSDDIALOG_OK;
if (dialogbuilder != NULL)
output = dialogbuilder(conf, text, rows, cols, argc, argv,
@ -859,8 +862,8 @@ int rangebox_builder(BUILDER_ARGS)
int output, min, max, value;
if (argc < 2) {
strcpy(errbuf, "usage --rangebox <text> <rows> <cols> <min> "
"<max> [<init>]\n");
strcpy(errbuf, "usage --rangebox <text> <rows> <cols> "
"<min> <max> [<init>]\n");
return (BSDDIALOG_ERROR);
}
@ -931,7 +934,7 @@ int datebox_builder(BUILDER_ARGS)
time(&cal);
localtm = localtime(&cal);
localtm->tm_year = yy - 1900;
localtm->tm_mon = mm;
localtm->tm_mon = mm - 1;
localtm->tm_mday = dd;
strftime(stringdate, 1024, date_fmt_opt, localtm);
dprintf(output_fd_opt, "%s", stringdate);
@ -970,7 +973,7 @@ int timebox_builder(BUILDER_ARGS)
time(&clock);
localtm = localtime(&clock);
localtm->tm_hour = hh;
localtm->tm_min = mm;
localtm->tm_min = mm;
localtm->tm_sec = ss;
strftime(stringtime, 1024, time_fmt_opt, localtm);
dprintf(output_fd_opt, "%s", stringtime);
@ -1031,31 +1034,36 @@ get_menu_items(char *errbuf, int argc, char **argv, bool setprefix,
}
static void
print_menu_items(struct bsddialog_conf *conf, int output, int nitems,
struct bsddialog_menuitem *items, int focusitem)
print_menu_items(int output, int nitems, struct bsddialog_menuitem *items,
int focusitem)
{
bool sep, toquote;
int i;
char *sepstr, quotech;
const char *helpvalue;
const char *focusname;
sep = false;
quotech = item_singlequote_opt ? '\'' : '"';
sepstr = item_output_sep_opt != NULL ? item_output_sep_opt : " ";
if (output == BSDDIALOG_HELP && focusitem >= 0) {
dprintf(output_fd_opt, "HELP ");
if (output != BSDDIALOG_OK && output != BSDDIALOG_ERROR &&
focusitem >= 0) {
focusname = items[focusitem].name;
helpvalue = items[focusitem].name;
if (item_bottomdesc_opt && item_tag_help_opt == false)
helpvalue = items[focusitem].bottomdesc;
if (output == BSDDIALOG_HELP) {
dprintf(output_fd_opt, "HELP ");
if (item_bottomdesc_opt && item_tag_help_opt == false)
focusname = items[focusitem].bottomdesc;
}
toquote = item_always_quote_opt ||
strchr(helpvalue, ' ') != NULL;
(item_output_sepnl_opt == false &&
strchr(focusname, ' ') != NULL);
if (toquote)
dprintf(output_fd_opt, "%c", quotech);
dprintf(output_fd_opt, "%s", helpvalue);
dprintf(output_fd_opt, "%s", focusname);
if (toquote)
dprintf(output_fd_opt, "%c", quotech);
@ -1078,7 +1086,8 @@ print_menu_items(struct bsddialog_conf *conf, int output, int nitems,
sep = true;
toquote = item_always_quote_opt ||
strchr(items[i].name, ' ') != NULL;
(item_output_sepnl_opt == false &&
strchr(items[i].name, ' ') != NULL);
if (toquote)
dprintf(output_fd_opt, "%c", quotech);
@ -1110,7 +1119,7 @@ int checklist_builder(BUILDER_ARGS)
output = bsddialog_checklist(&conf, text, rows, cols, menurows, nitems,
items, &focusitem);
print_menu_items(&conf, output, nitems, items, focusitem);
print_menu_items(output, nitems, items, focusitem);
free(items);
@ -1139,7 +1148,7 @@ int menu_builder(BUILDER_ARGS)
output = bsddialog_menu(&conf, text, rows, cols, menurows, nitems,
items, &focusitem);
print_menu_items(&conf, output, nitems, items, focusitem);
print_menu_items(output, nitems, items, focusitem);
free(items);
@ -1168,7 +1177,7 @@ int radiolist_builder(BUILDER_ARGS)
output = bsddialog_radiolist(&conf, text, rows, cols, menurows, nitems,
items, &focusitem);
print_menu_items(&conf, output, nitems, items, focusitem);
print_menu_items(output, nitems, items, focusitem);
free(items);
@ -1188,8 +1197,9 @@ int treeview_builder(BUILDER_ARGS)
menurows = (u_int)strtoul(argv[0], NULL, 10);
output = get_menu_items(errbuf, argc-1, argv+1, item_prefix_opt, true,
true, true, true, item_bottomdesc_opt, &nitems, &items, &focusitem);
output = get_menu_items(errbuf, argc-1, argv+1, item_prefix_opt,
true, true, true, true, item_bottomdesc_opt, &nitems, &items,
&focusitem);
if (output != 0)
return (output);
@ -1199,7 +1209,7 @@ int treeview_builder(BUILDER_ARGS)
output = bsddialog_radiolist(&conf, text, rows, cols, menurows, nitems,
items, &focusitem);
print_menu_items(&conf, output, nitems, items, focusitem);
print_menu_items(output, nitems, items, focusitem);
free(items);
@ -1220,8 +1230,7 @@ alloc_formitems(int nitems, struct bsddialog_formitem **items, char *errbuf)
}
static void
print_form_items(struct bsddialog_conf *conf, int output, int nitems,
struct bsddialog_formitem *items)
print_form_items(int output, int nitems, struct bsddialog_formitem *items)
{
int i;
@ -1229,7 +1238,7 @@ print_form_items(struct bsddialog_conf *conf, int output, int nitems,
return;
for (i = 0; i < nitems; i++) {
dprintf(output_fd_opt, "%s\n", items[i].value);
dprintf(output_fd_opt, "%ls\n", (wchar_t*)items[i].value);
free(items[i].value);
}
}
@ -1241,7 +1250,7 @@ int form_builder(BUILDER_ARGS)
struct bsddialog_formitem *items;
sizeitem = item_bottomdesc_opt ? 9 : 8;
if (argc < 1 || (((argc-1) % sizeitem) != 0)) {
if (argc < 1 || (argc - 1) % sizeitem != 0) {
strcpy(errbuf, "bad number of arguments for this form\n");
return (BSDDIALOG_ERROR);
}
@ -1278,7 +1287,7 @@ int form_builder(BUILDER_ARGS)
output = bsddialog_form(&conf, text, rows, cols, formheight, nitems,
items);
print_form_items(&conf, output, nitems, items);
print_form_items(output, nitems, items);
free(items);
return (output);
@ -1301,7 +1310,7 @@ int inputbox_builder(BUILDER_ARGS)
item.bottomdesc = "";
output = bsddialog_form(&conf, text, rows, cols, 1, 1, &item);
print_form_items(&conf, output, 1, &item);
print_form_items(output, 1, &item);
return (output);
}
@ -1313,7 +1322,7 @@ int mixedform_builder(BUILDER_ARGS)
struct bsddialog_formitem *items;
sizeitem = item_bottomdesc_opt ? 10 : 9;
if (argc < 1 || (((argc-1) % sizeitem) != 0)) {
if (argc < 1 || (argc-1) % sizeitem != 0) {
strcpy(errbuf, "bad number of arguments for this form\n");
return (BSDDIALOG_ERROR);
}
@ -1342,7 +1351,7 @@ int mixedform_builder(BUILDER_ARGS)
output = bsddialog_form(&conf, text, rows, cols, formheight, nitems,
items);
print_form_items(&conf, output, nitems, items);
print_form_items(output, nitems, items);
free(items);
return (output);
@ -1365,7 +1374,7 @@ int passwordbox_builder(BUILDER_ARGS)
item.bottomdesc = "";
output = bsddialog_form(&conf, text, rows, cols, 1, 1, &item);
print_form_items(&conf, output, 1, &item);
print_form_items(output, 1, &item);
return (output);
}
@ -1377,7 +1386,7 @@ int passwordform_builder(BUILDER_ARGS)
struct bsddialog_formitem *items;
sizeitem = item_bottomdesc_opt ? 9 : 8;
if (argc < 1 || (((argc-1) % sizeitem) != 0) ) {
if (argc < 1 || (argc - 1) % sizeitem != 0) {
strcpy(errbuf, "bad number of arguments for this form\n");
return (BSDDIALOG_ERROR);
}
@ -1414,7 +1423,7 @@ int passwordform_builder(BUILDER_ARGS)
output = bsddialog_form(&conf, text, rows, cols, formheight, nitems,
items);
print_form_items(&conf, output, nitems, items);
print_form_items(output, nitems, items);
free(items);
return (output);

View File

@ -8,11 +8,10 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
int main()
{
int i, output;

View File

@ -10,7 +10,7 @@
libpath=../lib
examples="menu checklist radiolist mixedlist theme infobox yesno msgbox \
datebox form timebox rangebox pause"
datebox form formw timebox rangebox pause"
for e in $examples
do

View File

@ -8,12 +8,11 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <bsddialog.h>
int main()
{
int output;
@ -35,8 +34,9 @@ int main()
bsddialog_initconf(&conf);
conf.title = "datebox";
conf.bottomtitle = "Press TAB and arrows";
output = bsddialog_datebox(&conf, "Example", 10, 50, &yy, &mm, &dd);
output = bsddialog_datebox(&conf,
"TAB / RIGHT / LEFT to move,\nUP / DOWN to select time", 10, 35,
&yy, &mm, &dd);
bsddialog_end();

View File

@ -8,13 +8,11 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <bsddialog.h>
#define H BSDDIALOG_FIELDHIDDEN
#define RO BSDDIALOG_FIELDREADONLY

61
examples_library/formw.c Normal file
View File

@ -0,0 +1,61 @@
/*-
* SPDX-License-Identifier: CC0-1.0
*
* Written in 2022 by Alfonso Sabato Siciliano.
* To the extent possible under law, the author has dedicated all copyright
* and related and neighboring rights to this software to the public domain
* worldwide. This software is distributed without any warranty, see:
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define H BSDDIALOG_FIELDHIDDEN
#define RO BSDDIALOG_FIELDREADONLY
int main()
{
int i, output;
struct bsddialog_conf conf;
struct bsddialog_formitem items[3] = {
{"Input:", 1, 1, "value", 1, 11, 30, 50, NULL, 0, "desc 1"},
{"Input:", 2, 1, "read only", 2, 11, 30, 50, NULL, RO, "desc 2"},
{"Password:", 3, 1, "", 3, 11, 30, 50, NULL, H, "desc 3"}
};
setlocale(LC_ALL, "");
if (bsddialog_init() == BSDDIALOG_ERROR) {
printf("Error: %s\n", bsddialog_geterror());
return (1);
}
bsddialog_initconf(&conf);
conf.title = "form";
conf.form.securech = '*';
conf.form.enable_wchar = true;
output = bsddialog_form(&conf, "Example", 10, 50, 3, 3, items);
bsddialog_end();
if (output == BSDDIALOG_ERROR) {
printf("Error: %s", bsddialog_geterror());
return (1);
}
if (output == BSDDIALOG_CANCEL) {
printf("Cancel\n");
return (0);
}
for (i = 0; i < 3; i++) {
printf("%s \"%ls\"\n", items[i].label, (wchar_t*)items[i].value);
free(items[i].value);
}
return (output);
}

View File

@ -8,11 +8,10 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
int main()
{
int output;

View File

@ -8,11 +8,10 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
int main()
{
int i, output;

View File

@ -8,17 +8,19 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
int main()
{
int output;
unsigned int i, j;
struct bsddialog_conf conf;
struct bsddialog_menuitem item;
struct bsddialog_menuitem sep1[1] = {
{ "", true, 0, "Checklist", "(desc)", "" }
};
struct bsddialog_menuitem check[5] = {
{ "+", true, 0, "Name 1", "Desc 1", "Bottom Desc 1" },
{ "" , false, 0, "Name 2", "Desc 2", "Bottom Desc 2" },
@ -26,8 +28,9 @@ int main()
{ "" , false, 0, "Name 4", "Desc 4", "Bottom Desc 4" },
{ "+", true, 0, "Name 5", "Desc 5", "Bottom Desc 5" }
};
struct bsddialog_menuitem sep[1] = {
{ "", true, 0, "Radiolist", "(desc)", "" }
struct bsddialog_menuitem sep2[2] = {
{ "", true, 0, "Radiolist", "(desc)", "" },
{ "", true, 0, "Subtitle", "(desc)", "" }
};
struct bsddialog_menuitem radio[5] = {
{ "", true, 0, "Name 1", "Desc 1", "Bottom Desc 1" },
@ -36,9 +39,10 @@ int main()
{ "+", false, 0, "Name 4", "Desc 4", "Bottom Desc 4" },
{ "", false, 0, "Name 5", "Desc 5", "Bottom Desc 5" }
};
struct bsddialog_menugroup group[3] = {
struct bsddialog_menugroup group[4] = {
{ BSDDIALOG_SEPARATOR, 1, sep1 },
{ BSDDIALOG_CHECKLIST, 5, check },
{ BSDDIALOG_SEPARATOR, 1, sep },
{ BSDDIALOG_SEPARATOR, 2, sep2 },
{ BSDDIALOG_RADIOLIST, 5, radio }
};
@ -49,7 +53,7 @@ int main()
bsddialog_initconf(&conf);
conf.title = "mixedlist";
output = bsddialog_mixedlist(&conf, "Example", 20, 30, 11, 3, group,
output = bsddialog_mixedlist(&conf, "Example", 20, 0, 13, 4, group,
NULL, NULL);
bsddialog_end();
@ -65,7 +69,7 @@ int main()
}
printf("Mixedlist:\n");
for (i = 0; i < 3; i++) {
for (i = 0; i < 4; i++) {
for (j = 0; j < group[i].nitems; j++) {
item = group[i].items[j];
if (group[i].type == BSDDIALOG_SEPARATOR)

View File

@ -8,11 +8,10 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
int main()
{
int output;

View File

@ -8,11 +8,10 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
int main()
{
int output;

View File

@ -8,11 +8,10 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
int main()
{
int i, output;

View File

@ -8,11 +8,10 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
int main()
{
int value, output;

View File

@ -8,11 +8,10 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
#include <bsddialog_theme.h>
#include <stdio.h>
#include <string.h>
int main()
{
@ -20,8 +19,8 @@ int main()
struct bsddialog_conf conf;
enum bsddialog_default_theme theme;
struct bsddialog_menuitem items[5] = {
{"", false, 0, "Default", "dialog-like",
"BSDDIALOG_THEME_DEFAULT" },
{"", false, 0, "Flat", "dialog-like",
"BSDDIALOG_THEME_FLAT" },
{"", false, 0, "Dialog", "dialog clone",
"BSDDIALOG_THEME_DIALOG" },
{"", false, 0, "BSDDialog", "new theme",
@ -43,14 +42,14 @@ int main()
conf.title = " Theme ";
focusitem = -1;
while (true) {
output = bsddialog_menu(&conf, "Choose theme", 15, 40, 5, 5,
output = bsddialog_menu(&conf, "Choose theme", 15, 45, 5, 5,
items, &focusitem);
if (output != BSDDIALOG_OK || items[4].on)
break;
if (items[0].on) {
theme = BSDDIALOG_THEME_DEFAULT;
theme = BSDDIALOG_THEME_FLAT;
focusitem = 0;
}
else if (items[1].on) {

View File

@ -8,12 +8,11 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <bsddialog.h>
int main()
{
int output;
@ -35,8 +34,9 @@ int main()
bsddialog_initconf(&conf);
conf.title = "timebox";
conf.bottomtitle = "Press TAB and arrows";
output = bsddialog_timebox(&conf, "Example", 10, 50, &hh, &mm, &ss);
output = bsddialog_timebox(&conf,
"TAB / RIGHT / LEFT to move,\nUP / DOWN to select time", 10, 35,
&hh, &mm, &ss);
bsddialog_end();

View File

@ -8,11 +8,10 @@
* <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <bsddialog.h>
#include <stdio.h>
#include <string.h>
#include <bsddialog.h>
int main()
{
int output;

View File

@ -3,15 +3,36 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
./bsddialog --title " checklist " --checklist "Hello World!" 15 30 5 \
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_ESC=5}
ITEMS=$(./bsddialog --title " checklist " --checklist "Hello World!" 15 30 5 \
"Tag 1" "DESC 1 xyz" on \
"Tag 2" "DESC 2 xyz" off \
"Tag 3" "DESC 3 xyz" on \
"Tag 4" "DESC 4 xyz" off \
"Tag 5" "DESC 5 xyz" on \
2>out.txt ; cat out.txt ; rm out.txt
3>&1 1>&2 2>&3 3>&-)
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC] focus: $ITEMS"
;;
$BSDDIALOG_CANCEL )
echo "[Cancel] focus: $ITEMS"
;;
$BSDDIALOG_OK )
echo "[OK] Selected: $ITEMS"
;;
esac

View File

@ -3,17 +3,38 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
./bsddialog --title " form " --form "Hello World!" 12 40 5 \
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_ESC=5}
FORMS=$(./bsddialog --title " form " --form "Hello World!" 12 40 5 \
Label1: 1 1 Value1 1 9 18 25 \
Label2: 2 1 Value2 2 9 18 25 \
Label3: 3 1 Value3 3 9 18 25 \
Label4: 4 1 Value4 4 9 18 25 \
Label5: 5 1 Value5 5 9 18 25 \
2>out.txt ; cat out.txt ; rm out.txt
3>&1 1>&2 2>&3 3>&-)
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC]"
;;
$BSDDIALOG_CANCEL )
echo "[Cancel]"
;;
$BSDDIALOG_OK )
echo "[OK]"
;;
esac
echo "$FORMS"

View File

@ -3,10 +3,11 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
characters="A B C D E F G"
total=`echo $characters | awk '{print split($0, a)}'`
@ -25,4 +26,3 @@ do
fi
i=`expr $i + 1`
done | ./bsddialog --title " gauge " --gauge "[0/$total] Starting..." 10 70

View File

@ -3,9 +3,10 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
./bsddialog --sleep 3 --title " infobox " --infobox "Hello World!\n3 secs" 6 20

View File

@ -3,10 +3,34 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_ESC=5}
FORM=$(./bsddialog --title " inputbox " --inputbox "Hello World!" 12 40 init \
3>&1 1>&2 2>&3 3>&-)
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC]"
;;
$BSDDIALOG_CANCEL )
echo "[Cancel]"
;;
$BSDDIALOG_OK )
echo "[OK]"
;;
esac
echo "$FORM"
./bsddialog --title " inputbox " --inputbox "Hello World!" 12 40 default \
2>out.txt ; cat out.txt ; rm out.txt

View File

@ -3,15 +3,35 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
./bsddialog --title " menu " --menu "Hello World!" 15 30 5 \
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_ESC=5}
ITEM=$(./bsddialog --title " menu " --menu "Hello World!" 15 30 5 \
"Tag 1" "DESC 1 xyz" \
"Tag 2" "DESC 2 xyz" \
"Tag 3" "DESC 3 xyz" \
"Tag 4" "DESC 4 xyz" \
"Tag 5" "DESC 5 xyz" \
2>out.txt ; cat out.txt ; rm out.txt
3>&1 1>&2 2>&3 3>&-)
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC] $ITEM"
;;
$BSDDIALOG_CANCEL )
echo "[Cancel] $ITEM"
;;
$BSDDIALOG_OK )
echo "[OK] $ITEM"
;;
esac

View File

@ -3,13 +3,37 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
./bsddialog --insecure --title " mixedform " --mixedform "Hello World!" 12 40 5 \
Label: 11 Entry 1 11 18 25 0 \
Label: 21 Read-Only 2 11 18 25 2 \
Password: 31 "" 3 11 18 25 1 \
2>out.txt ; cat out.txt ; rm out.txt
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_ESC=5}
FORMS=$(./bsddialog --insecure --title " mixedform " \
--mixedform "Hello World!" 12 40 3 \
Label: 1 1 Entry 1 11 18 25 0 \
Label: 2 1 Read-Only 2 11 18 25 2 \
Password: 3 1 "" 3 11 18 25 1 \
3>&1 1>&2 2>&3 3>&-)
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC]"
;;
$BSDDIALOG_CANCEL )
echo "[Cancel]"
;;
$BSDDIALOG_OK )
echo "[OK]"
;;
esac
echo "$FORMS"

View File

@ -3,10 +3,11 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
perc=0
while [ $perc -le 100 ]

View File

@ -3,9 +3,26 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_ESC=5}
./bsddialog --title " msgbox " --msgbox "Hello World!" 6 20
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC]"
;;
$BSDDIALOG_OK )
echo "[OK]"
;;
esac

View File

@ -3,10 +3,34 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
./bsddialog --insecure --title " password " --passwordbox "Hello World!" 12 40 \
2>out.txt ; cat out.txt ; rm out.txt
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_ESC=5}
FORM=$(./bsddialog --insecure --title " password " \
--passwordbox "Hello World!" 12 40 \
3>&1 1>&2 2>&3 3>&-)
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC]"
;;
$BSDDIALOG_CANCEL )
echo "[Cancel]"
;;
$BSDDIALOG_OK )
echo "[OK]"
;;
esac
echo "$FORM"

View File

@ -3,15 +3,39 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
./bsddialog --insecure --title " passwordform " --passwordform "Example" 12 40 5 \
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_ESC=5}
FORMS=$(./bsddialog --insecure --title " passwordform " \
--passwordform "Example" 12 40 5 \
Password1: 1 1 "" 1 12 18 25 \
Password2: 2 1 "" 2 12 18 25 \
Password3: 3 1 "" 3 12 18 25 \
Password4: 4 1 "" 4 12 18 25 \
Password5: 5 1 "" 5 12 18 25 \
2>out.txt ; cat out.txt ; rm out.txt
3>&1 1>&2 2>&3 3>&-)
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC]"
;;
$BSDDIALOG_CANCEL )
echo "[Cancel]"
;;
$BSDDIALOG_OK )
echo "[OK]"
;;
esac
echo "$FORMS"

36
examples_utility/pause.sh Executable file
View File

@ -0,0 +1,36 @@
#!/bin/sh
#-
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_TIMEOUT=4}
: ${BSDDIALOG_ESC=5}
./bsddialog --title " pause " --pause "Hello World!" 7 35 10
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC]"
;;
$BSDDIALOG_TIMEOUT )
echo "[TIMEOUT]"
;;
$BSDDIALOG_CANCEL )
echo "[Cancel]"
;;
$BSDDIALOG_OK )
echo "[OK]"
;;
esac

View File

@ -3,15 +3,38 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
./bsddialog --title " radiolist " --radiolist "Hello World!" 15 30 5 \
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_ESC=5}
ITEM=$(./bsddialog --title " radiolist " --radiolist "Hello World!" 15 30 5 \
"Tag 1" "DESC 1 xyz" off \
"Tag 2" "DESC 2 xyz" off \
"Tag 3" "DESC 3 xyz" on \
"Tag 4" "DESC 4 xyz" off \
"Tag 5" "DESC 5 xyz" off \
2>out.txt ; cat out.txt ; rm out.txt
3>&1 1>&2 2>&3 3>&-)
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC] focus "
;;
$BSDDIALOG_CANCEL )
echo "[Cancel] focus "
;;
$BSDDIALOG_OK )
echo "[OK]"
;;
esac
echo "$ITEM"

34
examples_utility/timebox.sh Executable file
View File

@ -0,0 +1,34 @@
#!/bin/sh
#-
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_OK=0}
: ${BSDDIALOG_CANCEL=1}
: ${BSDDIALOG_ESC=5}
TIME=$(./bsddialog --title " timebox " \
--timebox "Tab / Left / Right to move\nUp / Down to select" 10 40 \
3>&1 1>&2 2>&3 3>&-)
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC]"
;;
$BSDDIALOG_CANCEL )
echo "[Cancel]"
;;
$BSDDIALOG_OK )
echo "[OK] $TIME"
;;
esac

View File

@ -1,17 +0,0 @@
#!/bin/sh
#-
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
./bsddialog --title " treeview " --treeview "Hello World!" 15 40 5 \
0 "Tag 1" "DESC 1 xyz" off \
1 "Tag 2" "DESC 2 xyz" off \
2 "Tag 3" "DESC 3 xyz" on \
1 "Tag 4" "DESC 4 xyz" off \
1 "Tag 5" "DESC 5 xyz" off \
2>out.txt ; cat out.txt ; rm out.txt

View File

@ -3,9 +3,30 @@
# SPDX-License-Identifier: CC0-1.0
#
# Written in 2021 by Alfonso Sabato Siciliano.
#
# To the extent possible under law, the author has dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>.
# <http://creativecommons.org/publicdomain/zero/1.0/>.
: ${BSDDIALOG_ERROR=255}
: ${BSDDIALOG_YES=0}
: ${BSDDIALOG_NO=1}
: ${BSDDIALOG_ESC=5}
./bsddialog --title " yesno " --yesno "Hello World!" 6 25
case $? in
$BSDDIALOG_ERROR )
exit 1
;;
$BSDDIALOG_ESC )
echo "[ESC]"
;;
$BSDDIALOG_NO )
echo "[NO]"
;;
$BSDDIALOG_YES )
echo "[YES]"
;;
esac

View File

@ -3,14 +3,15 @@
#
# Written in 2021 by Alfonso Sabato Siciliano
VERSION = 0.1
VERSION = 0.2
LIBRARY = bsddialog
LIBRARY_SO = lib${LIBRARY:=.so}
HEADERS = bsddialog.h bsddialog_theme.h bsddialog_progressview.h
SOURCES = barbox.c formbox.c infobox.c libbsddialog.c lib_util.c menubox.c \
messagebox.c textbox.c theme.c timebox.c
OBJECTS = $(SOURCES:.c=.o)
CFLAGS = -Wall -Werror -fpic
CFLAGS = -D_XOPEN_SOURCE_EXTENDED -Wall -Wextra -Wno-implicit-fallthrough \
-Werror -fpic
LDFLAGS = -lformw -lncursesw -ltinfo
LIBFLAG = -shared

View File

@ -3,7 +3,7 @@
#
# Written in 2021 by Alfonso Sabato Siciliano
VERSION = 0.1
VERSION = 0.2
LIBRARY = bsddialog
LIBRARY_SO = lib${LIBRARY:=.so}
LIBRARY_A = lib${LIBRARY:=.a}
@ -11,17 +11,16 @@ HEADERS = bsddialog.h bsddialog_theme.h bsddialog_progressview.h
SOURCES = barbox.c formbox.c infobox.c libbsddialog.c lib_util.c menubox.c \
messagebox.c textbox.c theme.c timebox.c
OBJECTS = ${SOURCES:.c=.o}
CFLAGS += -fPIC -Wall -Wextra
CFLAGS += -D_XOPEN_SOURCE_EXTENDED -fPIC -Wall -Wextra
LDFLAGS += -fstack-protector-strong -shared -Wl,-x -Wl,--fatal-warnings \
-Wl,--warn-shared-textrel -Wl,-soname,${LIBRARY_SO}.${VERSION} \
-L/usr/lib -lformw -lncursesw -ltinfow
.if defined(DEBUG)
# `make -DDEBUG`
CFLAGS = -g -fPIC -Wall -Wextra
CFLAGS = -g -D_XOPEN_SOURCE_EXTENDED -fPIC -Wall -Wextra
.else
CFLAGS += -O2 -pipe -std=gnu99 -Wno-format-zero-length \
-fstack-protector-strong -Qunused-arguments
CFLAGS += -std=gnu99 -fstack-protector-strong
.endif
LOCALBASE = /usr/local
@ -66,7 +65,7 @@ install:
${INSTALL} -l rs ${LOCALBASE}/lib/${LIBRARY_SO}.${VERSION} ${LOCALBASE}/lib/${LIBRARY_SO}
${INSTALL} -m 644 ${LIBRARY_A} ${LOCALBASE}/lib
${LDCONFIG} ${LOCALBASE}/lib
${INSTALL} -m 644 ${LIBRARY}.3.gz ${MNADIR}
${INSTALL} -m 644 ${LIBRARY}.3.gz ${MANDIR}
unistall:
${RM} ${LOCALBASE}/include/${LIBRARY}*.h

View File

@ -39,26 +39,27 @@
#include "bsddialog_theme.h"
#include "lib_util.h"
#define BARPADDING 3
#define MINBARWIDTH (15 + BARPADDING * 2)
#define BARPADDING 2
#define MINBARLEN 15
#define MINBARWIDTH (2 + 2 * BARPADDING + MINBARLEN)
#define MINMGBARLEN 18
#define MINMGBARWIDTH (2 + 2 * BARPADDING + MINMGBARLEN)
bool bsddialog_interruptprogview;
bool bsddialog_abortprogview;
int bsddialog_total_progview;
extern struct bsddialog_theme t;
static void
draw_bar(WINDOW *win, int y, int x, int size, int perc, bool withlabel,
draw_bar(WINDOW *win, int y, int x, int barlen, int perc, bool withlabel,
int label)
{
int i, blue_x, color;
int i, blue_x, color, stringlen;
char labelstr[128];
blue_x = (int)((perc*(size))/100);
blue_x = perc > 0 ? (perc * barlen) / 100 : -1;
wmove(win, y, x);
for (i = 0; i < size; i++) {
for (i = 0; i < barlen; i++) {
color = (i <= blue_x) ? t.bar.f_color : t.bar.color;
wattron(win, color);
waddch(win, ' ');
@ -69,9 +70,10 @@ draw_bar(WINDOW *win, int y, int x, int size, int perc, bool withlabel,
sprintf(labelstr, "%d", label);
else
sprintf(labelstr, "%3d%%", perc);
wmove(win, y, x + size/2 - 2);
for (i = 0; i < (int)strlen(labelstr); i++) {
color = (blue_x + 1 <= size/2 - (int)strlen(labelstr)/2 + i ) ?
stringlen = (int)strlen(labelstr);
wmove(win, y, x + barlen/2 - stringlen/2);
for (i = 0; i < stringlen; i++) {
color = (blue_x + 1 <= barlen/2 - stringlen/2 + i ) ?
t.bar.color : t.bar.f_color;
wattron(win, color);
waddch(win, labelstr[i]);
@ -106,11 +108,9 @@ bar_checksize(int rows, int cols, struct buttons *bs)
int minheight, minwidth;
minwidth = 0;
if (bs != NULL) { /* gauge has not buttons */
minwidth = bs->nbuttons * bs->sizebutton;
if (bs->nbuttons > 0)
minwidth += (bs->nbuttons-1) * t.button.space;
}
if (bs != NULL) /* gauge has not buttons */
minwidth = buttons_width(*bs);
minwidth = MAX(minwidth, MINBARWIDTH);
minwidth += VBORDERS;
@ -152,7 +152,7 @@ bsddialog_gauge(struct bsddialog_conf *conf, const char *text, int rows,
bar = new_boxed_window(conf, y+h-4, x+3, 3, w-6, RAISED);
mainloop = (fd < 0) ? false : true;
if (mainloop) {
fd2 = dup(fd);
input = fdopen(fd2, "r");
@ -181,7 +181,6 @@ bsddialog_gauge(struct bsddialog_conf *conf, const char *text, int rows,
if (mainloop == false)
break;
fscanf(input, "%d", &perc);
perc = perc < 0 ? 0 : perc;
perc = perc > 100 ? 100 : perc;
pntext = &ntext[0];
ntext[0] = '\0';
@ -242,7 +241,8 @@ do_mixedgauge(struct bsddialog_conf *conf, const char *text, int rows, int cols,
max_minbarlen = 0;
for (i = 0; i < (int)nminibars; i++)
max_minbarlen = MAX(max_minbarlen, (int)strlen(minilabels[i]));
max_minbarlen += 3 + 16 /* seps + [...] or mainbar */;
max_minbarlen += 3 + 16; /* seps + [...] */
max_minbarlen = MAX(max_minbarlen, MINMGBARWIDTH); /* mainbar */
if (set_widget_size(conf, rows, cols, &h, &w) != 0)
return (BSDDIALOG_ERROR);
@ -311,7 +311,7 @@ do_mixedgauge(struct bsddialog_conf *conf, const char *text, int rows, int cols,
wrefresh(widget);
getmaxyx(textpad, htextpad, i /* unused */);
ypad = y + h - 4 - htextpad;
ypad = ypad < y+(int)nminibars ? y+nminibars : ypad;
ypad = ypad < y+(int)nminibars ? y+(int)nminibars : ypad;
prefresh(textpad, 0, 0, ypad, x+2, y+h-4, x+w-2);
/* main bar */
@ -463,7 +463,7 @@ bsddialog_rangebox(struct bsddialog_conf *conf, const char *text, int rows,
prefresh(textpad, 0, 0, y+1, x+1+TEXTHMARGIN, y+h-7, x+w-1-TEXTHMARGIN);
sizebar = w - HBORDERS - 2 - BARPADDING * 2;
sizebar = w - HBORDERS - (2 * BARPADDING) - 2;
bigchange = MAX(1, sizebar/10);
bar = new_boxed_window(conf, y + h - 6, x + 1 + BARPADDING, 3,
@ -546,7 +546,8 @@ bsddialog_rangebox(struct bsddialog_conf *conf, const char *text, int rows,
}
break;
case KEY_F(1):
if (conf->f1_file == NULL && conf->f1_message == NULL)
if (conf->key.f1_file == NULL &&
conf->key.f1_message == NULL)
break;
if (f1help(conf) != 0)
return (BSDDIALOG_ERROR);
@ -572,7 +573,7 @@ bsddialog_rangebox(struct bsddialog_conf *conf, const char *text, int rows,
doupdate();
sizebar = w - HBORDERS - 2 - BARPADDING * 2;
sizebar = w - HBORDERS - (2 * BARPADDING) - 2;
bigchange = MAX(1, sizebar/10);
wclear(bar);
mvwin(bar, y + h - 6, x + 1 + BARPADDING);
@ -627,7 +628,7 @@ bsddialog_pause(struct bsddialog_conf *conf, const char *text, int rows,
prefresh(textpad, 0, 0, y+1, x+1+TEXTHMARGIN, y+h-7, x+w-1-TEXTHMARGIN);
sizebar = w - HBORDERS - 2 - BARPADDING * 2;
sizebar = w - HBORDERS - (2 * BARPADDING) - 2;
bar = new_boxed_window(conf, y + h - 6, x + 1 + BARPADDING, 3,
sizebar + 2, RAISED);
@ -690,7 +691,8 @@ bsddialog_pause(struct bsddialog_conf *conf, const char *text, int rows,
}
break;
case KEY_F(1):
if (conf->f1_file == NULL && conf->f1_message == NULL)
if (conf->key.f1_file == NULL &&
conf->key.f1_message == NULL)
break;
if (f1help(conf) != 0)
return (BSDDIALOG_ERROR);
@ -716,7 +718,7 @@ bsddialog_pause(struct bsddialog_conf *conf, const char *text, int rows,
doupdate();
sizebar = w - HBORDERS - 2 - BARPADDING * 2;
sizebar = w - HBORDERS - (2 * BARPADDING) - 2;
wclear(bar);
mvwin(bar, y + h - 6, x + 1 + BARPADDING);
wresize(bar, 3, sizebar + 2);

View File

@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd January 23, 2022
.Dd February 9, 2022
.Dt BSDDIALOG 3
.Os
.Sh NAME
@ -284,8 +284,6 @@ struct bsddialog_conf {
unsigned int auto_minwidth;
const char *bottomtitle;
bool clear;
const char *f1_file;
const char *f1_message;
int *get_height;
int *get_width;
bool no_lines;
@ -296,6 +294,8 @@ struct bsddialog_conf {
int x;
struct {
bool enable_esc;
const char *f1_file;
const char *f1_message;
} key;
struct {
bool highlight;
@ -305,13 +305,13 @@ struct bsddialog_conf {
bool align_left;
bool no_desc;
bool no_name;
bool on_without_ok;
bool shortcut_buttons;
} menu;
struct {
bool enable_wchar;
int securech;
bool value_withcancel;
bool value_withextra;
bool value_withhelp;
bool value_without_ok;
} form;
struct {
bool without_ok;
@ -347,10 +347,6 @@ is
subtitle at the dialog bottom side.
.It Fa conf.clear
hide the dialog at exit.
.It Fa conf.f1_file
file to open if F1 is pressed.
.It Fa conf.f1_message
message to display if F1 is pressed.
.It Fa conf.get_height
if not
.Dv NULL
@ -375,10 +371,16 @@ horizontal position, 0 is left screen side, can be
.Dv BSDDIALOG_CENTER .
.El
.Pp
.Fa conf.key.enable_esc
.Bl -column -compact
.It Fa conf.key.enable_esc
enables
.Dv ESC
key to close the dialog.
.It Fa conf.key.f1_file
file to open if F1 is pressed.
.It Fa conf.key.f1_message
message to display if F1 is pressed.
.El
.Pp
.Fa conf.text.highlight
enables highlights for
@ -659,6 +661,12 @@ have to be between 1 and
.Fn bsddialog_form
can be customized by:
.Bl -column -compact
.It Fa conf.form.enable_wchar
enables characters greater than 127 in the field,
.Fa value
is a pointer to allocated memory for a
.Em wchar_t
string.
.It Fa conf.form.securech
charachter to hide the input
with
@ -749,9 +757,10 @@ struct bsddialog_theme {
int lineraisecolor;
int linelowercolor;
int bottomtitlecolor;
int arrowcolor;
} dialog;
struct {
int arrowcolor;
int f_selectorcolor;
int selectorcolor;
int f_namecolor;
int namecolor;
@ -772,9 +781,9 @@ struct bsddialog_theme {
int color;
} bar;
struct {
unsigned int space;
int leftch;
int rightch;
unsigned int hmargin;
int leftdelim;
int rightdelim;
int delimcolor;
int f_delimcolor;
int color;
@ -826,7 +835,7 @@ call.
The library provides predefined themes:
.Dv BSDDIALOG_THEME_BLACKWHITE ,
.Dv BSDDIALOG_THEME_BSDDIALOG ,
.Dv BSDDIALOG_THEME_DEFAULT
.Dv BSDDIALOG_THEME_FLAT
and
.Dv BSDDIALOG_THEME_DIALOG ,
they can be set via
@ -898,7 +907,7 @@ Theme Example:
struct bsddialog_conf conf;
struct bsddialog_theme theme;
if (bsddialog_init() == BSDDIALOG_ERROR)
bsddialog_init();
bsddialog_initconf(&conf);
bsddialog_msgbox(&conf, "Default theme", 7, 25);

View File

@ -30,7 +30,7 @@
#include <stdbool.h>
#define LIBBSDDIALOG_VERSION "0.1"
#define LIBBSDDIALOG_VERSION "0.2"
/* Exit status */
#define BSDDIALOG_ERROR -1
@ -73,8 +73,6 @@ struct bsddialog_conf {
unsigned int auto_minwidth;
const char *bottomtitle;
bool clear;
const char *f1_file;
const char *f1_message;
int *get_height;
int *get_width;
bool no_lines;
@ -85,6 +83,8 @@ struct bsddialog_conf {
int x;
struct {
bool enable_esc;
const char *f1_file;
const char *f1_message;
} key;
struct {
bool highlight;
@ -98,6 +98,7 @@ struct bsddialog_conf {
bool shortcut_buttons;
} menu;
struct {
bool enable_wchar;
int securech;
bool value_without_ok;
} form;

View File

@ -49,9 +49,10 @@ struct bsddialog_theme {
int lineraisecolor;
int linelowercolor;
int bottomtitlecolor;
int arrowcolor;
} dialog;
struct {
int arrowcolor;
int f_selectorcolor;
int selectorcolor;
int f_namecolor;
int namecolor;
@ -72,9 +73,9 @@ struct bsddialog_theme {
int color;
} bar;
struct {
unsigned int space;
int leftch;
int rightch;
unsigned int hmargin;
int leftdelim;
int rightdelim;
int delimcolor;
int f_delimcolor;
int color;
@ -87,7 +88,7 @@ struct bsddialog_theme {
enum bsddialog_default_theme {
BSDDIALOG_THEME_BLACKWHITE,
BSDDIALOG_THEME_BSDDIALOG,
BSDDIALOG_THEME_DEFAULT,
BSDDIALOG_THEME_FLAT,
BSDDIALOG_THEME_DIALOG
};

View File

@ -36,16 +36,14 @@
#include "bsddialog_theme.h"
#include "lib_util.h"
#define REDRAWFORM 19860214 /* magic number */
#define ISFIELDHIDDEN(item) (item.flags & BSDDIALOG_FIELDHIDDEN)
#define ISFIELDREADONLY(item) (item.flags & BSDDIALOG_FIELDREADONLY)
extern struct bsddialog_theme t;
#define REDRAWFORM 19860214 /* magic number */
/* field_userptr for private buffer and view options */
struct myfield {
int buflen;
char *buf;
wchar_t *buf;
int pos;
int maxpos;
bool secure;
@ -97,7 +95,23 @@ static void print_bottomdesc(struct myfield *mf)
}
}
int
static char *w2c(wchar_t *string)
{
int i, len;
char *value;
len = wcslen(string);
if ((value = calloc(len + 1, sizeof(char))) == NULL)
return NULL;
for (i = 0; i < len; i++)
value[i] = string[i];
value[i] = '\0';
return value;
}
static int
return_values(struct bsddialog_conf *conf, int output, int nitems,
struct bsddialog_formitem *items, FORM *form, FIELD **cfield)
{
@ -107,11 +121,15 @@ return_values(struct bsddialog_conf *conf, int output, int nitems,
if (output != BSDDIALOG_OK && conf->form.value_without_ok == false)
return (output);
form_driver(form, REQ_NEXT_FIELD);
form_driver(form, REQ_PREV_FIELD);
form_driver_w(form, KEY_CODE_YES, REQ_NEXT_FIELD);
form_driver_w(form, KEY_CODE_YES, REQ_PREV_FIELD);
for (i = 0; i < nitems; i++) {
mf = GETMYFIELD(cfield[i]);
items[i].value = strdup(mf->buf);
if (conf->form.enable_wchar) {
items[i].value = (char*)wcsdup(mf->buf);
} else {
items[i].value = w2c(mf->buf);
}
if (items[i].value == NULL)
RETURN_ERROR("Cannot allocate memory for form value");
}
@ -125,15 +143,16 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, struct buttons bs,
struct bsddialog_formitem *items)
{
bool loop, buttupdate, informwin;
int i, input, output;
int i, chtype, output;
wint_t input;
struct myfield *mf;
mf = GETMYFIELD2(form);
print_bottomdesc(mf);
pos_form_cursor(form);
form_driver(form, REQ_END_LINE);
form_driver_w(form, KEY_CODE_YES, REQ_END_LINE);
mf->pos = MIN(mf->buflen, mf->maxpos);
curs_set(2);
curs_set(1);
informwin = true;
bs.curr = -1;
@ -147,8 +166,17 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, struct buttons bs,
buttupdate = false;
}
wrefresh(formwin);
input = getch();
chtype = get_wch(&input);
if (chtype != KEY_CODE_YES && input > 127 &&
conf->form.enable_wchar == false)
continue;
switch(input) {
case KEY_HOME:
case KEY_PPAGE:
case KEY_END:
case KEY_NPAGE:
/* disabled keys */
break;
case KEY_ENTER:
case 10: /* Enter */
if (informwin)
@ -174,7 +202,7 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, struct buttons bs,
informwin = bs.curr >= (int)bs.nbuttons ?
true : false;
if (informwin) {
curs_set(2);
curs_set(1);
pos_form_cursor(form);
}
}
@ -182,7 +210,7 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, struct buttons bs,
break;
case KEY_LEFT:
if (informwin) {
form_driver(form, REQ_PREV_CHAR);
form_driver_w(form, KEY_CODE_YES, REQ_PREV_CHAR);
mf = GETMYFIELD2(form);
if (mf->pos > 0)
mf->pos -= 1;
@ -199,7 +227,7 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, struct buttons bs,
if (mf->pos >= mf->buflen)
break;
mf->pos += 1;
form_driver(form, REQ_NEXT_CHAR);
form_driver_w(form, KEY_CODE_YES, REQ_NEXT_CHAR);
} else {
if (bs.curr < (int) bs.nbuttons - 1) {
bs.curr++;
@ -212,8 +240,8 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, struct buttons bs,
break;
set_field_fore(current_field(form), t.form.fieldcolor);
set_field_back(current_field(form), t.form.fieldcolor);
form_driver(form, REQ_PREV_FIELD);
form_driver(form, REQ_END_LINE);
form_driver_w(form, KEY_CODE_YES, REQ_PREV_FIELD);
form_driver_w(form, KEY_CODE_YES, REQ_END_LINE);
mf = GETMYFIELD2(form);
print_bottomdesc(mf);
mf->pos = MIN(mf->buflen, mf->maxpos);
@ -225,8 +253,8 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, struct buttons bs,
break;
set_field_fore(current_field(form), t.form.fieldcolor);
set_field_back(current_field(form), t.form.fieldcolor);
form_driver(form, REQ_NEXT_FIELD);
form_driver(form, REQ_END_LINE);
form_driver_w(form, KEY_CODE_YES, REQ_NEXT_FIELD);
form_driver_w(form, KEY_CODE_YES, REQ_END_LINE);
mf = GETMYFIELD2(form);
print_bottomdesc(mf);
mf->pos = MIN(mf->buflen, mf->maxpos);
@ -238,21 +266,22 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, struct buttons bs,
mf = GETMYFIELD2(form);
if (mf->pos <= 0)
break;
form_driver(form, REQ_DEL_PREV);
form_driver(form, REQ_BEG_LINE);
form_driver_w(form, KEY_CODE_YES, REQ_DEL_PREV);
form_driver_w(form, KEY_CODE_YES, REQ_BEG_LINE);
mf->pos = mf->pos - 1;
for (i = 0; i < mf->pos; i++)
form_driver(form, REQ_NEXT_CHAR);
form_driver_w(form, KEY_CODE_YES, REQ_NEXT_CHAR);
shiftleft(mf);
break;
case KEY_DC:
form_driver(form, REQ_DEL_CHAR);
form_driver_w(form, KEY_CODE_YES, REQ_DEL_CHAR);
mf = GETMYFIELD2(form);
if (mf->pos < mf->buflen)
shiftleft(mf);
break;
case KEY_F(1):
if (conf->f1_file == NULL && conf->f1_message == NULL)
if (conf->key.f1_file == NULL &&
conf->key.f1_message == NULL)
break;
if (f1help(conf) != 0)
return (BSDDIALOG_ERROR);
@ -263,11 +292,13 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, struct buttons bs,
break;
default:
if (informwin) {
if (chtype == KEY_CODE_YES)
break;
mf = GETMYFIELD2(form);
if (mf->secure)
form_driver(form, mf->securech);
form_driver_w(form, chtype, mf->securech);
else
form_driver(form, input);
form_driver_w(form, chtype, input);
insertch(mf, input);
}
else {
@ -330,8 +361,7 @@ form_checksize(int rows, int cols, const char *text, int formheight, int nitems,
mincols = VBORDERS;
/* buttons */
mincols += bs.nbuttons * bs.sizebutton;
mincols += bs.nbuttons > 0 ? (bs.nbuttons-1) * t.button.space : 0;
mincols += buttons_width(bs);
mincols = MAX(mincols, (int)linelen + 4);
if (cols < mincols)
@ -356,13 +386,13 @@ bsddialog_form(struct bsddialog_conf *conf, const char *text, int rows,
int cols, unsigned int formheight, unsigned int nitems,
struct bsddialog_formitem *items)
{
WINDOW *widget, *formwin, *textpad, *shadow;
int i, output, color, y, x, h, w;
FIELD **cfield;
FORM *form;
unsigned long j, maxline, mybufsize;
struct buttons bs;
struct myfield *myfields;
unsigned long maxline;
FIELD **cfield;
FORM *form;
WINDOW *widget, *formwin, *textpad, *shadow;
/* disable form scrolling */
if (formheight < nitems)
@ -385,13 +415,17 @@ bsddialog_form(struct bsddialog_conf *conf, const char *text, int rows,
items[i].xfield-1, 0, 0);
field_opts_off(cfield[i], O_STATIC);
set_max_field(cfield[i], items[i].maxvaluelen);
/* setlocale() should handle set_field_buffer() */
set_field_buffer(cfield[i], 0, items[i].init);
myfields[i].buf = malloc(items[i].maxvaluelen + 1);
memset(myfields[i].buf, 0, items[i].maxvaluelen + 1);
strncpy(myfields[i].buf, items[i].init, items[i].maxvaluelen);
mybufsize = (items[i].maxvaluelen + 1) * sizeof(wchar_t);
myfields[i].buf = malloc(mybufsize);
memset(myfields[i].buf, 0, mybufsize);
for (j = 0; j < items[i].maxvaluelen && j < strlen(items[i].init);
j++)
myfields[i].buf[j] = items[i].init[j];
myfields[i].buflen = strlen(myfields[i].buf);
myfields[i].buflen = wcslen(myfields[i].buf);
myfields[i].maxpos = items[i].maxvaluelen -1;
myfields[i].pos = MIN(myfields[i].buflen, myfields[i].maxpos);
@ -500,4 +534,4 @@ bsddialog_form(struct bsddialog_conf *conf, const char *text, int rows,
end_dialog(conf, shadow, widget, textpad);
return (output);
}
}

View File

@ -30,11 +30,8 @@
#include <curses.h>
#include "bsddialog.h"
#include "bsddialog_theme.h"
#include "lib_util.h"
extern struct bsddialog_theme t;
static int
infobox_autosize(struct bsddialog_conf *conf, int rows, int cols, int *h,
int *w, const char *text)

View File

@ -37,10 +37,8 @@
#include "bsddialog_theme.h"
#include "lib_util.h"
extern struct bsddialog_theme t;
#define TABLEN 4 /* Default tab len */
#define ERRBUFLEN 1024 /* Error buffer */
#define ERRBUFLEN 1024 /* Error buffer */
/* Error */
static char errorbuffer[ERRBUFLEN];
@ -50,7 +48,7 @@ const char *get_error_string(void)
return (errorbuffer);
}
void set_error_string(char *str)
void set_error_string(const char *str)
{
strncpy(errorbuffer, str, ERRBUFLEN-1);
}
@ -91,11 +89,11 @@ int f1help(struct bsddialog_conf *conf)
hconf.text.highlight = conf->text.highlight;
output = BSDDIALOG_OK;
if (conf->f1_message != NULL)
output = bsddialog_msgbox(&hconf, conf->f1_message, 0, 0);
if (conf->key.f1_message != NULL)
output = bsddialog_msgbox(&hconf, conf->key.f1_message, 0, 0);
if (output != BSDDIALOG_ERROR && conf->f1_file != NULL)
output = bsddialog_textbox(&hconf, conf->f1_file, 0, 0);
if (output != BSDDIALOG_ERROR && conf->key.f1_file != NULL)
output = bsddialog_textbox(&hconf, conf->key.f1_file, 0, 0);
return (output == BSDDIALOG_ERROR ? BSDDIALOG_ERROR : 0);
}
@ -118,14 +116,14 @@ draw_button(WINDOW *window, int y, int x, int size, const char *text,
}
wattron(window, color_arrows);
mvwaddch(window, y, x, t.button.leftch);
mvwaddch(window, y, x, t.button.leftdelim);
wattroff(window, color_arrows);
wattron(window, color_button);
for (i = 1; i < size - 1; i++)
waddch(window, ' ');
wattroff(window, color_button);
wattron(window, color_arrows);
mvwaddch(window, y, x + i, t.button.rightch);
mvwaddch(window, y, x + i, t.button.rightdelim);
wattroff(window, color_arrows);
x = x + 1 + ((size - 2 - strlen(text))/2);
@ -148,19 +146,18 @@ draw_buttons(WINDOW *window, struct buttons bs, bool shortcut)
getmaxyx(window, rows, cols);
y = rows - 2;
startx = bs.sizebutton * bs.nbuttons + (bs.nbuttons-1) * t.button.space;
startx = cols/2 - startx/2;
startx = cols/2 - buttons_width(bs)/2;
for (i = 0; i < (int) bs.nbuttons; i++) {
x = i * (bs.sizebutton + t.button.space);
for (i = 0; i < (int)bs.nbuttons; i++) {
x = i * (bs.sizebutton + t.button.hmargin);
draw_button(window, y, startx + x, bs.sizebutton, bs.label[i],
i == bs.curr, shortcut);
}
}
void
get_buttons(struct bsddialog_conf *conf, struct buttons *bs, char *yesoklabel,
char *nocancellabel)
get_buttons(struct bsddialog_conf *conf, struct buttons *bs,
const char *yesoklabel, const char *nocancellabel)
{
int i;
#define SIZEBUTTON 8
@ -233,6 +230,17 @@ get_buttons(struct bsddialog_conf *conf, struct buttons *bs, char *yesoklabel,
bs->sizebutton += 2;
}
int buttons_width(struct buttons bs)
{
unsigned int width;
width = bs.nbuttons * bs.sizebutton;
if (bs.nbuttons > 0)
width += (bs.nbuttons - 1) * t.button.hmargin;
return (width);
}
bool shortcut_buttons(int key, struct buttons *bs)
{
bool match;
@ -532,11 +540,8 @@ text_size(struct bsddialog_conf *conf, int rows, int cols, const char *text,
bool changewtext;
wbuttons = 0;
if (bs != NULL) {
wbuttons = bs->nbuttons * bs->sizebutton;
if (bs->nbuttons > 0)
wbuttons += (bs->nbuttons-1) * t.button.space;
}
if (bs != NULL)
wbuttons = buttons_width(*bs);
if (cols == BSDDIALOG_AUTOSIZE) {
startwtext = MAX(startwtext, wbuttons - TEXTHMARGINS);
@ -577,7 +582,7 @@ int widget_max_height(struct bsddialog_conf *conf)
{
int maxheight;
maxheight = conf->shadow ? SCREENLINES - t.shadow.h : SCREENLINES;
maxheight = conf->shadow ? SCREENLINES - (int)t.shadow.h : SCREENLINES;
if (maxheight <= 0)
RETURN_ERROR("Terminal too small, screen lines - shadow <= 0");
@ -595,7 +600,7 @@ int widget_max_width(struct bsddialog_conf *conf)
{
int maxwidth;
maxwidth = conf->shadow ? SCREENCOLS - t.shadow.w : SCREENCOLS;
maxwidth = conf->shadow ? SCREENCOLS - (int)t.shadow.w : SCREENCOLS;
if (maxwidth <= 0)
RETURN_ERROR("Terminal too small, screen cols - shadow <= 0");
@ -647,10 +652,8 @@ widget_min_width(struct bsddialog_conf *conf, int wtext, int minwidget,
min = 0;
/* buttons */
if (bs != NULL) {
min += bs->nbuttons * bs->sizebutton;
min += bs->nbuttons > 0 ? (bs->nbuttons-1) * t.button.space : 0;
}
if (bs != NULL)
min += buttons_width(*bs);
/* text */
if (wtext > 0)
@ -774,7 +777,7 @@ draw_borders(struct bsddialog_conf *conf, WINDOW *win, int rows, int cols,
rtee = ACS_RTEE;
}
leftcolor = elev == RAISED ?
leftcolor = elev == RAISED ?
t.dialog.lineraisecolor : t.dialog.linelowercolor;
rightcolor = elev == RAISED ?
t.dialog.linelowercolor : t.dialog.lineraisecolor;

View File

@ -33,6 +33,9 @@
#define TEXTHMARGIN 1
#define TEXTHMARGINS (TEXTHMARGIN + TEXTHMARGIN)
/* current theme */
extern struct bsddialog_theme t;
/* debug */
#define BSDDIALOG_DEBUG(y,x,fmt, ...) do { \
mvprintw(y, x, fmt, __VA_ARGS__); \
@ -41,7 +44,7 @@
/* error buffer */
const char *get_error_string(void);
void set_error_string(char *string);
void set_error_string(const char *string);
#define RETURN_ERROR(str) do { \
set_error_string(str); \
@ -61,12 +64,13 @@ struct buttons {
#define BUTTON_OK_LABEL "OK"
#define BUTTON_CANCEL_LABEL "Cancel"
void
get_buttons(struct bsddialog_conf *conf, struct buttons *bs, char *yesoklabel,
char *nocancellabel);
get_buttons(struct bsddialog_conf *conf, struct buttons *bs,
const char *yesoklabel, const char *nocancellabel);
void
draw_buttons(WINDOW *window, struct buttons bs, bool shortcut);
int buttons_width(struct buttons bs);
bool shortcut_buttons(int key, struct buttons *bs);
/* help window with F1 key */

View File

@ -34,8 +34,6 @@
#include "bsddialog_theme.h"
#include "lib_util.h"
extern struct bsddialog_theme t;
int bsddialog_init(void)
{
int i, j, c, error;
@ -59,14 +57,15 @@ int bsddialog_init(void)
c = 1;
error += start_color();
for (i = 0; i < 8; i++)
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
error += init_pair(c, i, j);
c++;
}
}
if (error == OK)
theme = BSDDIALOG_THEME_DEFAULT;
if (error == OK && has_colors())
theme = BSDDIALOG_THEME_FLAT;
else
theme = BSDDIALOG_THEME_BLACKWHITE;

View File

@ -36,10 +36,8 @@
#include "bsddialog_theme.h"
#include "lib_util.h"
#define DEPTHSPACE 4
#define MIN_HEIGHT VBORDERS + 6 /* 2 buttons 1 text 3 menu */
extern struct bsddialog_theme t;
#define DEPTH 2
#define MIN_HEIGHT VBORDERS + 6 /* 2 buttons 1 text 3 menu */
enum menumode {
CHECKLISTMODE,
@ -197,7 +195,7 @@ getnextshortcut(struct bsddialog_conf *conf, int npritems,
if (i > abs)
return (i);
if (i < abs && next == -1)
if (i < abs && next == -1)
next = i;
}
}
@ -221,31 +219,25 @@ getmode(enum menumode mode, struct bsddialog_menugroup group)
}
static void
drawitem(struct bsddialog_conf *conf, WINDOW *pad, int y,
struct lineposition pos, struct privateitem *pritem, bool focus)
drawseparators(struct bsddialog_conf *conf, WINDOW *pad, int linelen,
int nitems, struct privateitem *pritems)
{
int colordesc, colorname, colorshortcut, linech;
unsigned int depth;
enum menumode mode;
const char *prefix, *name, *desc, *bottomdesc, *shortcut;
int i, linech, labellen;
const char *desc, *name;
prefix = pritem->item->prefix;
name = pritem->item->name;
depth = pritem->item->depth;
desc = pritem->item->desc;
bottomdesc = pritem->item->bottomdesc;
mode = pritem->type;
if (mode == SEPARATORMODE) {
for (i = 0; i < nitems; i++) {
if (pritems[i].type != SEPARATORMODE)
continue;
if (conf->no_lines == false) {
wattron(pad, t.menu.desccolor);
linech = conf->ascii_lines ? '-' : ACS_HLINE;
mvwhline(pad, y, 0, linech, pos.line);
mvwhline(pad, i, 0, linech, linelen);
wattroff(pad, t.menu.desccolor);
}
wmove(pad, y,
pos.line/2 - (strlen(name) + strlen(desc)) / 2 );
name = pritems[i].item->name;
desc = pritems[i].item->desc;
labellen = strlen(name) + strlen(desc) + 1;
wmove(pad, i, labellen < linelen ? linelen/2 - labellen/2 : 0);
wattron(pad, t.menu.namesepcolor);
waddstr(pad, name);
wattroff(pad, t.menu.namesepcolor);
@ -254,27 +246,37 @@ drawitem(struct bsddialog_conf *conf, WINDOW *pad, int y,
wattron(pad, t.menu.descsepcolor);
waddstr(pad, desc);
wattroff(pad, t.menu.descsepcolor);
return;
}
}
static void
drawitem(struct bsddialog_conf *conf, WINDOW *pad, int y,
struct lineposition pos, struct privateitem *pritem, bool focus)
{
int colordesc, colorname, colorshortcut;
const char *shortcut;
struct bsddialog_menuitem *item;
item = pritem->item;
/* prefix */
if (prefix != NULL && prefix[0] != '\0')
mvwaddstr(pad, y, 0, prefix);
if (item->prefix != NULL && item->prefix[0] != '\0')
mvwaddstr(pad, y, 0, item->prefix);
/* selector */
wmove(pad, y, pos.xselector);
wattron(pad, t.menu.selectorcolor);
if (mode == CHECKLISTMODE)
wattron(pad, focus ? t.menu.f_selectorcolor : t.menu.selectorcolor);
if (pritem->type == CHECKLISTMODE)
wprintw(pad, "[%c]", pritem->on ? 'X' : ' ');
if (mode == RADIOLISTMODE)
if (pritem->type == RADIOLISTMODE)
wprintw(pad, "(%c)", pritem->on ? '*' : ' ');
wattroff(pad, t.menu.selectorcolor);
wattroff(pad, focus ? t.menu.f_selectorcolor : t.menu.selectorcolor);
/* name */
colorname = focus ? t.menu.f_namecolor : t.menu.namecolor;
if (conf->menu.no_name == false) {
wattron(pad, colorname);
mvwaddstr(pad, y, pos.xname + depth * DEPTHSPACE, name);
mvwaddstr(pad, y, pos.xname + item->depth * DEPTH, item->name);
wattroff(pad, colorname);
}
@ -287,9 +289,10 @@ drawitem(struct bsddialog_conf *conf, WINDOW *pad, int y,
if (conf->menu.no_desc == false) {
wattron(pad, colordesc);
if (conf->menu.no_name)
mvwaddstr(pad, y, pos.xname + depth * DEPTHSPACE, desc);
mvwaddstr(pad, y, pos.xname + item->depth * DEPTH,
item->desc);
else
mvwaddstr(pad, y, pos.xdesc, desc);
mvwaddstr(pad, y, pos.xdesc, item->desc);
wattroff(pad, colordesc);
}
@ -300,10 +303,10 @@ drawitem(struct bsddialog_conf *conf, WINDOW *pad, int y,
wattron(pad, colorshortcut);
if (conf->menu.no_name)
shortcut = desc;
shortcut = item->desc;
else
shortcut = name;
wmove(pad, y, pos.xname + depth * DEPTHSPACE);
shortcut = item->name;
wmove(pad, y, pos.xname + item->depth * DEPTH);
if (shortcut != NULL && shortcut[0] != '\0')
waddch(pad, shortcut[0]);
wattroff(pad, colorshortcut);
@ -312,8 +315,8 @@ drawitem(struct bsddialog_conf *conf, WINDOW *pad, int y,
/* bottom description */
move(SCREENLINES - 1, 2);
clrtoeol();
if (bottomdesc != NULL && focus) {
addstr(bottomdesc);
if (item->bottomdesc != NULL && focus) {
addstr(item->bottomdesc);
refresh();
}
}
@ -329,20 +332,21 @@ menu_autosize(struct bsddialog_conf *conf, int rows, int cols, int *h, int *w,
if (*menurows == BSDDIALOG_AUTOSIZE) {
/* algo 1): grows vertically */
/* notext = 1; */
/* algo 2): grows horizontally, better with little terminals */
/* algo 2): grows horizontally, better with little screens */
notext += nitems;
notext = MIN(notext, widget_max_height(conf) - HBORDERS - 3);
} else
notext += *menurows;
if (cols == BSDDIALOG_AUTOSIZE || rows == BSDDIALOG_AUTOSIZE) {
if (text_size(conf, rows, cols, text, &bs, notext, linelen + 6,
/* cols autosize, rows autosize, rows fullscreen, menu particularity */
if (cols == BSDDIALOG_AUTOSIZE || rows <= BSDDIALOG_AUTOSIZE) {
if (text_size(conf, rows, cols, text, &bs, notext, linelen + 4,
&htext, &wtext) != 0)
return (BSDDIALOG_ERROR);
}
if (cols == BSDDIALOG_AUTOSIZE)
*w = widget_min_width(conf, wtext, linelen + 6, &bs);
*w = widget_min_width(conf, wtext, linelen + 4, &bs);
if (rows == BSDDIALOG_AUTOSIZE) {
if (*menurows == 0) {
@ -362,7 +366,7 @@ menu_autosize(struct bsddialog_conf *conf, int rows, int cols, int *h, int *w,
*menurows = MIN(*h - 6 - htext, (int)*menurows);
} else {
if (*menurows == 0)
*menurows = MIN(rows-6-htext, nitems);
*menurows = MIN(*h-6-htext, nitems);
}
return (0);
@ -376,8 +380,8 @@ menu_checksize(int rows, int cols, const char *text, int menurows, int nitems,
mincols = VBORDERS;
/* buttons */
mincols += bs.nbuttons * bs.sizebutton;
mincols += bs.nbuttons > 0 ? (bs.nbuttons-1) * t.button.space : 0;
mincols += buttons_width(bs);
/*
* linelen check, comment to allow some hidden col otherwise portconfig
* could not show big menus like www/apache24
@ -408,16 +412,16 @@ update_menuwin(struct bsddialog_conf *conf, WINDOW *menuwin, int h, int w,
{
draw_borders(conf, menuwin, h, w, LOWERED);
if (totnitems > (int) menurows) {
wattron(menuwin, t.menu.arrowcolor);
if (totnitems > (int)menurows) {
wattron(menuwin, t.dialog.arrowcolor);
if (ymenupad > 0)
mvwprintw(menuwin, 0, 2, "^^^");
if ((int) (ymenupad + menurows) < totnitems)
if ((ymenupad + (int)menurows) < totnitems)
mvwprintw(menuwin, h-1, 2, "vvv");
wattroff(menuwin, t.menu.arrowcolor);
wattroff(menuwin, t.dialog.arrowcolor);
mvwprintw(menuwin, h-1, w-10, "%3d%%",
100 * (ymenupad + menurows) / totnitems);
@ -440,7 +444,7 @@ do_mixedlist(struct bsddialog_conf *conf, const char *text, int rows, int cols,
shortcut_butts = conf->menu.shortcut_buttons;
automenurows = menurows == BSDDIALOG_AUTOSIZE ? true : false;
automenurows = (menurows == BSDDIALOG_AUTOSIZE) ? true : false;
totnitems = 0;
for (i = 0; i < (int)ngroups; i++) {
@ -466,7 +470,7 @@ do_mixedlist(struct bsddialog_conf *conf, const char *text, int rows, int cols,
}
pos.maxname = conf->menu.no_name ? 0 : pos.maxname;
pos.maxdesc = conf->menu.no_desc ? 0 : pos.maxdesc;
pos.maxdepth *= DEPTHSPACE;
pos.maxdepth = DEPTH * pos.maxdepth;
pos.xselector = pos.maxprefix + (pos.maxprefix != 0 ? 1 : 0);
pos.xname = pos.xselector + pos.selectorlen +
@ -530,6 +534,8 @@ do_mixedlist(struct bsddialog_conf *conf, const char *text, int rows, int cols,
abs++;
}
}
drawseparators(conf, menupad, MIN((int)pos.line, w-6), totnitems,
pritems);
abs = getfirst_with_default(totnitems, pritems, ngroups, groups,
focuslist, focusitem);
if (abs >= 0)
@ -596,7 +602,8 @@ do_mixedlist(struct bsddialog_conf *conf, const char *text, int rows, int cols,
}
break;
case KEY_F(1):
if (conf->f1_file == NULL && conf->f1_message == NULL)
if (conf->key.f1_file == NULL &&
conf->key.f1_message == NULL)
break;
if (f1help(conf) != 0)
return (BSDDIALOG_ERROR);
@ -644,6 +651,9 @@ do_mixedlist(struct bsddialog_conf *conf, const char *text, int rows, int cols,
xe = xs + w - 5;
}
drawseparators(conf, menupad, MIN((int)pos.line, w-6),
totnitems, pritems);
if ((int)(ymenupad + menurows) - 1 < abs)
ymenupad = abs - menurows + 1;
prefresh(menupad, ymenupad, 0, ys, xs, ye, xe);
@ -695,7 +705,7 @@ do_mixedlist(struct bsddialog_conf *conf, const char *text, int rows, int cols,
drawitem(conf, menupad, i, pos,
&pritems[i], false);
}
}
}
pritems[abs].on = !pritems[abs].on;
}
drawitem(conf, menupad, abs, pos, &pritems[abs], true);
@ -806,4 +816,4 @@ bsddialog_radiolist(struct bsddialog_conf *conf, const char *text, int rows,
1, &group, &focuslist, focusitem);
return (output);
}
}

View File

@ -31,11 +31,8 @@
#include <string.h>
#include "bsddialog.h"
#include "bsddialog_theme.h"
#include "lib_util.h"
extern struct bsddialog_theme t;
static int
message_autosize(struct bsddialog_conf *conf, int rows, int cols, int *h,
int *w, const char *text, struct buttons bs)
@ -62,8 +59,7 @@ static int message_checksize(int rows, int cols, struct buttons bs)
int mincols;
mincols = VBORDERS;
mincols += bs.nbuttons * bs.sizebutton;
mincols += bs.nbuttons > 0 ? (bs.nbuttons-1) * t.button.space : 0;
mincols += buttons_width(bs);
if (cols < mincols)
RETURN_ERROR("Few cols, Msgbox and Yesno need at least width "
@ -153,7 +149,8 @@ do_message(struct bsddialog_conf *conf, const char *text, int rows, int cols,
}
break;
case KEY_F(1):
if (conf->f1_file == NULL && conf->f1_message == NULL)
if (conf->key.f1_file == NULL &&
conf->key.f1_message == NULL)
break;
if (f1help(conf) != 0)
return (BSDDIALOG_ERROR);

View File

@ -34,8 +34,6 @@
#include "bsddialog_theme.h"
#include "lib_util.h"
extern struct bsddialog_theme t;
static void
textbox_autosize(struct bsddialog_conf *conf, int rows, int cols, int *h,
int *w, int hpad, int wpad, struct buttons bs)
@ -177,7 +175,8 @@ bsddialog_textbox(struct bsddialog_conf *conf, const char* file, int rows,
ypad = ypad + printrows <= hpad -1 ? ypad + 1 : ypad;
break;
case KEY_F(1):
if (conf->f1_file == NULL && conf->f1_message == NULL)
if (conf->key.f1_file == NULL &&
conf->key.f1_message == NULL)
break;
if (f1help(conf) != 0)
return (BSDDIALOG_ERROR);

View File

@ -50,13 +50,14 @@ static struct bsddialog_theme bsddialogtheme = {
.dialog.linelowercolor = GET_COLOR(COLOR_BLACK, bgwidget),
.dialog.color = GET_COLOR(COLOR_BLACK, bgwidget),
.dialog.bottomtitlecolor = GET_COLOR(COLOR_BLACK, bgwidget),
.dialog.arrowcolor = GET_COLOR(COLOR_YELLOW, bgwidget),
.menu.arrowcolor = GET_COLOR(COLOR_YELLOW, bgwidget),
.menu.selectorcolor = GET_COLOR(COLOR_BLACK, bgwidget) | A_BOLD,
.menu.f_selectorcolor = GET_COLOR(COLOR_BLACK, bgcurr),
.menu.selectorcolor = GET_COLOR(COLOR_BLACK, bgwidget),
.menu.f_desccolor = GET_COLOR(COLOR_WHITE, bgcurr),
.menu.desccolor = GET_COLOR(COLOR_BLACK, bgwidget),
.menu.f_namecolor = GET_COLOR(COLOR_BLACK, bgcurr),
.menu.namecolor = GET_COLOR(COLOR_YELLOW, bgwidget),
.menu.namecolor = GET_COLOR(COLOR_BLACK, bgwidget),
.menu.namesepcolor = GET_COLOR(COLOR_YELLOW, bgwidget),
.menu.descsepcolor = GET_COLOR(COLOR_YELLOW, bgwidget),
.menu.f_shortcutcolor = GET_COLOR(COLOR_RED, bgcurr),
@ -69,15 +70,15 @@ static struct bsddialog_theme bsddialogtheme = {
.bar.f_color = GET_COLOR(COLOR_WHITE, COLOR_BLUE),
.bar.color = GET_COLOR(COLOR_BLUE, COLOR_WHITE),
.button.space = 3,
.button.leftch = '[',
.button.rightch = ']',
.button.f_delimcolor = GET_COLOR(COLOR_WHITE, bgcurr),
.button.hmargin = 3,
.button.leftdelim = '[',
.button.rightdelim = ']',
.button.f_delimcolor = GET_COLOR(COLOR_BLACK, bgwidget),
.button.delimcolor = GET_COLOR(COLOR_BLACK, bgwidget),
.button.f_color = GET_COLOR(COLOR_WHITE, bgcurr) | A_UNDERLINE,
.button.color = GET_COLOR(COLOR_BLACK, bgwidget) | A_UNDERLINE,
.button.f_shortcutcolor = GET_COLOR(COLOR_BLACK, bgcurr) | A_UNDERLINE,
.button.shortcutcolor = GET_COLOR(COLOR_YELLOW, bgwidget) | A_UNDERLINE
.button.f_color = GET_COLOR(COLOR_BLACK, bgcurr) | A_UNDERLINE,
.button.color = GET_COLOR(COLOR_BLACK, bgwidget) | A_UNDERLINE,
.button.f_shortcutcolor = GET_COLOR(COLOR_RED, bgcurr) | A_UNDERLINE,
.button.shortcutcolor = GET_COLOR(COLOR_RED, bgwidget) | A_UNDERLINE
};
static struct bsddialog_theme blackwhite = {
@ -95,8 +96,9 @@ static struct bsddialog_theme blackwhite = {
.dialog.linelowercolor = GET_COLOR(fg, bk),
.dialog.color = GET_COLOR(fg, bk),
.dialog.bottomtitlecolor = GET_COLOR(fg, bk),
.dialog.arrowcolor = GET_COLOR(fg, bk),
.menu.arrowcolor = GET_COLOR(fg, bk),
.menu.f_selectorcolor = GET_COLOR(fg, bk) | A_REVERSE,
.menu.selectorcolor = GET_COLOR(fg, bk),
.menu.f_desccolor = GET_COLOR(fg, bk) | A_REVERSE,
.menu.desccolor = GET_COLOR(fg, bk),
@ -114,9 +116,9 @@ static struct bsddialog_theme blackwhite = {
.bar.f_color = GET_COLOR(fg, bk) | A_REVERSE,
.bar.color = GET_COLOR(fg, bk),
.button.space = 3,
.button.leftch = '[',
.button.rightch = ']',
.button.hmargin = 3,
.button.leftdelim = '[',
.button.rightdelim = ']',
.button.f_delimcolor = GET_COLOR(fg, bk),
.button.delimcolor = GET_COLOR(fg, bk),
.button.f_color = GET_COLOR(fg, bk) | A_UNDERLINE | A_REVERSE,
@ -138,12 +140,13 @@ static struct bsddialog_theme dialogtheme = {
.dialog.linelowercolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE) | A_BOLD,
.dialog.color = GET_COLOR(COLOR_BLACK, COLOR_WHITE),
.dialog.bottomtitlecolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE) | A_BOLD,
.dialog.arrowcolor = GET_COLOR(COLOR_GREEN, COLOR_WHITE),
.menu.arrowcolor = GET_COLOR(COLOR_GREEN, COLOR_WHITE),
.menu.f_selectorcolor = GET_COLOR(COLOR_WHITE, COLOR_BLUE),
.menu.selectorcolor = GET_COLOR(COLOR_BLACK, bgwidget),
.menu.f_desccolor = GET_COLOR(COLOR_WHITE, COLOR_BLUE),
.menu.desccolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE),
.menu.f_namecolor = GET_COLOR(COLOR_YELLOW, COLOR_BLUE),
.menu.f_namecolor = GET_COLOR(COLOR_WHITE, COLOR_BLUE),
.menu.namecolor = GET_COLOR(COLOR_BLUE, COLOR_WHITE),
.menu.namesepcolor = GET_COLOR(COLOR_RED, COLOR_WHITE),
.menu.descsepcolor = GET_COLOR(COLOR_RED, COLOR_WHITE),
@ -157,9 +160,9 @@ static struct bsddialog_theme dialogtheme = {
.bar.f_color = GET_COLOR(COLOR_WHITE, COLOR_BLUE) | A_BOLD,
.bar.color = GET_COLOR(COLOR_BLUE, COLOR_WHITE) | A_BOLD,
.button.space = 3,
.button.leftch = '<',
.button.rightch = '>',
.button.hmargin = 3,
.button.leftdelim = '<',
.button.rightdelim = '>',
.button.f_delimcolor = GET_COLOR(COLOR_WHITE, COLOR_BLUE) | A_BOLD,
.button.delimcolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE),
.button.f_color = GET_COLOR(COLOR_YELLOW, COLOR_BLUE) | A_BOLD,
@ -183,8 +186,9 @@ set_theme(struct bsddialog_theme *dst, struct bsddialog_theme *src)
dst->dialog.linelowercolor = src->dialog.linelowercolor;
dst->dialog.color = src->dialog.color;
dst->dialog.bottomtitlecolor = src->dialog.bottomtitlecolor;
dst->dialog.arrowcolor = src->dialog.arrowcolor;
dst->menu.arrowcolor = src->menu.arrowcolor;
dst->menu.f_selectorcolor = src->menu.f_selectorcolor;
dst->menu.selectorcolor = src->menu.selectorcolor;
dst->menu.f_desccolor = src->menu.f_desccolor;
dst->menu.desccolor = src->menu.desccolor;
@ -202,9 +206,9 @@ set_theme(struct bsddialog_theme *dst, struct bsddialog_theme *src)
dst->bar.f_color = src->bar.f_color;
dst->bar.color = src->bar.color;
dst->button.space = src->button.space;
dst->button.leftch = src->button.leftch;
dst->button.rightch = src->button.rightch;
dst->button.hmargin = src->button.hmargin;
dst->button.leftdelim = src->button.leftdelim;
dst->button.rightdelim = src->button.rightdelim;
dst->button.f_delimcolor = src->button.f_delimcolor;
dst->button.delimcolor = src->button.delimcolor;
dst->button.f_color = src->button.f_color;
@ -244,12 +248,12 @@ int bsddialog_set_theme(struct bsddialog_theme *theme)
int bsddialog_set_default_theme(enum bsddialog_default_theme newtheme)
{
if (newtheme == BSDDIALOG_THEME_DEFAULT) {
if (newtheme == BSDDIALOG_THEME_FLAT) {
bsddialog_set_theme(&dialogtheme);
t.dialog.lineraisecolor = t.dialog.linelowercolor;
t.dialog.delimtitle = true;
t.button.leftch = '[';
t.button.rightch = ']';
t.button.leftdelim = '[';
t.button.rightdelim = ']';
}
else if (newtheme == BSDDIALOG_THEME_BSDDIALOG)
bsddialog_set_theme(&bsddialogtheme);
@ -277,4 +281,4 @@ bsddialog_color(enum bsddialog_color foreground,
cursesflags |= A_UNDERLINE;
return (GET_COLOR(foreground, background) | cursesflags);
}
}

View File

@ -32,14 +32,11 @@
#include <string.h>
#include "bsddialog.h"
#include "bsddialog_theme.h"
#include "lib_util.h"
#define MINWDATE 23 /* 3 windows and their borders */
#define MINWTIME 14 /* 3 windows and their borders */
extern struct bsddialog_theme t;
static int
datetime_autosize(struct bsddialog_conf *conf, int rows, int cols, int *h,
int *w, int minw, const char *text, struct buttons bs)
@ -67,8 +64,7 @@ datetime_checksize(int rows, int cols, int minw, struct buttons bs)
int mincols;
mincols = VBORDERS;
mincols += bs.nbuttons * bs.sizebutton;
mincols += bs.nbuttons > 0 ? (bs.nbuttons-1) * t.button.space : 0;
mincols += buttons_width(bs);
mincols = MAX(minw, mincols);
if (cols < mincols)
@ -84,7 +80,7 @@ int
bsddialog_timebox(struct bsddialog_conf *conf, const char* text, int rows,
int cols, unsigned int *hh, unsigned int *mm, unsigned int *ss)
{
bool loop;
bool loop, focusbuttons;
int i, input, output, y, x, h, w, sel;
WINDOW *widget, *textpad, *shadow;
struct buttons bs;
@ -135,27 +131,25 @@ bsddialog_timebox(struct bsddialog_conf *conf, const char* text, int rows,
wrefresh(widget);
sel = 0;
curs_set(2);
loop = true;
loop = focusbuttons = true;
while (loop) {
for (i = 0; i < 3; i++) {
mvwprintw(c[i].win, 1, 1, "%2d", c[i].value);
wrefresh(c[i].win);
}
wmove(c[sel].win, 1, 2);
wrefresh(c[sel].win);
if (focusbuttons == false) {
wmove(c[sel].win, 1, 2);
wrefresh(c[sel].win);
}
input = getch();
switch(input) {
case KEY_ENTER:
case 10: /* Enter */
if (focusbuttons == false)
break;
output = bs.value[bs.curr];
if (output == BSDDIALOG_OK) {
*hh = c[0].value;
*mm = c[1].value;
*ss = c[2].value;
}
loop = false;
break;
case 27: /* Esc */
@ -164,32 +158,66 @@ bsddialog_timebox(struct bsddialog_conf *conf, const char* text, int rows,
loop = false;
}
break;
case KEY_RIGHT:
case '\t': /* TAB */
bs.curr = (bs.curr + 1) % bs.nbuttons;
if (focusbuttons) {
bs.curr++;
focusbuttons = bs.curr < (int)bs.nbuttons ?
true : false;
if (focusbuttons == false) {
curs_set(1);
sel = 0;
}
} else {
sel++;
focusbuttons = sel > 2 ? true : false;
if (focusbuttons) {
curs_set(0);
bs.curr = 0;
}
}
draw_buttons(widget, bs, true);
wrefresh(widget);
break;
case KEY_LEFT:
sel = sel == 0 ? 2 : (sel - 1);
break;
case KEY_RIGHT:
sel = (sel + 1) % 3;
if (focusbuttons) {
bs.curr--;
focusbuttons = bs.curr < 0 ? false : true;
if (focusbuttons == false) {
curs_set(1);
sel = 2;
}
} else {
sel--;
focusbuttons = sel < 0 ? true : false;
if (focusbuttons) {
curs_set(0);
bs.curr = (int)bs.nbuttons - 1;
}
}
draw_buttons(widget, bs, true);
wrefresh(widget);
break;
case KEY_UP:
c[sel].value = c[sel].value < c[sel].max ?
c[sel].value + 1 : 0;
break;
case KEY_DOWN:
if (focusbuttons)
break;
c[sel].value = c[sel].value > 0 ?
c[sel].value - 1 : c[sel].max;
break;
case KEY_DOWN:
if (focusbuttons)
break;
c[sel].value = c[sel].value < c[sel].max ?
c[sel].value + 1 : 0;
break;
case KEY_F(1):
if (conf->f1_file == NULL && conf->f1_message == NULL)
if (conf->key.f1_file == NULL &&
conf->key.f1_message == NULL)
break;
curs_set(0);
if (f1help(conf) != 0)
return (BSDDIALOG_ERROR);
curs_set(2);
curs_set(1);
/* No break, screen size can change */
case KEY_RESIZE:
/* Important for decreasing screen */
@ -244,6 +272,12 @@ bsddialog_timebox(struct bsddialog_conf *conf, const char* text, int rows,
}
}
if (output == BSDDIALOG_OK) {
*hh = c[0].value;
*mm = c[1].value;
*ss = c[2].value;
}
curs_set(0);
for (i = 0; i < 3; i++)
@ -257,7 +291,7 @@ int
bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
int cols, unsigned int *yy, unsigned int *mm, unsigned int *dd)
{
bool loop;
bool loop, focusbuttons;
int i, input, output, y, x, h, w, sel;
WINDOW *widget, *textpad, *shadow;
struct buttons bs;
@ -268,7 +302,7 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
unsigned int x;
};
struct month {
char *name;
const char *name;
unsigned int days;
};
@ -329,9 +363,7 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
wrefresh(widget);
sel = 2;
curs_set(2);
loop = true;
loop = focusbuttons = true;
while (loop) {
mvwprintw(c[0].win, 1, 1, "%4d", c[0].value);
mvwprintw(c[1].win, 1, 1, "%9s", m[c[1].value-1].name);
@ -339,19 +371,18 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
for (i = 0; i < 3; i++) {
wrefresh(c[i].win);
}
wmove(c[sel].win, 1, c[sel].x);
wrefresh(c[sel].win);
if (focusbuttons == false) {
wmove(c[sel].win, 1, c[sel].x);
wrefresh(c[sel].win);
}
input = getch();
switch(input) {
case KEY_ENTER:
case 10: /* Enter */
if (focusbuttons == false)
break;
output = bs.value[bs.curr];
if (output == BSDDIALOG_OK) {
*yy = c[0].value;
*mm = c[1].value;
*dd = c[2].value;
}
loop = false;
break;
case 27: /* Esc */
@ -360,18 +391,49 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
loop = false;
}
break;
case KEY_RIGHT:
case '\t': /* TAB */
bs.curr = (bs.curr + 1) % bs.nbuttons;
if (focusbuttons) {
bs.curr++;
focusbuttons = bs.curr < (int)bs.nbuttons ?
true : false;
if (focusbuttons == false) {
curs_set(1);
sel = 0;
}
} else {
sel++;
focusbuttons = sel > 2 ? true : false;
if (focusbuttons) {
curs_set(0);
bs.curr = 0;
}
}
draw_buttons(widget, bs, true);
wrefresh(widget);
break;
case KEY_LEFT:
sel = sel == 0 ? 2 : (sel - 1);
break;
case KEY_RIGHT:
sel = (sel + 1) % 3;
if (focusbuttons) {
bs.curr--;
focusbuttons = bs.curr < 0 ? false : true;
if (focusbuttons == false) {
curs_set(1);
sel = 2;
}
} else {
sel--;
focusbuttons = sel < 0 ? true : false;
if (focusbuttons) {
curs_set(0);
bs.curr = (int)bs.nbuttons - 1;
}
}
draw_buttons(widget, bs, true);
wrefresh(widget);
break;
case KEY_UP:
if (focusbuttons)
break;
c[sel].value = c[sel].value > 1 ?
c[sel].value - 1 : c[sel].max ;
/* if mount change */
@ -384,6 +446,8 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
c[2].value = c[2].max;
break;
case KEY_DOWN:
if (focusbuttons)
break;
c[sel].value = c[sel].value < c[sel].max ?
c[sel].value + 1 : 1;
/* if mount change */
@ -396,12 +460,13 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
c[2].value = c[2].max;
break;
case KEY_F(1):
if (conf->f1_file == NULL && conf->f1_message == NULL)
if (conf->key.f1_file == NULL &&
conf->key.f1_message == NULL)
break;
curs_set(0);
if (f1help(conf) != 0)
return (BSDDIALOG_ERROR);
curs_set(2);
curs_set(1);
/* No break, screen size can change */
case KEY_RESIZE:
/* Important for decreasing screen */
@ -455,6 +520,12 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
}
}
if (output == BSDDIALOG_OK) {
*yy = c[0].value;
*mm = c[1].value;
*dd = c[2].value;
}
curs_set(0);
for (i = 0; i < 3; i++)
@ -462,4 +533,4 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
end_dialog(conf, shadow, widget, textpad);
return (output);
}
}