bsddialog: import snapshot 0.0.2
This commit is contained in:
parent
e41955dd2d
commit
77a55d2c3b
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,6 +1,7 @@
|
||||
bsddialog
|
||||
*.o
|
||||
*~
|
||||
*.a
|
||||
examples_library/buildlist
|
||||
examples_library/checklist
|
||||
examples_library/datebox
|
||||
@ -22,4 +23,4 @@ lib/libbsddialog.so*
|
||||
BSDDIALOG.geany
|
||||
BSDDIALOG.tags
|
||||
*.core
|
||||
bsdinstall/*
|
||||
freebsd-lab/
|
||||
|
32
bsddialog.1
32
bsddialog.1
@ -27,15 +27,25 @@
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm bsddialog
|
||||
.Nd build dialogs and widgets with a TUI
|
||||
.Nd terminal dialogs and widgets
|
||||
.Sh SYNOPSIS
|
||||
.Nm bsddialog
|
||||
.Op Fl options
|
||||
.Ar
|
||||
.Fl -help
|
||||
.Nm bsddialog
|
||||
.Fl -version
|
||||
.Nm bsddialog
|
||||
.Op Fl Ar -common-opts
|
||||
.Fl Ar -widget
|
||||
.Fl Artext
|
||||
.Fl Arheight
|
||||
.Fl Arwidth
|
||||
.Op Fl Ar -widget-opts
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
utility processes files ...
|
||||
.Nm BSDDialog
|
||||
is an utility to write a script with a Text User Interface. It can build
|
||||
dialogs and widgets: to show messages, to get input and to inform about a
|
||||
computation status.
|
||||
.\" .Sh ENVIRONMENT
|
||||
.\" For sections 1, 6, 7, and 8 only.
|
||||
.\" .Sh FILES
|
||||
@ -44,9 +54,13 @@ utility processes files ...
|
||||
.\" .Sh EXAMPLES
|
||||
.\" .Sh DIAGNOSTICS
|
||||
.\" For sections 1, 4, 6, 7, 8, and 9 printf/stderr messages only.
|
||||
.\" .Sh SEE ALSO
|
||||
.\" .Xr foobar 1
|
||||
.Sh SEE ALSO
|
||||
.Xr bsddialog 3
|
||||
.\" .Sh HISTORY
|
||||
.\" .Sh AUTHORS
|
||||
.\" .Sh CAVEATS
|
||||
.\" .Sh BUGS
|
||||
.Sh CAVEATS
|
||||
autosize
|
||||
compatibility text
|
||||
.Sh BUGS
|
||||
buildlist
|
||||
forms
|
||||
|
38
bsddialog.c
38
bsddialog.c
@ -66,6 +66,7 @@ enum OPTS {
|
||||
HLINE,
|
||||
IGNORE,
|
||||
INSECURE,
|
||||
ITEM_DEPTH,
|
||||
ITEM_HELP,
|
||||
ITEM_PREFIX,
|
||||
MAX_INPUT,
|
||||
@ -128,7 +129,7 @@ static char *nostring = "";
|
||||
/* Menus flags and options */
|
||||
static bool item_prefix_flag, item_bottomdesc_flag, item_output_sepnl_flag;
|
||||
static bool item_singlequote_flag, list_items_on_flag, item_tag_help_flag;
|
||||
static bool item_always_quote_flag;
|
||||
static bool item_always_quote_flag, item_depth_flag;
|
||||
static char *item_output_sep_flag;
|
||||
/* Time and calendar options */
|
||||
static char *date_fmt_flag, *time_fmt_flag;
|
||||
@ -227,8 +228,9 @@ void usage(void)
|
||||
"--exit-label <label>, --extra-button, --extra-label <label>,"
|
||||
"--hfile <filename>, --help-button, --help-label <label>, "
|
||||
"--help-status, --help-tags, --hline string, --ignore, "
|
||||
"--insecure, --item-help, --items-prefix, --max-input <size>, "
|
||||
"--no-cancel, --nocancel, --no-label <label>, --no-items, "
|
||||
"--insecure, --item-depth, --item-help, --items-prefix, "
|
||||
"--max-input <size>, --no-cancel, --nocancel, "
|
||||
"--no-label <label>, --no-items, "
|
||||
"--no-lines, --no-ok, --nook, --no-shadow, --no-tags, "
|
||||
"--ok-label <label>, --output-fd <fd>, "
|
||||
"--output-separator <sep>, --print-version, --print-size, "
|
||||
@ -271,8 +273,6 @@ void usage(void)
|
||||
"--treeview <text> <rows> <cols> <menurows> [<depth> <name> "
|
||||
"<desc> <on|off> ...]\n"
|
||||
"--yesno <text> <rows> <cols>\n");
|
||||
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[argc])
|
||||
@ -297,7 +297,7 @@ int main(int argc, char *argv[argc])
|
||||
cr_wrap_flag = no_collapse_flag = no_nl_expand_flag = trim_flag = false;
|
||||
|
||||
item_output_sepnl_flag = item_singlequote_flag = false;
|
||||
item_prefix_flag = item_bottomdesc_flag = false;
|
||||
item_prefix_flag = item_bottomdesc_flag = item_depth_flag = false;
|
||||
list_items_on_flag = item_tag_help_flag = false;
|
||||
item_always_quote_flag = false;
|
||||
item_output_sep_flag = NULL;
|
||||
@ -334,6 +334,7 @@ int main(int argc, char *argv[argc])
|
||||
{"hline", required_argument, NULL, HLINE },
|
||||
{"ignore", no_argument, NULL, IGNORE },
|
||||
{"insecure", no_argument, NULL, INSECURE },
|
||||
{"item-depth", no_argument, NULL, ITEM_DEPTH },
|
||||
{"item-help", no_argument, NULL, ITEM_HELP },
|
||||
{"item-prefix", no_argument, NULL, ITEM_PREFIX },
|
||||
{"max-input", required_argument, NULL, MAX_INPUT },
|
||||
@ -485,6 +486,9 @@ int main(int argc, char *argv[argc])
|
||||
case INSECURE:
|
||||
conf.form.securech = '*';
|
||||
break;
|
||||
case ITEM_DEPTH:
|
||||
item_depth_flag = true;
|
||||
break;
|
||||
case ITEM_HELP:
|
||||
item_bottomdesc_flag = true;
|
||||
break;
|
||||
@ -1080,8 +1084,9 @@ int checklist_builder(BUILDER_ARGS)
|
||||
|
||||
menurows = atoi(argv[0]);
|
||||
|
||||
output = get_menu_items(errbuf, argc-1, argv+1, item_prefix_flag, false,
|
||||
true, true, true, item_bottomdesc_flag, &nitems, items);
|
||||
output = get_menu_items(errbuf, argc-1, argv+1, item_prefix_flag,
|
||||
item_depth_flag, true, true, true, item_bottomdesc_flag, &nitems,
|
||||
items);
|
||||
if (output != 0)
|
||||
return (output);
|
||||
|
||||
@ -1105,8 +1110,9 @@ int menu_builder(BUILDER_ARGS)
|
||||
|
||||
menurows = atoi(argv[0]);
|
||||
|
||||
output = get_menu_items(errbuf, argc-1, argv+1, item_prefix_flag, false,
|
||||
true, true, false, item_bottomdesc_flag, &nitems, items);
|
||||
output = get_menu_items(errbuf, argc-1, argv+1, item_prefix_flag,
|
||||
item_depth_flag, true, true, false, item_bottomdesc_flag, &nitems,
|
||||
items);
|
||||
if (output != 0)
|
||||
return (output);
|
||||
|
||||
@ -1130,8 +1136,9 @@ int radiolist_builder(BUILDER_ARGS)
|
||||
|
||||
menurows = atoi(argv[0]);
|
||||
|
||||
output = get_menu_items(errbuf, argc-1, argv+1, item_prefix_flag, false,
|
||||
true, true, true, item_bottomdesc_flag, &nitems, items);
|
||||
output = get_menu_items(errbuf, argc-1, argv+1, item_prefix_flag,
|
||||
item_depth_flag, true, true, true, item_bottomdesc_flag, &nitems,
|
||||
items);
|
||||
if (output != 0)
|
||||
return (output);
|
||||
|
||||
@ -1220,6 +1227,8 @@ int form_builder(BUILDER_ARGS)
|
||||
|
||||
flags |= (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0);
|
||||
items[i].flags = flags;
|
||||
|
||||
items[i].bottomdesc = nostring;
|
||||
}
|
||||
|
||||
output = bsddialog_form(&conf, text, rows, cols, formheight, nitems,
|
||||
@ -1243,6 +1252,7 @@ int inputbox_builder(BUILDER_ARGS)
|
||||
item.fieldlen = cols > 4 ? cols-4 : 25;
|
||||
item.maxvaluelen = max_input_form_flag > 0 ? max_input_form_flag : 2048;
|
||||
item.flags = 0;
|
||||
item.bottomdesc = nostring;
|
||||
|
||||
output = bsddialog_form(&conf, text, rows, cols, 1, 1, &item);
|
||||
print_form_items(&conf, output, 1, &item);
|
||||
@ -1276,6 +1286,7 @@ int mixedform_builder(BUILDER_ARGS)
|
||||
items[i].fieldlen = atoi(argv[9*i+6]);
|
||||
items[i].maxvaluelen = atoi(argv[9*i+7]);
|
||||
items[i].flags = atoi(argv[9*i+8]);
|
||||
items[i].bottomdesc = nostring;
|
||||
}
|
||||
|
||||
output = bsddialog_form(&conf, text, rows, cols, formheight, nitems,
|
||||
@ -1299,6 +1310,7 @@ int passwordbox_builder(BUILDER_ARGS)
|
||||
item.fieldlen = cols > 4 ? cols-4 : 25;
|
||||
item.maxvaluelen = max_input_form_flag > 0 ? max_input_form_flag : 2048;
|
||||
item.flags = BSDDIALOG_FIELDHIDDEN;
|
||||
item.bottomdesc = nostring;
|
||||
|
||||
output = bsddialog_form(&conf, text, rows, cols, 1, 1, &item);
|
||||
print_form_items(&conf, output, 1, &item);
|
||||
@ -1339,6 +1351,8 @@ int passwordform_builder(BUILDER_ARGS)
|
||||
|
||||
flags |= (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0);
|
||||
items[i].flags = flags;
|
||||
|
||||
items[i].bottomdesc = nostring;
|
||||
}
|
||||
|
||||
output = bsddialog_form(&conf, text, rows, cols, formheight,
|
||||
|
@ -8,16 +8,17 @@
|
||||
* <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
*/
|
||||
|
||||
#include <bsddialog.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <bsddialog.h>
|
||||
|
||||
/* Figure 15 - https://docs.freebsd.org/en/books/handbook/bsdinstall/ */
|
||||
int main()
|
||||
{
|
||||
int i, output;
|
||||
struct bsddialog_conf conf;
|
||||
char *text = "Please review the disk setup. When complete, press the "
|
||||
"Finish button";
|
||||
struct bsddialog_menuitem items[5] = {
|
||||
{"", false, 0, "ada0", "16 GB GPT", ""},
|
||||
{"", false, 1, "ada0p1", "512 KB freebsd-boot", ""},
|
||||
@ -25,34 +26,25 @@ int main()
|
||||
{"", false, 1, "ada0p3", "819 MB freebsd-swap none", ""},
|
||||
{"", false, 0, "ada1", "16 GB", ""}
|
||||
};
|
||||
|
||||
|
||||
bsddialog_initconf(&conf);
|
||||
conf.title = "Partition Editor";
|
||||
char *text = "Please review the disk setup. When complete, press the "\
|
||||
"Finish button";
|
||||
|
||||
conf.menu.align_left = true;
|
||||
|
||||
conf.button.ok_label = "Create";
|
||||
|
||||
conf.button.with_extra = true;
|
||||
conf.button.extra_label = "Delete";
|
||||
|
||||
conf.button.cancel_label = "Cancel";
|
||||
|
||||
conf.button.with_help = true;
|
||||
conf.button.help_label = "Revert";
|
||||
|
||||
conf.title = "Partition Editor";
|
||||
conf.menu.shortcut_buttons = true;
|
||||
conf.menu.align_left = true;
|
||||
conf.button.ok_label = "Create";
|
||||
conf.button.with_extra = true;
|
||||
conf.button.extra_label = "Delete";
|
||||
conf.button.cancel_label = "Cancel";
|
||||
conf.button.with_help = true;
|
||||
conf.button.help_label = "Revert";
|
||||
conf.button.generic1_label = "Auto";
|
||||
conf.button.generic2_label = "Finish";
|
||||
conf.button.default_label = "Finish";
|
||||
|
||||
conf.button.default_label= "Finish";
|
||||
|
||||
if (bsddialog_init() < 0)
|
||||
return -1;
|
||||
|
||||
if (bsddialog_init() == BSDDIALOG_ERROR)
|
||||
return (1);
|
||||
output = bsddialog_menu(&conf, text, 20, 0, 10, 5, items, NULL);
|
||||
|
||||
bsddialog_end();
|
||||
|
||||
printf("Menu:\n");
|
||||
@ -60,5 +52,5 @@ int main()
|
||||
printf(" [%c] %s\n", items[i].on ? 'X' : ' ', items[i].name);
|
||||
|
||||
|
||||
return output;
|
||||
return (output);
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ do
|
||||
"Label 8" 7 \
|
||||
"Label 9" 9 \
|
||||
"Label 10" 10 \
|
||||
"Label X" " -$perc"
|
||||
"Label X" " -$perc"
|
||||
#sleep 1
|
||||
done
|
||||
|
||||
|
@ -3,10 +3,10 @@
|
||||
#
|
||||
# Written in 2021 by Alfonso Sabato Siciliano
|
||||
|
||||
VERSION = 0.1
|
||||
VERSION = 0.0.2
|
||||
LIBRARY = bsddialog
|
||||
LIBRARY_SO = lib${LIBRARY:=.so}
|
||||
HEADERS = bsddialog.h bsddialog_theme.h
|
||||
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)
|
||||
|
41
lib/Makefile
41
lib/Makefile
@ -3,44 +3,43 @@
|
||||
#
|
||||
# Written in 2021 by Alfonso Sabato Siciliano
|
||||
|
||||
VERSION = 0.0.1
|
||||
VERSION = 0.0.2
|
||||
LIBRARY = bsddialog
|
||||
LIBRARY_SO = lib${LIBRARY:=.so}
|
||||
HEADERS = bsddialog.h bsddialog_theme.h
|
||||
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}
|
||||
FBSDFLAGS= -O2 -pipe -std=gnu99 -Wno-format-zero-length \
|
||||
-fstack-protector-strong -Qunused-arguments
|
||||
CFLAGS = -fPIC -Wall -Wextra
|
||||
.if defined(DEBUG)
|
||||
CFLAGS += -g
|
||||
.else
|
||||
CFLAGS += ${FBSDFLAGS}
|
||||
.endif
|
||||
CFLAGS = -I/usr/local/include -fPIC -Wall -Wextra
|
||||
LDFLAGS = -fstack-protector-strong -shared -Wl,-x -Wl,--fatal-warnings \
|
||||
-Wl,--warn-shared-textrel -Wl,-soname,${LIBRARY_SO}.${VERSION}
|
||||
|
||||
.if defined(DEBUG)
|
||||
# `make -DDEBUG`
|
||||
CFLAGS += -g
|
||||
.else
|
||||
CFLAGS += -O2 -pipe -std=gnu99 -Wno-format-zero-length \
|
||||
-fstack-protector-strong -Qunused-arguments
|
||||
.endif
|
||||
|
||||
.if defined(PORTNCURSES)
|
||||
# PORT ncurses `make -DPORTNCURSES`
|
||||
CFLAGS += -DPORTNCURSES -I/usr/local/include
|
||||
LDFLAGS += -L/usr/local/lib -lformw -lncursesw -ltinfow
|
||||
.else
|
||||
# BASE ncurses
|
||||
LDFLAGS += -L/usr/lib -lformw -lncursesw -ltinfow
|
||||
.endif
|
||||
|
||||
INSTALL_PREFIX=/usr/local
|
||||
LN = ln -s -f
|
||||
RM = rm -f
|
||||
CP = cp
|
||||
GZIP = gzip -cn
|
||||
LDCONFIG = /sbin/ldconfig -m
|
||||
|
||||
.if defined(PORTNCURSES)
|
||||
# PORT ncurses `make -DPORTNCURSES`
|
||||
CFLAGS += -DPORTNCURSES -I/usr/local/include
|
||||
LDFLAGS += -L/usr/local/lib -lform -lncurses -ltinfo
|
||||
.else
|
||||
# BASE ncurses
|
||||
LDFLAGS += -L/usr/lib -lform -lncurses -ltinfo
|
||||
.endif
|
||||
|
||||
MAN= ${OUTPUT}.3
|
||||
GZIP= gzip -cn
|
||||
MANDIR= /usr/local/share/man/man3
|
||||
|
||||
INSTALL= install
|
||||
RM= rm -f
|
||||
|
||||
|
169
lib/barbox.c
169
lib/barbox.c
@ -28,16 +28,17 @@
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef PORTNCURSES
|
||||
#include <ncurses/ncurses.h>
|
||||
#else
|
||||
#include <ncurses.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "bsddialog.h"
|
||||
#include "bsddialog_progressview.h"
|
||||
#include "lib_util.h"
|
||||
#include "bsddialog_theme.h"
|
||||
|
||||
@ -46,7 +47,11 @@
|
||||
#define MINWIDTH (VBORDERS + MINBARWIDTH + BARMARGIN * 2)
|
||||
#define MINHEIGHT 7 /* without text */
|
||||
|
||||
/* "Bar": gauge - mixedgauge - rangebox - pause */
|
||||
/* "Bar": gauge - mixedgauge - rangebox - pause - progressview */
|
||||
|
||||
bool bsddialog_interruptprogview;
|
||||
bool bsddialog_abortprogview;
|
||||
int bsddialog_total_progview;
|
||||
|
||||
extern struct bsddialog_theme t;
|
||||
|
||||
@ -218,29 +223,35 @@ bsddialog_gauge(struct bsddialog_conf *conf, char* text, int rows, int cols,
|
||||
return BSDDIALOG_OK;
|
||||
}
|
||||
|
||||
int
|
||||
bsddialog_mixedgauge(struct bsddialog_conf *conf, char* text, int rows,
|
||||
int cols, unsigned int mainperc, unsigned int nminibars, char **minilabels,
|
||||
int *minipercs)
|
||||
|
||||
/* Mixedgauge */
|
||||
static int
|
||||
mixedgauge(struct bsddialog_conf *conf, char* text, int rows, int cols,
|
||||
unsigned int mainperc, unsigned int nminibars, char **minilabels,
|
||||
int *minipercs, bool color)
|
||||
{
|
||||
WINDOW *widget, *textpad, *bar, *shadow;
|
||||
int i, output, miniperc, y, x, h, w, max_minbarlen;
|
||||
int maxword, maxline, nlines, htextpad, ypad;
|
||||
char states[12][16] = {
|
||||
"[ Succeeded ]", /* 0 */
|
||||
"[ Failed ]", /* 1 */
|
||||
"[ Passed ]", /* 2 */
|
||||
"[ Completed ]", /* 3 */
|
||||
"[ Checked ]", /* 4 */
|
||||
"[ Done ]", /* 5 */
|
||||
"[ Skipped ]", /* 6 */
|
||||
"[ In Progress ]", /* 7 */
|
||||
"(blank) ", /* 8 */
|
||||
"[ N/A ]", /* 9 */
|
||||
"[ Pending ]", /* 10 */
|
||||
"[ UNKNOWN ]", /* 10+ */
|
||||
int colorperc, red, green;
|
||||
char states[12][14] = {
|
||||
" Succeeded ", /* 0 */
|
||||
" Failed ", /* 1 */
|
||||
" Passed ", /* 2 */
|
||||
" Completed ", /* 3 */
|
||||
" Checked ", /* 4 */
|
||||
" Done ", /* 5 */
|
||||
" Skipped ", /* 6 */
|
||||
" In Progress ", /* 7 */
|
||||
"(blank) ", /* 8 */
|
||||
" N/A ", /* 9 */
|
||||
" Pending ", /* 10 */
|
||||
" UNKNOWN ", /* 10+ */
|
||||
};
|
||||
|
||||
red = bsddialog_color(BSDDIALOG_WHITE,BSDDIALOG_RED, BSDDIALOG_BOLD);
|
||||
green = bsddialog_color(BSDDIALOG_WHITE,BSDDIALOG_GREEN,BSDDIALOG_BOLD);
|
||||
|
||||
max_minbarlen = 0;
|
||||
for (i=0; i < (int)nminibars; i++)
|
||||
max_minbarlen = MAX(max_minbarlen, (int)strlen(minilabels[i]));
|
||||
@ -255,7 +266,7 @@ bsddialog_mixedgauge(struct bsddialog_conf *conf, char* text, int rows,
|
||||
|
||||
if (cols == BSDDIALOG_AUTOSIZE) {
|
||||
w = max_minbarlen + HBORDERS;
|
||||
w = MAX(max_minbarlen, maxline + 4);
|
||||
w = MAX(w, maxline + 4);
|
||||
w = MAX(w, (int)conf->auto_minwidth);
|
||||
w = MIN(w, widget_max_width(conf) - 1);
|
||||
}
|
||||
@ -286,11 +297,26 @@ bsddialog_mixedgauge(struct bsddialog_conf *conf, char* text, int rows,
|
||||
miniperc = minipercs[i];
|
||||
if (miniperc == 8)
|
||||
continue;
|
||||
/* label */
|
||||
if (color && (miniperc == 7 || miniperc < 0))
|
||||
wattron(widget, A_BOLD);
|
||||
mvwaddstr(widget, i+1, 2, minilabels[i]);
|
||||
wattroff(widget, A_BOLD);
|
||||
/* perc */
|
||||
if (miniperc > 10)
|
||||
mvwaddstr(widget, i+1, w-2-15, states[11]);
|
||||
else if (miniperc >= 0 && miniperc <= 10)
|
||||
mvwaddstr(widget, i+1, w-2-15, states[miniperc]);
|
||||
else if (miniperc >= 0 && miniperc <= 10) {
|
||||
mvwaddstr(widget, i+1, w-2-15, "[ ]");
|
||||
if (color && miniperc == 1) /* Failed */
|
||||
colorperc = red;
|
||||
if (color && miniperc == 5) /* Done */
|
||||
colorperc = green;
|
||||
if (color && (miniperc == 1 || miniperc == 5))
|
||||
wattron(widget, colorperc);
|
||||
mvwaddstr(widget, i+1, 1+w-2-15, states[miniperc]);
|
||||
if (color && (miniperc == 1 || miniperc == 5))
|
||||
wattroff(widget, colorperc);
|
||||
}
|
||||
else { /* miniperc < 0 */
|
||||
miniperc = abs(miniperc);
|
||||
mvwaddstr(widget, i+1, w-2-15, "[ ]");
|
||||
@ -323,6 +349,101 @@ bsddialog_mixedgauge(struct bsddialog_conf *conf, char* text, int rows,
|
||||
return BSDDIALOG_OK;
|
||||
}
|
||||
|
||||
int
|
||||
bsddialog_mixedgauge(struct bsddialog_conf *conf, char* text, int rows,
|
||||
int cols, unsigned int mainperc, unsigned int nminibars, char **minilabels,
|
||||
int *minipercs)
|
||||
{
|
||||
int output;
|
||||
|
||||
output = mixedgauge(conf, text, rows, cols, mainperc, nminibars,
|
||||
minilabels, minipercs, false);
|
||||
|
||||
return (output);
|
||||
}
|
||||
|
||||
int
|
||||
bsddialog_progressview (struct bsddialog_conf *conf, char * text, int rows,
|
||||
int cols, struct bsddialog_progviewconf *pvconf, unsigned int nminibar,
|
||||
struct bsddialog_fileminibar *minibar)
|
||||
{
|
||||
int perc, output;
|
||||
int *minipercs;
|
||||
unsigned int i;
|
||||
char **minilabels;
|
||||
unsigned int mainperc, totaltodo;
|
||||
time_t tstart, told, tnew, refresh;
|
||||
bool update;
|
||||
float readforsec;
|
||||
|
||||
if ((minilabels = calloc(nminibar, sizeof(char*))) == NULL)
|
||||
RETURN_ERROR("Cannot allocate memory for minilabels\n");
|
||||
if ((minipercs = calloc(nminibar, sizeof(int))) == NULL)
|
||||
RETURN_ERROR("Cannot allocate memory for minipercs\n");
|
||||
|
||||
totaltodo = 0;
|
||||
for(i=0; i<nminibar; i++) {
|
||||
totaltodo += minibar[i].size;
|
||||
minilabels[i] = minibar[i].label;
|
||||
minipercs[i] = 10; /*Pending*/
|
||||
}
|
||||
|
||||
refresh = pvconf->refresh == 0 ? 0 : pvconf->refresh - 1;
|
||||
output = BSDDIALOG_OK;
|
||||
i = 0;
|
||||
update = true;
|
||||
time(&told);
|
||||
tstart = told;
|
||||
while (!(bsddialog_interruptprogview || bsddialog_abortprogview)) {
|
||||
if (bsddialog_total_progview == 0 || totaltodo == 0)
|
||||
mainperc = 0;
|
||||
else
|
||||
mainperc = (bsddialog_total_progview * 100) / totaltodo;
|
||||
|
||||
time(&tnew);
|
||||
if (update || tnew > told + refresh) {
|
||||
output = mixedgauge(conf, text, rows, cols, mainperc,
|
||||
nminibar, minilabels, minipercs, true);
|
||||
if (output == BSDDIALOG_ERROR)
|
||||
return BSDDIALOG_ERROR;
|
||||
|
||||
move(LINES-1, 2);
|
||||
clrtoeol();
|
||||
readforsec = ((tnew - tstart) == 0) ?
|
||||
0 : bsddialog_total_progview / (float)(tnew - tstart);
|
||||
printw(pvconf->fmtbottomstr, bsddialog_total_progview,
|
||||
readforsec);
|
||||
refresh();
|
||||
|
||||
time(&told);
|
||||
update = false;
|
||||
}
|
||||
|
||||
if (i >= nminibar)
|
||||
break;
|
||||
if (minibar[i].status == 1) /* Failed*/
|
||||
break;
|
||||
|
||||
perc = pvconf->callback(&minibar[i]);
|
||||
|
||||
if (minibar[i].status == 5) {/* ||prec >= 100) Done */
|
||||
minipercs[i] = 5;
|
||||
update = true;
|
||||
i++;
|
||||
} else if (minibar[i].status == 1 || perc < 0) { /* Failed */
|
||||
minipercs[i] = 1;
|
||||
update = true;
|
||||
} else if (perc == 0)
|
||||
minipercs[i] = 7; /* In progress */
|
||||
else /* perc > 0 */
|
||||
minipercs[i] = -(perc);
|
||||
}
|
||||
|
||||
free(minilabels);
|
||||
free(minipercs);
|
||||
return (output);
|
||||
}
|
||||
|
||||
int
|
||||
bsddialog_rangebox(struct bsddialog_conf *conf, char* text, int rows, int cols,
|
||||
int min, int max, int *value)
|
||||
|
562
lib/bsddialog.3
562
lib/bsddialog.3
@ -1,42 +1,530 @@
|
||||
.Dd $Mdocdate$
|
||||
.Dt PROGNAME section
|
||||
.\"
|
||||
.\" Copyright (c) 2021 Alfonso Sabato Siciliano
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd December 16, 2021
|
||||
.Dt BSDDIALOG 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm progname
|
||||
.Nd one line about what it does
|
||||
.\" .Sh LIBRARY
|
||||
.\" For sections 2, 3, and 9 only.
|
||||
.\" Not used in OpenBSD.
|
||||
.Nm bsddialog_backtitle ,
|
||||
.Nm bsddialog_clearterminal ,
|
||||
.Nm bsddialog_color ,
|
||||
.Nm bsddialog_buildlist ,
|
||||
.Nm bsddialog_checklist ,
|
||||
.Nm bsddialog_datebox ,
|
||||
.Nm bsddialog_end ,
|
||||
.Nm bsddialog_form ,
|
||||
.Nm bsddialog_gauge ,
|
||||
.Nm bsddialog_geterror ,
|
||||
.Nm bsddialog_get_theme
|
||||
.Nm bsddialog_infobox ,
|
||||
.Nm bsddialog_init ,
|
||||
.Nm bsddialog_initconf ,
|
||||
.Nm bsddialog_menu ,
|
||||
.Nm bsddialog_mixedgauge ,
|
||||
.Nm bsddialog_mixedlist ,
|
||||
.Nm bsddialog_msgbox ,
|
||||
.Nm bsddialog_pause ,
|
||||
.Nm bsddialog_radiolist ,
|
||||
.Nm bsddialog_rangebox ,
|
||||
.Nm bsddialog_set_theme ,
|
||||
.Nm bsddialog_set_default_theme ,
|
||||
.Nm bsddialog_textbox ,
|
||||
.Nm bsddialog_timebox ,
|
||||
.Nm bsddialog_yesno
|
||||
.Nd terminal dialogs and widgets
|
||||
.Sh LIBRARY
|
||||
.Lb libbsddialog
|
||||
.Sh SYNOPSIS
|
||||
.Nm progname
|
||||
.Op Fl options
|
||||
.Ar
|
||||
.In bsddialog.h
|
||||
|
||||
.Fd #define LIBBSDDIALOG_VERSION
|
||||
|
||||
.Fd #define BSDDIALOG_ERROR
|
||||
.Fd #define BSDDIALOG_OK
|
||||
.Fd #define BSDDIALOG_YES
|
||||
.Fd #define BSDDIALOG_CANCEL
|
||||
.Fd #define BSDDIALOG_NO
|
||||
.Fd #define BSDDIALOG_HELP
|
||||
.Fd #define BSDDIALOG_EXTRA
|
||||
.Fd #define BSDDIALOG_ITEM_HELP
|
||||
.Fd #define BSDDIALOG_TIMEOUT
|
||||
.Fd #define BSDDIALOG_ESC
|
||||
.Fd #define BSDDIALOG_GENERIC1
|
||||
.Fd #define BSDDIALOG_GENERIC2
|
||||
|
||||
.Fd #define BSDDIALOG_FULLSCREEN
|
||||
.Fd #define BSDDIALOG_AUTOSIZE
|
||||
.Fd #define BSDDIALOG_CENTER
|
||||
|
||||
.Fd struct bsddialog_conf
|
||||
.Fd struct bsddialog_menuitem
|
||||
.Fd enum bsddialog_grouptype
|
||||
.Fd struct bsddialog_menugroup
|
||||
.Fd struct bsddialog_formitem
|
||||
|
||||
.Ft int
|
||||
.Fn bsddialog_backtitle "struct bsddialog_conf *conf" "char *backtitle"
|
||||
.Ft int
|
||||
.Fo bsddialog_buildlist
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int menurows"
|
||||
.Fa "int nitems"
|
||||
.Fa "struct bsddialog_menuitem *items"
|
||||
.Fa "int *focusitem"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_checklist
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int menurows"
|
||||
.Fa "int nitems"
|
||||
.Fa "struct bsddialog_menuitem *items"
|
||||
.Fa "int *focusitem"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fn bsddialog_clearterminal "void"
|
||||
.Ft int
|
||||
.Fo bsddialog_datebox"
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int *yy"
|
||||
.Fa "unsigned int *mm"
|
||||
.Fa "unsigned int *dd"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fn bsddialog_end "void"
|
||||
.Ft int
|
||||
.Fo bsddialog_form
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int formheight"
|
||||
.Fa "unsigned int nitems"
|
||||
.Fa "struct bsddialog_formitem *items"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_gauge
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int perc"
|
||||
.Fc
|
||||
.Ft const char *
|
||||
.Fn bsddialog_geterror "void"
|
||||
.Ft int
|
||||
.Fo bsddialog_infobox
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fn bsddialog_init "void"
|
||||
.Ft int
|
||||
.Fn bsddialog_initconf "struct bsddialog_conf *conf"
|
||||
.Ft int
|
||||
.Fo bsddialog_menu
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int menurows"
|
||||
.Fa "int nitems"
|
||||
.Fa "struct bsddialog_menuitem *items"
|
||||
.Fa "int *focusitem"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_mixedgauge
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int mainperc"
|
||||
.Fa "unsigned int nminibars"
|
||||
.Fa "char **minilabels"
|
||||
.Fa "int *minipercs"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_mixedlist
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int menurows"
|
||||
.Fa "int ngroups"
|
||||
.Fa "struct bsddialog_menugroup *groups"
|
||||
.Fa "int *focuslist"
|
||||
.Fa "int *focusitem"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_msgbox
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_pause
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int sec"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_radiolist
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int menurows"
|
||||
.Fa "int nitems"
|
||||
.Fa "struct bsddialog_menuitem *items"
|
||||
.Fa "int *focusitem"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_rangebox
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "int min"
|
||||
.Fa "int max"
|
||||
.Fa "int *value"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_textbox
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* file"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_timebox
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fa "unsigned int *hh"
|
||||
.Fa "unsigned int *mm"
|
||||
.Fa "unsigned int *ss"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo bsddialog_yesno
|
||||
.Fa "struct bsddialog_conf *conf"
|
||||
.Fa "char* text"
|
||||
.Fa "int rows"
|
||||
.Fa "int cols"
|
||||
.Fc
|
||||
|
||||
.In bsddialog_theme.h
|
||||
|
||||
.Fd #define BSDDIALOG_BOLD
|
||||
.Fd #define BSDDIALOG_REVERSE
|
||||
.Fd #define BSDDIALOG_UNDERLINE
|
||||
|
||||
.Fd enum bsddialog_color
|
||||
.Fd enum bsddialog_default_theme
|
||||
.Fd struct bsddialog_theme
|
||||
|
||||
.Ft int
|
||||
.Fo bsddialog_color
|
||||
.Fa "enum bsddialog_color background"
|
||||
.Fa "enum bsddialog_color foreground"
|
||||
.Fa "unsigned int flags"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fn bsddialog_get_theme "struct bsddialog_theme *theme"
|
||||
.Ft int
|
||||
.Fn bsddialog_set_default_theme "enum bsddialog_default_theme theme"
|
||||
.Ft int
|
||||
.Fn bsddialog_set_theme "struct bsddialog_theme *theme"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
utility processes files ...
|
||||
.\" .Sh CONTEXT
|
||||
.\" For section 9 functions only.
|
||||
.\" .Sh IMPLEMENTATION NOTES
|
||||
.\" Not used in OpenBSD.
|
||||
.\" .Sh RETURN VALUES
|
||||
.\" For sections 2, 3, and 9 function return values only.
|
||||
.\" .Sh ENVIRONMENT
|
||||
.\" For sections 1, 6, 7, and 8 only.
|
||||
.\" .Sh FILES
|
||||
.\" .Sh EXIT STATUS
|
||||
.\" For sections 1, 6, and 8 only.
|
||||
.\" .Sh EXAMPLES
|
||||
.\" .Sh DIAGNOSTICS
|
||||
.\" For sections 1, 4, 6, 7, 8, and 9 printf/stderr messages only.
|
||||
.\" .Sh ERRORS
|
||||
.\" For sections 2, 3, 4, and 9 errno settings only.
|
||||
.\" .Sh SEE ALSO
|
||||
.\" .Xr foobar 1
|
||||
.\" .Sh STANDARDS
|
||||
.\" .Sh HISTORY
|
||||
.\" .Sh AUTHORS
|
||||
.\" .Sh CAVEATS
|
||||
.\" .Sh BUGS
|
||||
.\" .Sh SECURITY CONSIDERATIONS
|
||||
.\" Not used in OpenBSD.
|
||||
.Nm BSDDialog
|
||||
library is an API to write a tools with a Text User Interface. It can build
|
||||
dialogs and widgets: to show messages, to get input and to inform about a
|
||||
computation status.
|
||||
.Pp
|
||||
.Bd -literal -offset indent -compact
|
||||
/* size and position */
|
||||
#define BSDDIALOG_FULLSCREEN -1
|
||||
#define BSDDIALOG_AUTOSIZE 0
|
||||
#define BSDDIALOG_CENTER -1
|
||||
|
||||
struct bsddialog_conf {
|
||||
bool ascii_lines;
|
||||
unsigned int aspect_ratio;
|
||||
unsigned int auto_minheight;
|
||||
unsigned int auto_minwidth;
|
||||
char *bottomtitle;
|
||||
bool clear;
|
||||
char *f1_file;
|
||||
char *f1_message;
|
||||
int *get_height;
|
||||
int *get_width;
|
||||
bool no_lines;
|
||||
bool shadow;
|
||||
unsigned int sleep;
|
||||
char *title;
|
||||
int y;
|
||||
int x;
|
||||
struct {
|
||||
bool colors;
|
||||
} text;
|
||||
struct {
|
||||
bool align_left;
|
||||
char *default_item;
|
||||
bool no_desc;
|
||||
bool no_name;
|
||||
bool shortcut_buttons;
|
||||
} menu;
|
||||
struct {
|
||||
int securech;
|
||||
bool value_withcancel;
|
||||
bool value_withextra;
|
||||
bool value_withhelp;
|
||||
} form;
|
||||
struct {
|
||||
bool without_ok;
|
||||
char *ok_label;
|
||||
bool with_extra;
|
||||
char *extra_label;
|
||||
bool without_cancel;
|
||||
char *cancel_label;
|
||||
bool default_cancel;
|
||||
bool with_help;
|
||||
char *help_label;
|
||||
char *exit_label;
|
||||
char *generic1_label;
|
||||
char *generic2_label;
|
||||
char *default_label;
|
||||
} button;
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
|
||||
.Ss Dialogs
|
||||
.Pp
|
||||
.Bd -literal -offset indent -compact
|
||||
struct bsddialog_menuitem {
|
||||
char *prefix;
|
||||
bool on;
|
||||
unsigned int depth;
|
||||
char *name;
|
||||
char *desc;
|
||||
char *bottomdesc;
|
||||
};
|
||||
|
||||
enum bsddialog_grouptype {
|
||||
BSDDIALOG_CHECKLIST,
|
||||
BSDDIALOG_RADIOLIST,
|
||||
BSDDIALOG_SEPARATOR,
|
||||
};
|
||||
|
||||
struct bsddialog_menugroup {
|
||||
enum bsddialog_grouptype type;
|
||||
unsigned int nitems;
|
||||
struct bsddialog_menuitem *items;
|
||||
};
|
||||
|
||||
struct bsddialog_formitem {
|
||||
char *label;
|
||||
unsigned int ylabel;
|
||||
unsigned int xlabel;
|
||||
|
||||
char *init;
|
||||
unsigned int yfield;
|
||||
unsigned int xfield;
|
||||
unsigned int fieldlen;
|
||||
unsigned int maxvaluelen;
|
||||
char *value; /* allocated memory */
|
||||
#define BSDDIALOG_FIELDHIDDEN 1U
|
||||
#define BSDDIALOG_FIELDREADONLY 2U
|
||||
unsigned int flags;
|
||||
|
||||
char *bottomdesc;
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
|
||||
.Ss Theme
|
||||
.Pp
|
||||
.Bd -literal -offset indent -compact
|
||||
/* f_ focus/active element */
|
||||
struct bsddialog_theme {
|
||||
struct {
|
||||
int color;
|
||||
} terminal;
|
||||
struct {
|
||||
int color;
|
||||
unsigned int h;
|
||||
unsigned int w;
|
||||
} shadow;
|
||||
struct {
|
||||
int color;
|
||||
bool delimtitle;
|
||||
int titlecolor;
|
||||
int lineraisecolor;
|
||||
int linelowercolor;
|
||||
int bottomtitlecolor;
|
||||
} dialog;
|
||||
struct {
|
||||
unsigned int hmargin;
|
||||
} text;
|
||||
struct {
|
||||
int arrowcolor;
|
||||
int selectorcolor;
|
||||
int f_namecolor;
|
||||
int namecolor;
|
||||
int f_desccolor;
|
||||
int desccolor;
|
||||
int namesepcolor;
|
||||
int descsepcolor;
|
||||
int f_shortcutcolor;
|
||||
int shortcutcolor;
|
||||
} menu;
|
||||
struct {
|
||||
int f_fieldcolor;
|
||||
int fieldcolor;
|
||||
int readonlycolor;
|
||||
} form;
|
||||
struct {
|
||||
int f_color;
|
||||
int color;
|
||||
} bar;
|
||||
struct {
|
||||
unsigned int space;
|
||||
int leftch;
|
||||
int rightch;
|
||||
int delimcolor;
|
||||
int f_delimcolor;
|
||||
int color;
|
||||
int f_color;
|
||||
int shortcutcolor;
|
||||
int f_shortcutcolor;
|
||||
} button;
|
||||
};
|
||||
|
||||
enum bsddialog_default_theme {
|
||||
BSDDIALOG_THEME_BLACKWHITE,
|
||||
BSDDIALOG_THEME_BSDDIALOG,
|
||||
BSDDIALOG_THEME_DEFAULT,
|
||||
BSDDIALOG_THEME_DIALOG,
|
||||
};
|
||||
|
||||
enum bsddialog_color {
|
||||
BSDDIALOG_BLACK = 0,
|
||||
BSDDIALOG_RED,
|
||||
BSDDIALOG_GREEN,
|
||||
BSDDIALOG_YELLOW,
|
||||
BSDDIALOG_BLUE,
|
||||
BSDDIALOG_MAGENTA,
|
||||
BSDDIALOG_CYAN,
|
||||
BSDDIALOG_WHITE,
|
||||
};
|
||||
|
||||
#define BSDDIALOG_BOLD 1U
|
||||
#define BSDDIALOG_REVERSE 2U
|
||||
#define BSDDIALOG_UNDERLINE 4U
|
||||
.Ed
|
||||
.Pp
|
||||
|
||||
.Sh RETURN VALUES
|
||||
The sysctlmif_oidbyname(), sysctlmif_oidextendedbyname(),
|
||||
sysctlmif_name(), sysctlmif_desc(), sysctlmif_descbyname(),
|
||||
sysctlmif_label(), sysctlmif_labelbyname(), sysctlmif_fmt(),
|
||||
sysctlmif_fmtbyname(), sysctlmif_oidbyname0(), sysctlmif_oidbyname1(),
|
||||
sysctlmif_oidbyname2(), sysctlmif_oidbyname3(), sysctlmif_oidbyname4(),
|
||||
sysctlmif_oidbyname5(), sysctlmif_oidbyname6(), and
|
||||
sysctlmif_oidbyname7() functions return the value 0 if successful; other-
|
||||
wise the value -1 is returned and the global variable errno is set to in-
|
||||
dicate the error.
|
||||
|
||||
|
||||
functions return NULL upon error or a pointer to allo-
|
||||
cated memory for success.
|
||||
|
||||
.Sh EXAMPLES
|
||||
Complete set of examples:
|
||||
.Lk https://gitlab.com/alfix/bsddialog/-/blob/main/examples_library/
|
||||
.Pp
|
||||
If installed:
|
||||
.Dl /usr/local/share/examples/libbsddialog
|
||||
.Pp
|
||||
"Yes-No Question" Example:
|
||||
.Pp
|
||||
.Bd -literal -offset indent -compact
|
||||
int output;
|
||||
struct bsddialog_conf conf;
|
||||
|
||||
bsddialog_initconf(&conf);
|
||||
conf.title = "yesno";
|
||||
if (bsddialog_init() == BSDDIALOG_ERROR)
|
||||
return (1);
|
||||
|
||||
output = bsddialog_yesno(&conf, "Example", 7, 25);
|
||||
|
||||
bsddialog_end();
|
||||
|
||||
switch (output) {
|
||||
case BSDDIALOG_YES:
|
||||
printf("OK\\n");
|
||||
break;
|
||||
case BSDDIALOG_NO
|
||||
printf("NO\\n");
|
||||
break;
|
||||
case BSDDIALOG_ESC;
|
||||
printf("ESC\\n");
|
||||
break;
|
||||
case BSDDIALOG_ERROR:
|
||||
printf("Error: %s\\n", bsddialog_geterror());
|
||||
}
|
||||
.Ed
|
||||
.Sh SEE ALSO
|
||||
.Xr bsddialog 1
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm bsddialog
|
||||
library first appeared in
|
||||
.Fx 14.0 .
|
||||
.Sh AUTHORS
|
||||
.Nm bsddialog
|
||||
was written by
|
||||
.An Alfonso Sabato Siciliano Aq Mt alf.siciliano@gmail.com .
|
||||
.Sh CAVEATS
|
||||
See
|
||||
.Xr bsddialog
|
||||
.Sh BUGS
|
||||
See
|
||||
.Xr bsddialog 1
|
||||
|
@ -30,7 +30,7 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#define LIBBSDDIALOG_VERSION "0.0.1"
|
||||
#define LIBBSDDIALOG_VERSION "0.0.2"
|
||||
|
||||
/* Exit status */
|
||||
#define BSDDIALOG_ERROR -1
|
||||
@ -40,13 +40,12 @@
|
||||
#define BSDDIALOG_NO BSDDIALOG_CANCEL
|
||||
#define BSDDIALOG_HELP 2
|
||||
#define BSDDIALOG_EXTRA 3
|
||||
#define BSDDIALOG_ITEM_HELP 4
|
||||
#define BSDDIALOG_TIMEOUT 5
|
||||
#define BSDDIALOG_ESC 6
|
||||
#define BSDDIALOG_GENERIC1 7
|
||||
#define BSDDIALOG_GENERIC2 8
|
||||
#define BSDDIALOG_TIMEOUT 4
|
||||
#define BSDDIALOG_ESC 5
|
||||
#define BSDDIALOG_GENERIC1 6
|
||||
#define BSDDIALOG_GENERIC2 7
|
||||
|
||||
/* size and position */
|
||||
/* Size and position */
|
||||
#define BSDDIALOG_FULLSCREEN -1
|
||||
#define BSDDIALOG_AUTOSIZE 0
|
||||
#define BSDDIALOG_CENTER -1
|
||||
@ -132,7 +131,7 @@ struct bsddialog_formitem {
|
||||
unsigned int xfield;
|
||||
unsigned int fieldlen;
|
||||
unsigned int maxvaluelen;
|
||||
char *value; /* allocated memory */
|
||||
char *value;
|
||||
#define BSDDIALOG_FIELDHIDDEN 1U
|
||||
#define BSDDIALOG_FIELDREADONLY 2U
|
||||
unsigned int flags;
|
||||
@ -147,7 +146,7 @@ int bsddialog_initconf(struct bsddialog_conf *conf);
|
||||
int bsddialog_clearterminal(void);
|
||||
const char *bsddialog_geterror(void);
|
||||
|
||||
/* widgets */
|
||||
/* Dialogs */
|
||||
int
|
||||
bsddialog_buildlist(struct bsddialog_conf *conf, char* text, int rows, int cols,
|
||||
unsigned int menurows, int nitems, struct bsddialog_menuitem *items,
|
||||
|
54
lib/bsddialog_progressview.h
Normal file
54
lib/bsddialog_progressview.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* Copyright (c) 2021 Alfonso Sabato Siciliano
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _LIBBSDDIALOG_PROGRESSVIEW_H_
|
||||
#define _LIBBSDDIALOG_PROGRESSVIEW_H_
|
||||
|
||||
extern bool bsddialog_interruptprogview;
|
||||
extern bool bsddialog_abortprogview;
|
||||
extern int bsddialog_total_progview;
|
||||
|
||||
struct bsddialog_fileminibar {
|
||||
char *path;
|
||||
char *label;
|
||||
int status; /* mixedgauge: 1 failed - 5 done - 7 in progress*/
|
||||
long long size;
|
||||
long long read;
|
||||
};
|
||||
|
||||
struct bsddialog_progviewconf {
|
||||
char *fmtbottomstr;
|
||||
unsigned int refresh; /* in seconds */
|
||||
int (*callback)(struct bsddialog_fileminibar *minibar);
|
||||
};
|
||||
|
||||
int
|
||||
bsddialog_progressview (struct bsddialog_conf *conf, char * text, int rows,
|
||||
int cols, struct bsddialog_progviewconf *pvconf, unsigned int nminibar,
|
||||
struct bsddialog_fileminibar *minibar);
|
||||
|
||||
#endif
|
@ -106,8 +106,8 @@ enum bsddialog_color {
|
||||
#define BSDDIALOG_UNDERLINE 4U
|
||||
|
||||
int
|
||||
bsddialog_color(enum bsddialog_color background,
|
||||
enum bsddialog_color foreground, unsigned int flags);
|
||||
bsddialog_color(enum bsddialog_color foreground,
|
||||
enum bsddialog_color background, unsigned int flags);
|
||||
int bsddialog_get_theme(struct bsddialog_theme *theme);
|
||||
int bsddialog_set_default_theme(enum bsddialog_default_theme theme);
|
||||
int bsddialog_set_theme(struct bsddialog_theme *theme);
|
||||
|
135
lib/formbox.c
135
lib/formbox.c
@ -28,14 +28,13 @@
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef PORTNCURSES
|
||||
#include <ncurses/form.h>
|
||||
#else
|
||||
#include <form.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "bsddialog.h"
|
||||
#include "lib_util.h"
|
||||
@ -51,10 +50,10 @@ extern struct bsddialog_theme t;
|
||||
|
||||
/* util struct for private buffer and view options */
|
||||
struct myfield {
|
||||
int len;
|
||||
int buflen;
|
||||
char *buf;
|
||||
int pos;
|
||||
int size;
|
||||
int maxpos;
|
||||
bool secure;
|
||||
int securech;
|
||||
char *bottomdesc;
|
||||
@ -66,30 +65,32 @@ static void insertch(struct myfield *mf, int ch)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (mf->len == mf->size)
|
||||
if (mf->buflen > mf->maxpos)
|
||||
return;
|
||||
|
||||
for (i=mf->len-1; i>=mf->pos; i--) {
|
||||
for (i = mf->buflen; i >= mf->pos; i--) {
|
||||
mf->buf[i+1] = mf->buf[i];
|
||||
}
|
||||
|
||||
mf->buf[mf->pos] = ch;
|
||||
mf->pos += 1;
|
||||
mf->len += 1;
|
||||
mf->buf[mf->len] = '\0';
|
||||
if (mf->pos > mf->maxpos)
|
||||
mf->pos = mf->maxpos;
|
||||
mf->buflen += 1;
|
||||
mf->buf[mf->buflen] = '\0';
|
||||
}
|
||||
|
||||
static void shiftleft(struct myfield *mf)
|
||||
{
|
||||
int i, last;
|
||||
|
||||
for (i=mf->pos; i<mf->len; i++) {
|
||||
for (i = mf->pos; i < mf->buflen -1; i++) {
|
||||
mf->buf[i] = mf->buf[i+1];
|
||||
}
|
||||
|
||||
last = mf->len > 0 ? mf->len -1 : 0;
|
||||
last = mf->buflen > 0 ? mf->buflen -1 : 0;
|
||||
mf->buf[last] = '\0';
|
||||
mf->len = last;
|
||||
mf->buflen = last;
|
||||
}
|
||||
|
||||
static void print_bottomdesc(struct myfield *mf)
|
||||
@ -103,6 +104,36 @@ static void print_bottomdesc(struct myfield *mf)
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
return_values(struct bsddialog_conf *conf, struct buttons bs, int nitems,
|
||||
struct bsddialog_formitem *items, FORM *form, FIELD **cfield)
|
||||
{
|
||||
int i, output;
|
||||
struct myfield *mf;
|
||||
|
||||
output = bs.value[bs.curr];
|
||||
if (output == BSDDIALOG_HELP && conf->form.value_withhelp == false)
|
||||
return output;
|
||||
if (output == BSDDIALOG_EXTRA && conf->form.value_withextra == false)
|
||||
return output;
|
||||
if (output == BSDDIALOG_CANCEL && conf->form.value_withcancel == false)
|
||||
return output;
|
||||
if (output == BSDDIALOG_GENERIC1 || output == BSDDIALOG_GENERIC2)
|
||||
return output;
|
||||
|
||||
/* BSDDIALOG_OK */
|
||||
form_driver(form, REQ_NEXT_FIELD);
|
||||
form_driver(form, REQ_PREV_FIELD);
|
||||
for (i=0; i<nitems; i++) {
|
||||
mf = GETMYFIELD(cfield[i]);
|
||||
items[i].value = strdup(mf->buf);
|
||||
if (items[i].value == NULL)
|
||||
RETURN_ERROR("Cannot allocate memory for form value");
|
||||
}
|
||||
|
||||
return (output);
|
||||
}
|
||||
|
||||
static int
|
||||
form_handler(struct bsddialog_conf *conf, WINDOW *widget, int y, int cols,
|
||||
struct buttons bs, WINDOW *formwin, FORM *form, FIELD **cfield, int nitems,
|
||||
@ -112,15 +143,14 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, int y, int cols,
|
||||
int i, input, output;
|
||||
struct myfield *mf;
|
||||
|
||||
curs_set(2);
|
||||
pos_form_cursor(form);
|
||||
loop = buttupdate = true;
|
||||
bs.curr = -1;
|
||||
form_driver(form, REQ_END_LINE);
|
||||
form_driver(form, REQ_END_LINE);
|
||||
mf = GETMYFIELD2(form);
|
||||
print_bottomdesc(mf);
|
||||
mf->pos = mf->len;
|
||||
pos_form_cursor(form);
|
||||
form_driver(form, REQ_END_LINE);
|
||||
mf->pos = MIN(mf->buflen, mf->maxpos);
|
||||
curs_set(2);
|
||||
bs.curr = -1;
|
||||
loop = buttupdate = true;
|
||||
while(loop) {
|
||||
if (buttupdate) {
|
||||
draw_buttons(widget, y, cols, bs, !informwin);
|
||||
@ -135,30 +165,7 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, int y, int cols,
|
||||
if (informwin)
|
||||
break;
|
||||
loop = false;
|
||||
output = bs.value[bs.curr];
|
||||
if (output == BSDDIALOG_HELP &&
|
||||
conf->form.value_withhelp == false)
|
||||
break;
|
||||
if (output == BSDDIALOG_EXTRA &&
|
||||
conf->form.value_withextra == false)
|
||||
break;
|
||||
if (output == BSDDIALOG_CANCEL &&
|
||||
conf->form.value_withcancel == false)
|
||||
break;
|
||||
if (output == BSDDIALOG_GENERIC1 ||
|
||||
output == BSDDIALOG_GENERIC2)
|
||||
break;
|
||||
|
||||
/* BSDDIALOG_OK */
|
||||
form_driver(form, REQ_NEXT_FIELD);
|
||||
form_driver(form, REQ_PREV_FIELD);
|
||||
for (i=0; i<nitems; i++) {
|
||||
mf = GETMYFIELD(cfield[i]);
|
||||
items[i].value = strdup(mf->buf);
|
||||
if (items[i].value == NULL)
|
||||
RETURN_ERROR("Cannot allocate memory "
|
||||
"for form value");
|
||||
}
|
||||
output = return_values(conf, bs, nitems, items, form, cfield);
|
||||
break;
|
||||
case 27: /* Esc */
|
||||
output = BSDDIALOG_ESC;
|
||||
@ -196,7 +203,7 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, int y, int cols,
|
||||
case KEY_RIGHT:
|
||||
if (informwin) {
|
||||
mf = GETMYFIELD2(form);
|
||||
if (mf->pos >= mf->len)
|
||||
if (mf->pos >= mf->buflen)
|
||||
break;
|
||||
mf->pos += 1;
|
||||
form_driver(form, REQ_NEXT_CHAR);
|
||||
@ -216,7 +223,7 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, int y, int cols,
|
||||
form_driver(form, REQ_END_LINE);
|
||||
mf = GETMYFIELD2(form);
|
||||
print_bottomdesc(mf);
|
||||
mf->pos = mf->len;
|
||||
mf->pos = MIN(mf->buflen, mf->maxpos);
|
||||
set_field_fore(current_field(form), t.form.f_fieldcolor);
|
||||
set_field_back(current_field(form), t.form.f_fieldcolor);
|
||||
break;
|
||||
@ -229,7 +236,7 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, int y, int cols,
|
||||
form_driver(form, REQ_END_LINE);
|
||||
mf = GETMYFIELD2(form);
|
||||
print_bottomdesc(mf);
|
||||
mf->pos = mf->len;
|
||||
mf->pos = MIN(mf->buflen, mf->maxpos);
|
||||
set_field_fore(current_field(form), t.form.f_fieldcolor);
|
||||
set_field_back(current_field(form), t.form.f_fieldcolor);
|
||||
break;
|
||||
@ -239,14 +246,16 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, int y, int cols,
|
||||
if (mf->pos <= 0)
|
||||
break;
|
||||
form_driver(form, REQ_DEL_PREV);
|
||||
mf = GETMYFIELD2(form);
|
||||
mf->pos -= 1;
|
||||
form_driver(form, REQ_BEG_LINE);
|
||||
mf->pos = mf->pos - 1;
|
||||
for (i=0; i<mf->pos; i++)
|
||||
form_driver(form, REQ_NEXT_CHAR);
|
||||
shiftleft(mf);
|
||||
break;
|
||||
case KEY_DC:
|
||||
form_driver(form, REQ_DEL_CHAR);
|
||||
mf = GETMYFIELD2(form);
|
||||
if (mf->len-1 >= mf->pos)
|
||||
if (mf->pos < mf->buflen)
|
||||
shiftleft(mf);
|
||||
break;
|
||||
case KEY_F(1):
|
||||
@ -275,7 +284,9 @@ form_handler(struct bsddialog_conf *conf, WINDOW *widget, int y, int cols,
|
||||
for (i = 0; i < (int) bs.nbuttons; i++) {
|
||||
if (tolower(input) ==
|
||||
tolower((bs.label[i])[0])) {
|
||||
output = bs.value[i];
|
||||
bs.curr = i;
|
||||
output = return_values(conf, bs,
|
||||
nitems, items, form, cfield);
|
||||
loop = false;
|
||||
}
|
||||
}
|
||||
@ -386,6 +397,15 @@ bsddialog_form(struct bsddialog_conf *conf, char* text, int rows, int cols,
|
||||
if (formheight < nitems)
|
||||
formheight = nitems;
|
||||
|
||||
for (i = 0; i < (int)nitems; i++) {
|
||||
if (items[i].maxvaluelen == 0)
|
||||
RETURN_ERROR("maxvaluelen cannot be zero");
|
||||
if (items[i].fieldlen == 0)
|
||||
RETURN_ERROR("fieldlen cannot be zero");
|
||||
if (items[i].fieldlen > items[i].maxvaluelen)
|
||||
RETURN_ERROR("fieldlen cannot be > maxvaluelen");
|
||||
}
|
||||
|
||||
maxline = 0;
|
||||
myfields = malloc(nitems * sizeof(struct myfield));
|
||||
cfield = calloc(nitems + 1, sizeof(FIELD*));
|
||||
@ -396,12 +416,15 @@ bsddialog_form(struct bsddialog_conf *conf, char* text, int rows, int cols,
|
||||
set_max_field(cfield[i], items[i].maxvaluelen);
|
||||
set_field_buffer(cfield[i], 0, items[i].init);
|
||||
|
||||
myfields[i].pos = strlen(items[i].init);
|
||||
myfields[i].len = strlen(items[i].init);
|
||||
myfields[i].size = items[i].maxvaluelen;
|
||||
myfields[i].buf = malloc(myfields[i].size);
|
||||
memset(myfields[i].buf, 0, myfields[i].size);
|
||||
strcpy(myfields[i].buf, items[i].init);
|
||||
myfields[i].buf = malloc(items[i].maxvaluelen + 1);
|
||||
memset(myfields[i].buf, 0, items[i].maxvaluelen + 1); // end with '\0' for strdup
|
||||
strncpy(myfields[i].buf, items[i].init, items[i].maxvaluelen);
|
||||
|
||||
myfields[i].buflen = strlen(myfields[i].buf);
|
||||
|
||||
myfields[i].maxpos = items[i].maxvaluelen -1;
|
||||
myfields[i].pos = MIN(myfields[i].buflen, myfields[i].maxpos);
|
||||
|
||||
myfields[i].bottomdesc = items[i].bottomdesc;
|
||||
set_field_userptr(cfield[i], &myfields[i]);
|
||||
|
||||
|
@ -27,15 +27,14 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef PORTNCURSES
|
||||
#include <ncurses/ncurses.h>
|
||||
#else
|
||||
#include <ncurses.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "bsddialog.h"
|
||||
#include "lib_util.h"
|
||||
|
@ -32,8 +32,11 @@
|
||||
* Utils to implement widgets - Internal library API - Dafult values
|
||||
*/
|
||||
|
||||
#define HBORDERS 2
|
||||
#define VBORDERS 2
|
||||
#define HBORDER 1
|
||||
#define HBORDERS (HBORDER + HBORDER)
|
||||
#define VBORDER 1
|
||||
#define VBORDERS (VBORDER + VBORDER)
|
||||
#define PADDING(p) (p)
|
||||
|
||||
/* ncurses has not a Ctrl key macro */
|
||||
#define KEY_CTRL(x) ((x) & 0x1f)
|
||||
|
@ -25,15 +25,14 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef PORTNCURSES
|
||||
#include <ncurses/ncurses.h>
|
||||
#else
|
||||
#include <ncurses.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "bsddialog.h"
|
||||
#include "lib_util.h"
|
||||
@ -41,14 +40,14 @@
|
||||
|
||||
/*
|
||||
* This file implements public functions not related to a specific dialog.
|
||||
* utils.h/c: private functions to implement the library.
|
||||
* lib_utils.h/c: private functions to implement the library.
|
||||
* theme.h/c: public API related to themes.
|
||||
* Dialogs implementation:
|
||||
* infobox.c infobox
|
||||
* messgebox.c msgbox - yesno
|
||||
* menubox.c buildlist - checklist - menu - mixedlist - radiolist
|
||||
* formbox.c inputbox - passwordbox - form - passwordform - mixedform
|
||||
* barbox.c gauge - mixedgauge - rangebox - pause
|
||||
* barbox.c gauge - mixedgauge - rangebox - pause - progressview
|
||||
* textbox.c textbox
|
||||
* timebox.c timebox - calendar
|
||||
*/
|
||||
@ -57,13 +56,14 @@ extern struct bsddialog_theme t;
|
||||
|
||||
int bsddialog_init(void)
|
||||
{
|
||||
int i, j, c = 1, error = OK;
|
||||
int i, j, c, error;
|
||||
|
||||
set_error_string("");
|
||||
|
||||
if(initscr() == NULL)
|
||||
RETURN_ERROR("Cannot init ncurses (initscr)");
|
||||
|
||||
error = OK;
|
||||
error += keypad(stdscr, TRUE);
|
||||
nl();
|
||||
error += cbreak();
|
||||
@ -74,6 +74,7 @@ int bsddialog_init(void)
|
||||
RETURN_ERROR("Cannot init ncurses (keypad and cursor)");
|
||||
}
|
||||
|
||||
c = 1;
|
||||
error += start_color();
|
||||
for (i=0; i<8; i++)
|
||||
for(j=0; j<8; j++) {
|
||||
@ -90,39 +91,35 @@ int bsddialog_init(void)
|
||||
return (BSDDIALOG_ERROR);
|
||||
}
|
||||
|
||||
return (0);
|
||||
return (BSDDIALOG_OK);
|
||||
}
|
||||
|
||||
int bsddialog_end(void)
|
||||
{
|
||||
|
||||
if (endwin() != OK)
|
||||
RETURN_ERROR("Cannot end ncurses (endwin)");
|
||||
|
||||
return (0);
|
||||
return (BSDDIALOG_OK);
|
||||
}
|
||||
|
||||
int bsddialog_backtitle(struct bsddialog_conf *conf, char *backtitle)
|
||||
{
|
||||
|
||||
mvaddstr(0, 1, backtitle);
|
||||
if (conf->no_lines != true)
|
||||
mvhline(1, 1, conf->ascii_lines ? '-' : ACS_HLINE, COLS-2);
|
||||
|
||||
refresh();
|
||||
|
||||
return (0);
|
||||
return (BSDDIALOG_OK);
|
||||
}
|
||||
|
||||
const char *bsddialog_geterror(void)
|
||||
{
|
||||
|
||||
return (get_error_string());
|
||||
}
|
||||
|
||||
int bsddialog_initconf(struct bsddialog_conf *conf)
|
||||
{
|
||||
|
||||
if (conf == NULL)
|
||||
RETURN_ERROR("conf is NULL");
|
||||
if (sizeof(*conf) != sizeof(struct bsddialog_conf))
|
||||
@ -133,15 +130,14 @@ int bsddialog_initconf(struct bsddialog_conf *conf)
|
||||
conf->x = BSDDIALOG_CENTER;
|
||||
conf->shadow = true;
|
||||
|
||||
return (0);
|
||||
return (BSDDIALOG_OK);
|
||||
}
|
||||
|
||||
int bsddialog_clearterminal(void)
|
||||
{
|
||||
|
||||
if (clear() != OK)
|
||||
RETURN_ERROR("Cannot clear the terminal");
|
||||
refresh();
|
||||
|
||||
return (0);
|
||||
return (BSDDIALOG_OK);
|
||||
}
|
||||
|
@ -28,13 +28,13 @@
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef PORTNCURSES
|
||||
#include <ncurses/ncurses.h>
|
||||
#else
|
||||
#include <ncurses.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#include "bsddialog.h"
|
||||
#include "lib_util.h"
|
||||
|
@ -28,33 +28,26 @@
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef PORTNCURSES
|
||||
#include <ncurses/ncurses.h>
|
||||
#else
|
||||
#include <ncurses.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
#include "bsddialog.h"
|
||||
#include "lib_util.h"
|
||||
#include "bsddialog_theme.h"
|
||||
|
||||
/* "Message": msgbox - yesno */
|
||||
|
||||
#define AUTO_WIDTH (COLS / 3U)
|
||||
/*
|
||||
* Min height = 5: 2 up & down borders + 2 label & up border buttons + 1 line
|
||||
* for text, at least 1 line is important for widget_withtextpad_init() to avoid
|
||||
* "Cannot build the pad window for text".
|
||||
*/
|
||||
#define MIN_HEIGHT 5
|
||||
/* at least 1 line text for its pad building in widget_withtextpad_init() */
|
||||
#define MIN_HEIGHT (HBORDERS + 2 /*buttons*/ + 1 /*text*/)
|
||||
|
||||
extern struct bsddialog_theme t;
|
||||
|
||||
static int
|
||||
message_autosize(struct bsddialog_conf *conf, int rows, int cols, int *h, int *w,
|
||||
char *text, struct buttons bs)
|
||||
message_autosize(struct bsddialog_conf *conf, int rows, int cols, int *h,
|
||||
int *w, char *text, struct buttons bs)
|
||||
{
|
||||
int maxword, maxline, nlines, line;
|
||||
|
||||
@ -109,9 +102,9 @@ static int message_checksize(int rows, int cols, struct buttons bs)
|
||||
}
|
||||
|
||||
static void
|
||||
buttonsupdate(WINDOW *widget, int h, int w, struct buttons bs, bool shortkey)
|
||||
buttonsupdate(WINDOW *widget, int h, int w, struct buttons bs)
|
||||
{
|
||||
draw_buttons(widget, h-2, w, bs, shortkey);
|
||||
draw_buttons(widget, h-2, w, bs, true);
|
||||
wnoutrefresh(widget);
|
||||
}
|
||||
|
||||
@ -119,7 +112,6 @@ static void
|
||||
textupdate(WINDOW *widget, int y, int x, int h, int w, WINDOW *textpad,
|
||||
int htextpad, int textrow)
|
||||
{
|
||||
|
||||
if (htextpad > h - 4) {
|
||||
mvwprintw(widget, h-3, w-6, "%3d%%",
|
||||
100 * (textrow+h-4)/ htextpad);
|
||||
@ -130,8 +122,8 @@ textupdate(WINDOW *widget, int y, int x, int h, int w, WINDOW *textpad,
|
||||
}
|
||||
|
||||
static int
|
||||
do_widget(struct bsddialog_conf *conf, char *text, int rows, int cols,
|
||||
struct buttons bs, bool shortkey)
|
||||
do_dialog(struct bsddialog_conf *conf, char *text, int rows, int cols,
|
||||
struct buttons bs)
|
||||
{
|
||||
WINDOW *widget, *textpad, *shadow;
|
||||
bool loop;
|
||||
@ -152,7 +144,7 @@ do_widget(struct bsddialog_conf *conf, char *text, int rows, int cols,
|
||||
|
||||
textrow = 0;
|
||||
loop = true;
|
||||
buttonsupdate(widget, h, w, bs, shortkey);
|
||||
buttonsupdate(widget, h, w, bs);
|
||||
textupdate(widget, y, x, h, w, textpad, htextpad, textrow);
|
||||
while(loop) {
|
||||
doupdate();
|
||||
@ -168,7 +160,7 @@ do_widget(struct bsddialog_conf *conf, char *text, int rows, int cols,
|
||||
break;
|
||||
case '\t': /* TAB */
|
||||
bs.curr = (bs.curr + 1) % bs.nbuttons;
|
||||
buttonsupdate(widget, h, w, bs, shortkey);
|
||||
buttonsupdate(widget, h, w, bs);
|
||||
break;
|
||||
case KEY_F(1):
|
||||
if (conf->f1_file == NULL && conf->f1_message == NULL)
|
||||
@ -210,7 +202,7 @@ do_widget(struct bsddialog_conf *conf, char *text, int rows, int cols,
|
||||
RAISED, textpad, &htextpad, text, true) != 0)
|
||||
return BSDDIALOG_ERROR;
|
||||
|
||||
buttonsupdate(widget, h, w, bs, shortkey);
|
||||
buttonsupdate(widget, h, w, bs);
|
||||
textupdate(widget, y, x, h, w, textpad, htextpad, textrow);
|
||||
|
||||
/* Important to fix grey lines expanding screen */
|
||||
@ -231,21 +223,18 @@ do_widget(struct bsddialog_conf *conf, char *text, int rows, int cols,
|
||||
case KEY_LEFT:
|
||||
if (bs.curr > 0) {
|
||||
bs.curr--;
|
||||
buttonsupdate(widget, h, w, bs, shortkey);
|
||||
buttonsupdate(widget, h, w, bs);
|
||||
}
|
||||
break;
|
||||
case KEY_RIGHT:
|
||||
if (bs.curr < (int) bs.nbuttons - 1) {
|
||||
bs.curr++;
|
||||
buttonsupdate(widget, h, w, bs, shortkey);
|
||||
buttonsupdate(widget, h, w, bs);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (shortkey == false)
|
||||
break;
|
||||
|
||||
for (i = 0; i < (int) bs.nbuttons; i++)
|
||||
if (tolower(input) == tolower((bs.label[i])[0])) {
|
||||
if (tolower(input) == tolower(bs.label[i][0])) {
|
||||
output = bs.value[i];
|
||||
loop = false;
|
||||
}
|
||||
@ -258,16 +247,15 @@ do_widget(struct bsddialog_conf *conf, char *text, int rows, int cols,
|
||||
}
|
||||
|
||||
/* API */
|
||||
|
||||
int
|
||||
bsddialog_msgbox(struct bsddialog_conf *conf, char* text, int rows, int cols)
|
||||
{
|
||||
struct buttons bs;
|
||||
|
||||
get_buttons(conf, &bs, BUTTONLABEL(ok_label), BUTTONLABEL(extra_label),
|
||||
NULL /* nocancel */, BUTTONLABEL(help_label));
|
||||
NULL, BUTTONLABEL(help_label));
|
||||
|
||||
return (do_widget(conf, text, rows, cols, bs, true));
|
||||
return (do_dialog(conf, text, rows, cols, bs));
|
||||
}
|
||||
|
||||
int
|
||||
@ -281,5 +269,5 @@ bsddialog_yesno(struct bsddialog_conf *conf, char* text, int rows, int cols)
|
||||
conf->button.cancel_label == NULL ? "No" : conf->button.cancel_label,
|
||||
BUTTONLABEL(help_label));
|
||||
|
||||
return (do_widget(conf, text, rows, cols, bs, true));
|
||||
return (do_dialog(conf, text, rows, cols, bs));
|
||||
}
|
||||
|
@ -28,13 +28,12 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#ifdef PORTNCURSES
|
||||
#include <ncurses/ncurses.h>
|
||||
#else
|
||||
#include <ncurses.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
#include "bsddialog.h"
|
||||
#include "lib_util.h"
|
||||
|
@ -87,8 +87,8 @@ static struct bsddialog_theme bsddialogtheme = {
|
||||
};
|
||||
|
||||
static struct bsddialog_theme blackwhite = {
|
||||
#define bk COLOR_BLACK
|
||||
#define fg COLOR_WHITE
|
||||
#define bk COLOR_BLACK
|
||||
.terminal.color = GET_COLOR(fg, bk),
|
||||
|
||||
.shadow.color = GET_COLOR(COLOR_BLACK, COLOR_BLACK),
|
||||
@ -272,8 +272,8 @@ int bsddialog_set_default_theme(enum bsddialog_default_theme newtheme)
|
||||
}
|
||||
|
||||
int
|
||||
bsddialog_color(enum bsddialog_color background,
|
||||
enum bsddialog_color foreground, unsigned int flags)
|
||||
bsddialog_color(enum bsddialog_color foreground,
|
||||
enum bsddialog_color background, unsigned int flags)
|
||||
{
|
||||
unsigned int cursesflags = 0;
|
||||
|
||||
@ -284,5 +284,5 @@ bsddialog_color(enum bsddialog_color background,
|
||||
if (flags & BSDDIALOG_UNDERLINE)
|
||||
cursesflags |= A_UNDERLINE;
|
||||
|
||||
return (GET_COLOR(background, foreground) | cursesflags);
|
||||
return (GET_COLOR(foreground, background) | cursesflags);
|
||||
}
|
||||
|
@ -27,13 +27,12 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#ifdef PORTNCURSES
|
||||
#include <ncurses/ncurses.h>
|
||||
#else
|
||||
#include <ncurses.h>
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "bsddialog.h"
|
||||
|
Loading…
Reference in New Issue
Block a user