aboutsummaryrefslogtreecommitdiff
path: root/contrib/bsddialog/lib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bsddialog/lib')
-rw-r--r--contrib/bsddialog/lib/GNUmakefile19
-rw-r--r--contrib/bsddialog/lib/Makefile23
-rw-r--r--contrib/bsddialog/lib/barbox.c37
-rw-r--r--contrib/bsddialog/lib/bsddialog.316
-rw-r--r--contrib/bsddialog/lib/bsddialog.h11
-rw-r--r--contrib/bsddialog/lib/bsddialog_theme.h2
-rw-r--r--contrib/bsddialog/lib/datebox.c28
-rw-r--r--contrib/bsddialog/lib/formbox.c48
-rw-r--r--contrib/bsddialog/lib/lib_util.c3
-rw-r--r--contrib/bsddialog/lib/lib_util.h4
-rw-r--r--contrib/bsddialog/lib/libbsddialog.c14
-rw-r--r--contrib/bsddialog/lib/menubox.c18
-rw-r--r--contrib/bsddialog/lib/messagebox.c16
-rw-r--r--contrib/bsddialog/lib/slider.c670
-rw-r--r--contrib/bsddialog/lib/textbox.c16
-rw-r--r--contrib/bsddialog/lib/theme.c6
-rw-r--r--contrib/bsddialog/lib/timebox.c16
17 files changed, 850 insertions, 97 deletions
diff --git a/contrib/bsddialog/lib/GNUmakefile b/contrib/bsddialog/lib/GNUmakefile
index 7c7a9bc25ee4..2cb060381a46 100644
--- a/contrib/bsddialog/lib/GNUmakefile
+++ b/contrib/bsddialog/lib/GNUmakefile
@@ -9,6 +9,7 @@ HEADERS = bsddialog.h bsddialog_theme.h bsddialog_progressview.h
SOURCES = barbox.c datebox.c formbox.c libbsddialog.c lib_util.c \
menubox.c messagebox.c textbox.c theme.c timebox.c
OBJECTS = $(SOURCES:.c=.o)
+PREFIX = /usr/local
ifneq ($(ENABLEDEBUG),)
CFLAGS += -g
@@ -21,7 +22,21 @@ LIBFLAG = -shared
RM = rm -f
LN = ln -s -f
-all : $(LIBRARY)
+all: $(LIBRARY)
+
+install: all
+ ${INSTALL} -m 0644 bsddialog.h ${DESTDIR}${PREFIX}/include/bsddialog.h
+ ${INSTALL} -m 0644 bsddialog_progressview.h ${DESTDIR}${PREFIX}/include/bsddialog_progressview.h
+ ${INSTALL} -m 0644 bsddialog_theme.h ${DESTDIR}${PREFIX}/include/bsddialog_theme.h
+ ${INSTALL} -m 0755 ${LIBRARY_SO}.${VERSION} ${DESTDIR}${PREFIX}/lib/${LIBRARY_SO}.${VERSION}
+ ${LN} ${LIBRARY_SO}.${VERSION} ${DESTDIR}${PREFIX}/lib/${LIBRARY_SO}
+
+uninstall:
+ ${RM} ${DESTDIR}${PREFIX}/include/bsddialog.h
+ ${RM} ${DESTDIR}${PREFIX}/include/bsddialog_progressview.h
+ ${RM} ${DESTDIR}${PREFIX}/include/bsddialog_theme.h
+ ${RM} ${DESTDIR}${PREFIX}/lib/${LIBRARY_SO}.${VERSION}
+ ${RM} ${DESTDIR}${PREFIX}/lib/${LIBRARY_SO}
$(LIBRARY): $(OBJECTS)
$(CC) $(LIBFLAG) $^ -o $(LIBRARY_SO).$(VERSION) $(LDFLAGS)
@@ -32,3 +47,5 @@ $(LIBRARY): $(OBJECTS)
clean:
$(RM) $(LIBRARY_SO)* *.o *~
+
+.PHONY: all install uninstall ${LIBRARY} clean
diff --git a/contrib/bsddialog/lib/Makefile b/contrib/bsddialog/lib/Makefile
index 252b33f79848..b5a3c1a8afc4 100644
--- a/contrib/bsddialog/lib/Makefile
+++ b/contrib/bsddialog/lib/Makefile
@@ -8,8 +8,9 @@ LIBRARY_SO = lib${LIBRARY:=.so}
LIBRARY_A = lib${LIBRARY:=.a}
HEADERS = bsddialog.h bsddialog_theme.h bsddialog_progressview.h
SOURCES = barbox.c datebox.c formbox.c libbsddialog.c lib_util.c \
- menubox.c messagebox.c textbox.c theme.c timebox.c
+ menubox.c messagebox.c slider.c textbox.c theme.c timebox.c
OBJECTS = ${SOURCES:.c=.o}
+PREFIX = /usr/local
.if defined(DEBUG)
CFLAGS += -g
@@ -23,7 +24,23 @@ LDFLAGS += -fstack-protector-strong -shared -Wl,-x -Wl,--fatal-warnings \
LN = ln -s -f
RM = rm -f
-all : ${LIBRARY}
+all: ${LIBRARY}
+
+install: all
+ ${INSTALL} -m 0644 bsddialog.h ${DESTDIR}${PREFIX}/include/bsddialog.h
+ ${INSTALL} -m 0644 bsddialog_progressview.h ${DESTDIR}${PREFIX}/include/bsddialog_progressview.h
+ ${INSTALL} -m 0644 bsddialog_theme.h ${DESTDIR}${PREFIX}/include/bsddialog_theme.h
+ ${INSTALL} -m 0644 ${LIBRARY_A} ${DESTDIR}${PREFIX}/lib/${LIBRARY_A}
+ ${INSTALL} -m 0755 ${LIBRARY_SO}.${VERSION} ${DESTDIR}${PREFIX}/lib/${LIBRARY_SO}.${VERSION}
+ ${LN} ${LIBRARY_SO}.${VERSION} ${DESTDIR}${PREFIX}/lib/${LIBRARY_SO}
+
+uninstall:
+ ${RM} ${DESTDIR}${PREFIX}/include/bsddialog.h
+ ${RM} ${DESTDIR}${PREFIX}/include/bsddialog_progressview.h
+ ${RM} ${DESTDIR}${PREFIX}/include/bsddialog_theme.h
+ ${RM} ${DESTDIR}${PREFIX}/lib/${LIBRARY_A}
+ ${RM} ${DESTDIR}${PREFIX}/lib/${LIBRARY_SO}.${VERSION}
+ ${RM} ${DESTDIR}${PREFIX}/lib/${LIBRARY_SO}
${LIBRARY}: ${LIBRARY_SO} ${LIBRARY_A}
@@ -42,3 +59,5 @@ ${LIBRARY_A}: ${OBJECTS}
clean:
${RM} ${LIBRARY_SO}* *.o *~ *.gz ${LIBRARY_A}
+
+.PHONY: all install uninstall ${LIBRARY} clean
diff --git a/contrib/bsddialog/lib/barbox.c b/contrib/bsddialog/lib/barbox.c
index 4feea20c6441..51f81ecbca68 100644
--- a/contrib/bsddialog/lib/barbox.c
+++ b/contrib/bsddialog/lib/barbox.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -371,7 +371,7 @@ bsddialog_progressview (struct bsddialog_conf *conf, const char *text, int rows,
unsigned int i, mainperc, totaltodo;
float readforsec;
const char **minilabels;
- time_t tstart, told, tnew, refresh;
+ time_t tstart, told, tnew, trefresh;
if ((minilabels = calloc(nminibar, sizeof(char*))) == NULL)
RETURN_ERROR("Cannot allocate memory for minilabels");
@@ -385,7 +385,7 @@ bsddialog_progressview (struct bsddialog_conf *conf, const char *text, int rows,
minipercs[i] = minibar[i].status;
}
- refresh = pvconf->refresh == 0 ? 0 : pvconf->refresh - 1;
+ trefresh = pvconf->refresh == 0 ? 0 : pvconf->refresh - 1;
retval = BSDDIALOG_OK;
i = 0;
update = true;
@@ -398,7 +398,7 @@ bsddialog_progressview (struct bsddialog_conf *conf, const char *text, int rows,
mainperc = (bsddialog_total_progview * 100) / totaltodo;
time(&tnew);
- if (update || tnew > told + refresh) {
+ if (update || tnew > told + trefresh) {
retval = do_mixedgauge(conf, text, rows, cols, mainperc,
nminibar, minilabels, minipercs, true);
if (retval == BSDDIALOG_ERROR)
@@ -440,17 +440,18 @@ bsddialog_progressview (struct bsddialog_conf *conf, const char *text, int rows,
return (retval);
}
-static int rangebox_redraw(struct dialog *d, struct bar *b, int *bigchange)
+static int
+rangebox_redraw(struct dialog *d, bool redraw, struct bar *b, int *bigchange)
{
- if (d->built) {
+ if (redraw) {
hide_dialog(d);
refresh(); /* Important for decreasing screen */
}
if (dialog_size_position(d, HBOX, MIN_WBOX, NULL) != 0)
return (BSDDIALOG_ERROR);
- if (draw_dialog(d) != 0)
+ if (draw_dialog(d) != 0) /* doupdate() in main loop */
return (BSDDIALOG_ERROR);
- if (d->built)
+ if (redraw)
refresh(); /* Important to fix grey lines expanding screen */
TEXTPAD(d, HBOX + HBUTTONS);
@@ -490,7 +491,7 @@ bsddialog_rangebox(struct bsddialog_conf *conf, const char *text, int rows,
RETURN_ERROR("Cannot build WINDOW bar");
b.y = b.x = 1;
b.fmt = "%d";
- if (rangebox_redraw(&d, &b, &bigchange) != 0)
+ if (rangebox_redraw(&d, false, &b, &bigchange) != 0)
return (BSDDIALOG_ERROR);
loop = true;
@@ -568,12 +569,12 @@ bsddialog_rangebox(struct bsddialog_conf *conf, const char *text, int rows,
break;
if (f1help_dialog(conf) != 0)
return (BSDDIALOG_ERROR);
- if (rangebox_redraw(&d, &b, &bigchange) != 0)
+ if (rangebox_redraw(&d, true, &b, &bigchange) != 0)
return (BSDDIALOG_ERROR);
break;
case KEY_CTRL('l'):
case KEY_RESIZE:
- if (rangebox_redraw(&d, &b, &bigchange) != 0)
+ if (rangebox_redraw(&d, true, &b, &bigchange) != 0)
return (BSDDIALOG_ERROR);
break;
default:
@@ -594,17 +595,17 @@ bsddialog_rangebox(struct bsddialog_conf *conf, const char *text, int rows,
return (retval);
}
-static int pause_redraw(struct dialog *d, struct bar *b)
+static int pause_redraw(struct dialog *d, bool redraw, struct bar *b)
{
- if (d->built) {
+ if (redraw) {
hide_dialog(d);
refresh(); /* Important for decreasing screen */
}
if (dialog_size_position(d, HBOX, MIN_WBOX, NULL) != 0)
return (BSDDIALOG_ERROR);
- if (draw_dialog(d) != 0)
+ if (draw_dialog(d) != 0) /* doupdate() in main loop */
return (BSDDIALOG_ERROR);
- if (d->built)
+ if (redraw)
refresh(); /* Important to fix grey lines expanding screen */
TEXTPAD(d, HBOX + HBUTTONS);
@@ -633,7 +634,7 @@ bsddialog_pause(struct bsddialog_conf *conf, const char *text, int rows,
RETURN_ERROR("Cannot build WINDOW bar");
b.y = b.x = 1;
b.fmt = "%d";
- if (pause_redraw(&d, &b) != 0)
+ if (pause_redraw(&d, false, &b) != 0)
return (BSDDIALOG_ERROR);
tout = *seconds;
@@ -687,12 +688,12 @@ bsddialog_pause(struct bsddialog_conf *conf, const char *text, int rows,
break;
if (f1help_dialog(conf) != 0)
return (BSDDIALOG_ERROR);
- if (pause_redraw(&d, &b) != 0)
+ if (pause_redraw(&d, true, &b) != 0)
return (BSDDIALOG_ERROR);
break;
case KEY_CTRL('l'):
case KEY_RESIZE:
- if (pause_redraw(&d, &b) != 0)
+ if (pause_redraw(&d, true, &b) != 0)
return (BSDDIALOG_ERROR);
break;
default:
diff --git a/contrib/bsddialog/lib/bsddialog.3 b/contrib/bsddialog/lib/bsddialog.3
index cbf1653a2aca..bbd756661a78 100644
--- a/contrib/bsddialog/lib/bsddialog.3
+++ b/contrib/bsddialog/lib/bsddialog.3
@@ -1,5 +1,5 @@
.\"
-.\" Copyright (c) 2021-2024 Alfonso Sabato Siciliano
+.\" Copyright (c) 2021-2025 Alfonso Sabato Siciliano
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
@@ -22,11 +22,12 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd March 16, 2024
+.Dd June 22, 2025
.Dt BSDDIALOG 3
.Os
.Sh NAME
.Nm bsddialog_backtitle ,
+.Nm bsddialog_backtitle_rf ,
.Nm bsddialog_calendar ,
.Nm bsddialog_clear ,
.Nm bsddialog_color ,
@@ -65,6 +66,8 @@
.Ft int
.Fn bsddialog_backtitle "struct bsddialog_conf *conf" "const char *backtitle"
.Ft int
+.Fn bsddialog_backtitle_rf "struct bsddialog_conf *conf" "const char *backtitle"
+.Ft int
.Fo bsddialog_calendar
.Fa "struct bsddialog_conf *conf"
.Fa "const char *text"
@@ -292,7 +295,7 @@ and before
.Dv false
otherwise.
.Pp
-.Fn bsddialog_backtitle
+.Fn bsddialog_backtitle_rf
prints
.Fa backtitle
on the top of the screen.
@@ -302,6 +305,11 @@ and
.Fa conf.no_lines
described later.
.Pp
+.Fn bsddialog_backtitle
+is like
+.Fn bsddialog_backtitle_rf
+but it does not update the screen, using if a dialog is built later.
+.Pp
.Fn bsddialog_error
returns a string to describe the last error.
The function should be called after a
@@ -902,7 +910,7 @@ provides a dialog for a
the labels on buttons are
.Dq Yes
and
-.Dq No .
+.Dq &No .
.Ss Keys
.Bl -tag -width Ds
.It Ctrl-l
diff --git a/contrib/bsddialog/lib/bsddialog.h b/contrib/bsddialog/lib/bsddialog.h
index fd0e2bc02580..4b387d993363 100644
--- a/contrib/bsddialog/lib/bsddialog.h
+++ b/contrib/bsddialog/lib/bsddialog.h
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -30,7 +30,7 @@
#include <stdbool.h>
-#define LIBBSDDIALOG_VERSION "1.0.4"
+#define LIBBSDDIALOG_VERSION "1.1"
/* Return values */
#define BSDDIALOG_ERROR -1
@@ -179,6 +179,7 @@ int bsddialog_init_notheme(void);
bool bsddialog_inmode(void);
int bsddialog_end(void);
int bsddialog_backtitle(struct bsddialog_conf *conf, const char *backtitle);
+int bsddialog_backtitle_rf(struct bsddialog_conf *conf, const char *backtitle);
int bsddialog_initconf(struct bsddialog_conf *conf);
void bsddialog_clear(unsigned int y);
void bsddialog_refresh(void);
@@ -244,6 +245,12 @@ bsddialog_rangebox(struct bsddialog_conf *conf, const char *text, int rows,
int cols, int min, int max, int *value);
int
+bsddialog_slider(struct bsddialog_conf *conf, const char *text, int rows,
+ int cols, const char *unit, unsigned long length, unsigned long *start,
+ unsigned long *end, bool resize, unsigned int nblocks,
+ unsigned long blocks[][2]);
+
+int
bsddialog_textbox(struct bsddialog_conf *conf, const char *file, int rows,
int cols);
diff --git a/contrib/bsddialog/lib/bsddialog_theme.h b/contrib/bsddialog/lib/bsddialog_theme.h
index 2071896b61f0..77938c65b6ce 100644
--- a/contrib/bsddialog/lib/bsddialog_theme.h
+++ b/contrib/bsddialog/lib/bsddialog_theme.h
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2023 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
diff --git a/contrib/bsddialog/lib/datebox.c b/contrib/bsddialog/lib/datebox.c
index ee955471799e..66f36f5f4a99 100644
--- a/contrib/bsddialog/lib/datebox.c
+++ b/contrib/bsddialog/lib/datebox.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2022-2024 Alfonso Sabato Siciliano
+ * Copyright (c) 2022-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -296,20 +296,20 @@ print_calendar(struct bsddialog_conf *conf, WINDOW *win, int yy, int mm, int dd,
}
static int
-calendar_redraw(struct dialog *d, WINDOW *yy_win, WINDOW *mm_win,
+calendar_draw(struct dialog *d, bool redraw, WINDOW *yy_win, WINDOW *mm_win,
WINDOW *dd_win)
{
int ycal, xcal;
- if (d->built) {
+ if (redraw) {
hide_dialog(d);
refresh(); /* Important for decreasing screen */
}
if (dialog_size_position(d, MINHCAL, MINWCAL, NULL) != 0)
return (BSDDIALOG_ERROR);
- if (draw_dialog(d) != 0)
+ if (draw_dialog(d) != 0) /* doupdate in main loop */
return (BSDDIALOG_ERROR);
- if (d->built)
+ if (redraw)
refresh(); /* Important to fix grey lines expanding screen */
TEXTPAD(d, MINHCAL + HBUTTONS);
@@ -354,7 +354,7 @@ bsddialog_calendar(struct bsddialog_conf *conf, const char *text, int rows,
if ((dd_win = newwin(1, 1, 1, 1)) == NULL)
RETURN_ERROR("Cannot build WINDOW for dd");
wbkgd(dd_win, t.dialog.color);
- if (calendar_redraw(&d, yy_win, mm_win, dd_win) != 0)
+ if (calendar_draw(&d, false, yy_win, mm_win, dd_win) != 0)
return (BSDDIALOG_ERROR);
sel = -1;
@@ -503,12 +503,12 @@ bsddialog_calendar(struct bsddialog_conf *conf, const char *text, int rows,
break;
if (f1help_dialog(conf) != 0)
return (BSDDIALOG_ERROR);
- if (calendar_redraw(&d, yy_win, mm_win, dd_win) != 0)
+ if (calendar_draw(&d, true, yy_win, mm_win, dd_win) != 0)
return (BSDDIALOG_ERROR);
break;
case KEY_CTRL('l'):
case KEY_RESIZE:
- if (calendar_redraw(&d, yy_win, mm_win, dd_win) != 0)
+ if (calendar_draw(&d, true, yy_win, mm_win, dd_win) != 0)
return (BSDDIALOG_ERROR);
break;
default:
@@ -533,11 +533,11 @@ bsddialog_calendar(struct bsddialog_conf *conf, const char *text, int rows,
return (retval);
}
-static int datebox_redraw(struct dialog *d, struct dateitem *di)
+static int datebox_draw(struct dialog *d, bool redraw, struct dateitem *di)
{
int y, x;
- if (d->built) {
+ if (redraw) {
hide_dialog(d);
refresh(); /* Important for decreasing screen */
}
@@ -545,7 +545,7 @@ static int datebox_redraw(struct dialog *d, struct dateitem *di)
return (BSDDIALOG_ERROR);
if (draw_dialog(d) != 0)
return (BSDDIALOG_ERROR);
- if (d->built)
+ if (redraw)
refresh(); /* Important to fix grey lines expanding screen */
TEXTPAD(d, 3 /*windows*/ + HBUTTONS);
@@ -624,7 +624,7 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
set_buttons(&d, true, OK_LABEL, CANCEL_LABEL);
if (build_dateitem(conf->date.format, &yy, &mm, &dd, di) != 0)
return (BSDDIALOG_ERROR);
- if (datebox_redraw(&d, di) != 0)
+ if (datebox_draw(&d, false, di) != 0)
return (BSDDIALOG_ERROR);
sel = -1;
@@ -716,12 +716,12 @@ bsddialog_datebox(struct bsddialog_conf *conf, const char *text, int rows,
break;
if (f1help_dialog(conf) != 0)
return (BSDDIALOG_ERROR);
- if (datebox_redraw(&d, di) != 0)
+ if (datebox_draw(&d, true, di) != 0)
return (BSDDIALOG_ERROR);
break;
case KEY_CTRL('l'):
case KEY_RESIZE:
- if (datebox_redraw(&d, di) != 0)
+ if (datebox_draw(&d, true, di) != 0)
return (BSDDIALOG_ERROR);
break;
default:
diff --git a/contrib/bsddialog/lib/formbox.c b/contrib/bsddialog/lib/formbox.c
index ca473356e350..a072461c43e1 100644
--- a/contrib/bsddialog/lib/formbox.c
+++ b/contrib/bsddialog/lib/formbox.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -601,11 +601,11 @@ static int form_size_position(struct dialog *d, struct privateform *f)
}
static int
-form_redraw(struct dialog *d, struct privateform *f, bool focusinform)
+form_draw(struct dialog *d, bool redraw, struct privateform *f, bool focusinform)
{
unsigned int i;
- if (d->built) {
+ if (redraw) {
hide_dialog(d);
refresh(); /* Important for decreasing screen */
}
@@ -613,9 +613,9 @@ form_redraw(struct dialog *d, struct privateform *f, bool focusinform)
f->w = f->wmin;
if (form_size_position(d, f) != 0)
return (BSDDIALOG_ERROR);
- if (draw_dialog(d) != 0)
+ if (draw_dialog(d) != 0) /* doupdate() in main loop */
return (BSDDIALOG_ERROR);
- if (d->built)
+ if (redraw)
refresh(); /* Important to fix grey lines expanding screen */
TEXTPAD(d, 2 /* box borders */ + f->viewrows + HBUTTONS);
@@ -707,7 +707,7 @@ bsddialog_form(struct bsddialog_conf *conf, const char *text, int rows,
}
form.formheight = formheight;
- if (form_redraw(&d, &form, focusinform) != 0)
+ if (form_draw(&d, false, &form, focusinform) != 0)
return (BSDDIALOG_ERROR);
changeitem = switchfocus = false;
@@ -719,10 +719,16 @@ bsddialog_form(struct bsddialog_conf *conf, const char *text, int rows,
switch(input) {
case KEY_ENTER:
case 10: /* Enter */
- if (focusinform && conf->button.always_active == false)
- break;
- retval = BUTTONVALUE(d.bs);
- loop = false;
+ if (focusinform && conf->button.always_active == false) {
+ next = nextitem(form.nitems, form.pritems, form.sel);
+ if (next > form.sel)
+ changeitem = true; /* needs next */
+ else
+ switchfocus = true;
+ } else {
+ retval = BUTTONVALUE(d.bs);
+ loop = false;
+ }
break;
case 27: /* Esc */
if (conf->key.enable_esc) {
@@ -732,7 +738,12 @@ bsddialog_form(struct bsddialog_conf *conf, const char *text, int rows,
break;
case '\t': /* TAB */
if (focusinform) {
- switchfocus = true;
+ next = nextitem(form.nitems, form.pritems,
+ form.sel);
+ if (next > form.sel)
+ changeitem = true; /* needs next */
+ else
+ switchfocus = true;
} else {
if (d.bs.curr + 1 < (int)d.bs.nbuttons) {
d.bs.curr++;
@@ -839,12 +850,12 @@ bsddialog_form(struct bsddialog_conf *conf, const char *text, int rows,
retval = BSDDIALOG_ERROR;
loop = false;
}
- if (form_redraw(&d, &form, focusinform) != 0)
+ if (form_draw(&d, true, &form, focusinform) != 0)
return (BSDDIALOG_ERROR);
break;
case KEY_CTRL('l'):
case KEY_RESIZE:
- if (form_redraw(&d, &form, focusinform) != 0)
+ if (form_draw(&d, true, &form, focusinform) != 0)
return (BSDDIALOG_ERROR);
break;
default:
@@ -884,11 +895,20 @@ bsddialog_form(struct bsddialog_conf *conf, const char *text, int rows,
conf->button.always_active || !focusinform,
!focusinform);
wnoutrefresh(d.widget);
- DRAWITEM_TRICK(&form, form.sel, focusinform);
+ if (focusinform == false)
+ DRAWITEM_TRICK(&form, form.sel, false);
+ else {
+ next = firstitem(form.nitems, form.pritems);
+ if (next == form.sel)
+ DRAWITEM_TRICK(&form, form.sel, true);
+ else
+ changeitem = true;
+ }
switchfocus = false;
}
if (changeitem) {
+ /* useless after if(switchfocus) */
DRAWITEM_TRICK(&form, form.sel, false);
form.sel = next;
item = &form.pritems[form.sel];
diff --git a/contrib/bsddialog/lib/lib_util.c b/contrib/bsddialog/lib/lib_util.c
index d673a1a74d72..f042a2832eb9 100644
--- a/contrib/bsddialog/lib/lib_util.c
+++ b/contrib/bsddialog/lib/lib_util.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2023 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -25,6 +25,7 @@
* SUCH DAMAGE.
*/
+#include <stdarg.h>
#include <curses.h>
#include <stdlib.h>
#include <string.h>
diff --git a/contrib/bsddialog/lib/lib_util.h b/contrib/bsddialog/lib/lib_util.h
index 526f65b4bfaa..1adc34f3b80a 100644
--- a/contrib/bsddialog/lib/lib_util.h
+++ b/contrib/bsddialog/lib/lib_util.h
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -62,7 +62,7 @@ extern bool hastermcolors;
RETURN_ERROR("*" #p " is NULL"); \
} while (0)
#define CHECK_ARRAY(nitem, a) do { \
- if (nitem > 0 && a == NULL) \
+ if (nitem > 0 && a == NULL) \
RETURN_FMTERROR(#nitem " is %d but *" #a " is NULL", nitem); \
} while (0)
/* widget utils */
diff --git a/contrib/bsddialog/lib/libbsddialog.c b/contrib/bsddialog/lib/libbsddialog.c
index 555d060ebcbd..cdb5e1e251dc 100644
--- a/contrib/bsddialog/lib/libbsddialog.c
+++ b/contrib/bsddialog/lib/libbsddialog.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2023 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -114,11 +114,21 @@ int bsddialog_backtitle(struct bsddialog_conf *conf, const char *backtitle)
mvhline_set(1, 1, WACS_HLINE, SCREENCOLS - 2);
}
- refresh();
+ wnoutrefresh(stdscr);
return (BSDDIALOG_OK);
}
+int bsddialog_backtitle_rf(struct bsddialog_conf *conf, const char *backtitle)
+{
+ int rv;
+
+ rv = bsddialog_backtitle(conf, backtitle);
+ doupdate();
+
+ return (rv);
+}
+
bool bsddialog_inmode(void)
{
return (in_bsddialog_mode);
diff --git a/contrib/bsddialog/lib/menubox.c b/contrib/bsddialog/lib/menubox.c
index 896306b2881d..e6e2e7e3e63e 100644
--- a/contrib/bsddialog/lib/menubox.c
+++ b/contrib/bsddialog/lib/menubox.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -391,7 +391,7 @@ drawitem(struct bsddialog_conf *conf, struct privatemenu *m, int y, bool focus)
attron(t.menu.bottomdesccolor);
addstr(pritem->bottomdesc);
attroff(t.menu.bottomdesccolor);
- refresh();
+ wnoutrefresh(stdscr);
}
}
}
@@ -454,18 +454,18 @@ static int menu_size_position(struct dialog *d, struct privatemenu *m)
return (0);
}
-static int mixedlist_redraw(struct dialog *d, struct privatemenu *m)
+static int mixedlist_draw(struct dialog *d, bool redraw, struct privatemenu *m)
{
- if (d->built) {
+ if (redraw) {
hide_dialog(d);
refresh(); /* Important for decreasing screen */
}
m->menurows = m->apimenurows;
if (menu_size_position(d, m) != 0)
return (BSDDIALOG_ERROR);
- if (draw_dialog(d) != 0)
+ if (draw_dialog(d) != 0) /* doupdate() in main loop */
return (BSDDIALOG_ERROR);
- if (d->built)
+ if (redraw)
refresh(); /* Important to fix grey lines expanding screen */
TEXTPAD(d, 2/*bmenu*/ + m->menurows + HBUTTONS);
@@ -532,7 +532,7 @@ do_mixedlist(struct bsddialog_conf *conf, const char *text, int rows, int cols,
drawitem(d.conf, &m, m.sel, true);
m.ypad = 0;
m.apimenurows = menurows;
- if (mixedlist_redraw(&d, &m) != 0)
+ if (mixedlist_draw(&d, false, &m) != 0)
return (BSDDIALOG_ERROR);
changeitem = false;
@@ -575,12 +575,12 @@ do_mixedlist(struct bsddialog_conf *conf, const char *text, int rows, int cols,
break;
if (f1help_dialog(conf) != 0)
return (BSDDIALOG_ERROR);
- if (mixedlist_redraw(&d, &m) != 0)
+ if (mixedlist_draw(&d, true, &m) != 0)
return (BSDDIALOG_ERROR);
break;
case KEY_CTRL('l'):
case KEY_RESIZE:
- if (mixedlist_redraw(&d, &m) != 0)
+ if (mixedlist_draw(&d, true, &m) != 0)
return (BSDDIALOG_ERROR);
break;
}
diff --git a/contrib/bsddialog/lib/messagebox.c b/contrib/bsddialog/lib/messagebox.c
index 5132b1b089b8..c3d4a20f5404 100644
--- a/contrib/bsddialog/lib/messagebox.c
+++ b/contrib/bsddialog/lib/messagebox.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -69,19 +69,19 @@ static int message_size_position(struct dialog *d, int *htext)
return (0);
}
-static int message_draw(struct dialog *d, struct scroll *s)
+static int message_draw(struct dialog *d, bool redraw, struct scroll *s)
{
int unused;
- if (d->built) {
+ if (redraw) { /* redraw: RESIZE or F1 */
hide_dialog(d);
refresh(); /* Important for decreasing screen */
}
if (message_size_position(d, &s->htext) != 0)
return (BSDDIALOG_ERROR);
- if (draw_dialog(d) != 0)
+ if (draw_dialog(d) != 0) /* doupdate() in main loop */
return (BSDDIALOG_ERROR);
- if (d->built)
+ if (redraw)
refresh(); /* Important to fix grey lines expanding screen */
s->printrows = d->h - BORDER - HBUTTONS - BORDER;
@@ -106,7 +106,7 @@ do_message(struct bsddialog_conf *conf, const char *text, int rows, int cols,
return (BSDDIALOG_ERROR);
set_buttons(&d, true, oklabel, cancellabel);
s.htext = -1;
- if (message_draw(&d, &s) != 0)
+ if (message_draw(&d, false, &s) != 0)
return (BSDDIALOG_ERROR);
loop = true;
@@ -170,12 +170,12 @@ do_message(struct bsddialog_conf *conf, const char *text, int rows, int cols,
break;
if (f1help_dialog(d.conf) != 0)
return (BSDDIALOG_ERROR);
- if (message_draw(&d, &s) != 0)
+ if (message_draw(&d, true, &s) != 0)
return (BSDDIALOG_ERROR);
break;
case KEY_CTRL('l'):
case KEY_RESIZE:
- if (message_draw(&d, &s) != 0)
+ if (message_draw(&d, true, &s) != 0)
return (BSDDIALOG_ERROR);
break;
default:
diff --git a/contrib/bsddialog/lib/slider.c b/contrib/bsddialog/lib/slider.c
new file mode 100644
index 000000000000..534253470849
--- /dev/null
+++ b/contrib/bsddialog/lib/slider.c
@@ -0,0 +1,670 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2025 Braulio Rivas
+ *
+ * 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.
+ */
+
+#include <curses.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "bsddialog.h"
+#include "bsddialog_theme.h"
+#include "lib_util.h"
+
+#define MINHSLIDER 13
+#define MINWSLIDER 36
+
+#define NULLWIN -1
+#define START_WIN 0
+#define END_WIN 1
+#define STEP_WIN 2
+#define SLIDER_WIN 3
+#define NWIN 4
+
+enum operation {
+ MOVERIGHT,
+ MOVEFARRIGHT,
+ MOVEFASTRIGHT,
+ MOVELEFT,
+ MOVEFARLEFT,
+ MOVEFASTLEFT,
+ INCREASELEFT,
+ DECREASELEFT,
+ INCREASERIGHT,
+ DECREASERIGHT,
+ INCREASESTEP,
+ DECREASESTEP,
+};
+
+struct sliderctl {
+ enum operation op;
+ unsigned long (*spaces)[2];
+ int nspaces; /* api unsigned, but segfault handlesliderctl():MOVELEFT */
+ unsigned long length;
+ unsigned long *start;
+ unsigned long *end;
+ unsigned long step;
+};
+
+static int crashes(long x, long y, long a, long b)
+{
+ return ((x <= a && a <= y) || (x <= b && b <= y));
+}
+
+static int fits(long x, long y, long a, long b)
+{
+ return ((x <= a) && (b <= y));
+}
+
+static void handlesliderctl(struct sliderctl *sliderctl)
+{
+ int i, step, tmpstep;
+ unsigned long x, y, size, old_start, old_end;
+ signed long new_start, new_end;
+
+ step = sliderctl->step;
+ old_start = *(sliderctl->start);
+ new_start = old_start;
+ old_end = *(sliderctl->end);
+ new_end = old_end;
+ size = old_end - old_start + 1;
+
+ switch (sliderctl->op) {
+ case MOVERIGHT:
+ new_start = old_start + step;
+ new_end = old_end + step;
+
+ for (i = 0; i < sliderctl->nspaces; i++) {
+ x = (sliderctl->spaces)[i][0];
+ y = (sliderctl->spaces)[i][1];
+
+ if (crashes(x, y, new_start, new_end)) {
+ new_start = y + 1;
+ new_end = new_start + size - 1;
+ break;
+ }
+ }
+ break;
+ case MOVELEFT:
+ new_start = old_start - step;
+ new_end = old_end - step;
+
+ for (i = sliderctl->nspaces - 1; i >= 0; i--) {
+ x = (sliderctl->spaces)[i][0];
+ y = (sliderctl->spaces)[i][1];
+
+ if (crashes(x, y, new_start, new_end)) {
+ new_end = x - 1;
+ new_start = new_end - size + 1;
+ break;
+ }
+ }
+ break;
+ case INCREASELEFT:
+ new_start = old_start + step;
+ break;
+ case DECREASELEFT:
+ new_start = old_start - step;
+ for (i = 0; i < sliderctl->nspaces; i++) {
+ x = (sliderctl->spaces)[i][0];
+ y = (sliderctl->spaces)[i][1];
+
+ if (crashes(x, y, new_start, new_end)) {
+ new_start = old_start;
+ break;
+ }
+ }
+ break;
+ case INCREASERIGHT:
+ new_end = old_end + step;
+ for (i = 0; i < sliderctl->nspaces; i++) {
+ x = (sliderctl->spaces)[i][0];
+ y = (sliderctl->spaces)[i][1];
+
+ if (crashes(x, y, new_start, new_end)) {
+ new_end = old_end;
+ break;
+ }
+ }
+ break;
+ case DECREASERIGHT:
+ new_end = old_end - step;
+ break;
+ case MOVEFARLEFT:
+ new_start = 0;
+ new_end = size - 1;
+ for (i = 0; i < sliderctl->nspaces; i++) {
+ x = (sliderctl->spaces)[i][0];
+ y = (sliderctl->spaces)[i][1];
+
+ if (crashes(x, y, new_start, new_end)) {
+ new_start = y + 1;
+ new_end = new_start + size - 1;
+ break;
+ }
+ }
+ break;
+ case MOVEFARRIGHT:
+ new_end = (sliderctl->length) - 1;
+ new_start = new_end - size + 1;
+ for (i = sliderctl->nspaces - 1; i >= 0; i--) {
+ x = (sliderctl->spaces)[i][0];
+ y = (sliderctl->spaces)[i][1];
+
+ if (crashes(x, y, new_start, new_end)) {
+ new_end = x - 1;
+ new_start = new_end - size + 1;
+ break;
+ }
+ }
+ break;
+ case MOVEFASTLEFT:
+ if (size < 10) {
+ tmpstep = 1;
+ } else {
+ tmpstep = ((sliderctl->length) * 10) / 100;
+ }
+ new_start = old_start - tmpstep;
+ new_end = old_end - tmpstep;
+
+ for (i = sliderctl->nspaces - 1; i >= 0; i--) {
+ x = (sliderctl->spaces)[i][0];
+ y = (sliderctl->spaces)[i][1];
+
+ if (crashes(x, y, new_start, new_end)) {
+ new_end = x - 1;
+ new_start = new_end - size + 1;
+ break;
+ }
+ }
+ break;
+ case MOVEFASTRIGHT:
+ if (size < 10) {
+ tmpstep = 1;
+ } else {
+ tmpstep = ((sliderctl->length) * 10) / 100;
+ }
+ new_start = old_start + tmpstep;
+ new_end = old_end + tmpstep;
+
+ for (i = 0; i < sliderctl->nspaces; i++) {
+ x = (sliderctl->spaces)[i][0];
+ y = (sliderctl->spaces)[i][1];
+
+ if (crashes(x, y, new_start, new_end)) {
+ new_start = y + 1;
+ new_end = new_start + size - 1;
+ break;
+ }
+ }
+ break;
+ case INCREASESTEP:
+ ++step;
+ break;
+ case DECREASESTEP:
+ if (step > 1) {
+ --step;
+ }
+ break;
+ }
+
+ if (fits(0, (sliderctl->length) - 1, new_start, new_end) != 1) {
+ new_start = old_start;
+ new_end = old_end;
+ }
+
+ if (new_start > new_end) {
+ new_start = old_start;
+ new_end = old_end;
+ }
+
+ sliderctl->step = step;
+
+ *(sliderctl->start) = new_start;
+ *(sliderctl->end) = new_end;
+}
+
+static void
+drawsquare(struct bsddialog_conf *conf, WINDOW *win, enum elevation elev,
+ bool focus, const char *fmt, unsigned long value)
+{
+ int h, l, w;
+
+ getmaxyx(win, h, w);
+ draw_borders(conf, win, elev);
+ if (focus) {
+ l = 2 + w % 2;
+ wattron(win, t.dialog.arrowcolor);
+ mvwhline(win, 0, w / 2 - l / 2, UARROW(conf), l);
+ mvwhline(win, h - 1, w / 2 - l / 2, DARROW(conf), l);
+ wattroff(win, t.dialog.arrowcolor);
+ }
+
+ if (focus)
+ wattron(win, t.menu.f_namecolor);
+
+ mvwprintw(win, 1, 1, fmt, value);
+
+ if (focus)
+ wattroff(win, t.menu.f_namecolor);
+
+ wnoutrefresh(win);
+}
+
+static void
+print_slider(struct bsddialog_conf *conf, WINDOW *win,
+ unsigned long spaces[][2], int nspaces, unsigned long length,
+ unsigned long *start, unsigned long *end, bool active)
+{
+ int i, y, x, l, height, width;
+ unsigned long s, e;
+ chtype ch;
+
+ getmaxyx(win, height, width);
+ wclear(win);
+ draw_borders(conf, win, RAISED);
+
+ if (active) {
+ wattron(win, t.dialog.arrowcolor);
+ mvwvline(win, 1, 0, LARROW(conf), 1);
+ mvwvline(win, 1, width - 1, RARROW(conf), 1);
+ wattroff(win, t.dialog.arrowcolor);
+ }
+
+ y = height / 2;
+ width -= 1;
+
+ ch = ' ' | bsddialog_color(BSDDIALOG_RED, BSDDIALOG_RED, 0);
+ for (i = 0; i < nspaces; i++) {
+ s = spaces[i][0];
+ e = spaces[i][1];
+
+ x = (s * width) / length;
+ l = ((e - s) * width) / length;
+
+ if ((e - s) == 0) {
+ l = 0;
+ } else if (l == 0) {
+ l = 1;
+ }
+
+ mvwhline(win, y, x + 1, ch, l);
+ }
+
+ ch = ' ' | t.bar.f_color;
+ s = ((*start) * width) / length;
+ l = (((*end) - (*start)) * width) / length;
+ if ((*end - *start) == 0) {
+ l = 0;
+ } else if (l == 0) {
+ l = 1;
+ }
+ mvwhline(win, y, s + 1, ch, l);
+
+ wnoutrefresh(win);
+}
+
+static int
+slider_draw(struct dialog *d, bool redraw, WINDOW *start_win, WINDOW *end_win,
+ WINDOW *size_win, WINDOW *step_win, WINDOW *slider_win, const char *unit)
+{
+ char *buf;
+ int yslider, xslider;
+
+ if (redraw) {
+ hide_dialog(d);
+ refresh(); /* Important for decreasing screen */
+ }
+ if (dialog_size_position(d, MINHSLIDER, MINWSLIDER, NULL) != 0)
+ return (BSDDIALOG_ERROR);
+ if (draw_dialog(d) != 0) /* doupdate in main loop */
+ return (BSDDIALOG_ERROR);
+ if (redraw)
+ refresh(); /* Important to fix grey lines expanding screen */
+ TEXTPAD(d, MINHSLIDER + HBUTTONS);
+
+ yslider = d->y + d->h - 15;
+ xslider = d->x + d->w / 2 - 17;
+ asprintf(&buf, "Start (%s)", unit);
+ mvwaddstr(d->widget, d->h - 16, d->w / 2 - 17, buf);
+ free(buf);
+ update_box(d->conf, start_win, yslider, xslider, 3, 17, RAISED);
+ asprintf(&buf, "End (%s)", unit);
+ mvwaddstr(d->widget, d->h - 16, d->w / 2, buf);
+ free(buf);
+ update_box(d->conf, end_win, yslider, xslider + 17, 3, 17, RAISED);
+ asprintf(&buf, "Size (%s)", unit);
+ mvwaddstr(d->widget, d->h - 12, d->w / 2 - 17, buf);
+ free(buf);
+ update_box(d->conf, size_win, yslider + 4, xslider, 3, 17, RAISED);
+ asprintf(&buf, "Step (%s)", unit);
+ mvwaddstr(d->widget, d->h - 12, d->w / 2, buf);
+ free(buf);
+ update_box(d->conf, step_win, yslider + 4, xslider + 17, 3, 17, RAISED);
+
+ update_box(d->conf, slider_win, yslider + 7, xslider, 3, 34, RAISED);
+ wnoutrefresh(d->widget);
+
+ return (0);
+}
+
+/* API */
+int
+bsddialog_slider(struct bsddialog_conf *conf, const char *text, int rows,
+ int cols, const char *unit, unsigned long length, unsigned long *start,
+ unsigned long *end, bool resize, unsigned int nblocks,
+ unsigned long blocks[][2])
+{
+ struct sliderctl ctl;
+ bool loop, focusbuttons;
+ int retval, sel;
+ wint_t input;
+ unsigned long size;
+ WINDOW *start_win, *end_win, *size_win, *step_win, *slider_win;
+ struct dialog dialog;
+
+ CHECK_PTR(start);
+ CHECK_PTR(end);
+
+ ctl.spaces = blocks;
+ ctl.nspaces = nblocks;
+ ctl.length = length;
+ ctl.start = start;
+ ctl.end = end;
+ ctl.step = 1;
+
+ if (prepare_dialog(conf, text, rows, cols, &dialog) != 0)
+ return (BSDDIALOG_ERROR);
+ set_buttons(&dialog, true, OK_LABEL, CANCEL_LABEL);
+
+ if ((start_win = newwin(1, 1, 1, 1)) == NULL)
+ RETURN_ERROR("Cannot build WINDOW for start");
+ wbkgd(start_win, t.dialog.color);
+
+ if ((end_win = newwin(1, 1, 1, 1)) == NULL)
+ RETURN_ERROR("Cannot build WINDOW for end");
+ wbkgd(end_win, t.dialog.color);
+
+ if ((step_win = newwin(1, 1, 1, 1)) == NULL)
+ RETURN_ERROR("Cannot build WINDOW for step");
+ wbkgd(step_win, t.dialog.color);
+
+ if ((size_win = newwin(1, 1, 1, 1)) == NULL)
+ RETURN_ERROR("Cannot build WINDOW for size");
+ wbkgd(size_win, t.dialog.color);
+
+ if ((slider_win = newwin(1, 1, 1, 1)) == NULL)
+ RETURN_ERROR("Cannot build WINDOW for slider");
+ wbkgd(slider_win, t.dialog.color);
+
+ if (slider_draw(&dialog, false, start_win, end_win, size_win, step_win,
+ slider_win, unit) != 0)
+ return (BSDDIALOG_ERROR);
+
+ sel = NULLWIN;
+ loop = focusbuttons = true;
+ while (loop) {
+ size = *(ctl.end) - *(ctl.start) + 1;
+ drawsquare(conf, start_win, RAISED, sel == START_WIN, "%15lu", *start);
+ drawsquare(conf, end_win, RAISED, sel == END_WIN, "%15lu", *end);
+ drawsquare(conf, size_win, RAISED, 0, "%15lu", size);
+ drawsquare(conf, step_win, RAISED, sel == STEP_WIN, "%15d", ctl.step);
+ print_slider(conf, slider_win, blocks, nblocks, length, start,
+ end, sel == SLIDER_WIN);
+ doupdate();
+
+ if (get_wch(&input) == ERR)
+ continue;
+ switch (input) {
+ case KEY_ENTER:
+ case 10: /* Enter */
+ if (focusbuttons || conf->button.always_active) {
+ retval = BUTTONVALUE(dialog.bs);
+ loop = false;
+ }
+ break;
+ case 27: /* Esc */
+ if (conf->key.enable_esc) {
+ retval = BSDDIALOG_ESC;
+ loop = false;
+ }
+ break;
+ case '\t': /* TAB */
+ if (focusbuttons) {
+ dialog.bs.curr++;
+ if (dialog.bs.curr >= (int)dialog.bs.nbuttons) {
+ focusbuttons = false;
+ sel = START_WIN;
+ dialog.bs.curr =
+ conf->button.always_active ? 0 : -1;
+ }
+ } else {
+ sel++;
+ if ((sel + 1) > NWIN) {
+ focusbuttons = true;
+ sel = NULLWIN;
+ dialog.bs.curr = 0;
+ }
+ }
+ DRAW_BUTTONS(dialog);
+ break;
+ case KEY_CTRL('n'):
+ case KEY_RIGHT:
+ if (focusbuttons) {
+ dialog.bs.curr++;
+ if (dialog.bs.curr >= (int)dialog.bs.nbuttons) {
+ focusbuttons = false;
+ sel = START_WIN;
+ dialog.bs.curr =
+ conf->button.always_active ? 0 : -1;
+ }
+ } else if (sel == SLIDER_WIN) {
+ ctl.op = MOVERIGHT;
+ handlesliderctl(&ctl);
+ } else {
+ sel++;
+ }
+ DRAW_BUTTONS(dialog);
+ break;
+ case KEY_CTRL('p'):
+ case KEY_LEFT:
+ if (focusbuttons) {
+ dialog.bs.curr--;
+ if (dialog.bs.curr < 0) {
+ focusbuttons = false;
+ sel = SLIDER_WIN;
+ dialog.bs.curr =
+ conf->button.always_active ? 0 : -1;
+ }
+ } else if (sel == SLIDER_WIN) {
+ ctl.op = MOVELEFT;
+ handlesliderctl(&ctl);
+ } else if (sel == END_WIN) {
+ sel = START_WIN;
+ } else {
+ focusbuttons = true;
+ sel = NULLWIN;
+ dialog.bs.curr = 0;
+ }
+ DRAW_BUTTONS(dialog);
+ break;
+ case KEY_UP:
+ if (focusbuttons) {
+ sel = SLIDER_WIN;
+ focusbuttons = false;
+ dialog.bs.curr =
+ conf->button.always_active ? 0 : -1;
+ DRAW_BUTTONS(dialog);
+ } else if (sel == START_WIN) {
+ if (resize) {
+ ctl.op = INCREASELEFT;
+ } else {
+ ctl.op = MOVERIGHT;
+ }
+ handlesliderctl(&ctl);
+ } else if (sel == END_WIN) {
+ if (resize) {
+ ctl.op = INCREASERIGHT;
+ } else {
+ ctl.op = MOVERIGHT;
+ }
+ handlesliderctl(&ctl);
+ } else if (sel == STEP_WIN) {
+ ctl.op = INCREASESTEP;
+ handlesliderctl(&ctl);
+ }
+ break;
+ case KEY_DOWN:
+ if (focusbuttons) {
+ break;
+ } else if (sel == START_WIN) {
+ if (resize) {
+ ctl.op = DECREASELEFT;
+ } else {
+ ctl.op = MOVELEFT;
+ }
+ handlesliderctl(&ctl);
+ } else if (sel == END_WIN) {
+ if (resize) {
+ ctl.op = DECREASERIGHT;
+ } else {
+ ctl.op = MOVELEFT;
+ }
+ handlesliderctl(&ctl);
+ } else if (sel == STEP_WIN) {
+ ctl.op = DECREASESTEP;
+ handlesliderctl(&ctl);
+ }
+ break;
+ case '-':
+ if (focusbuttons) {
+ break;
+ } else if (sel == START_WIN) {
+ if (resize) {
+ ctl.op = DECREASELEFT;
+ } else {
+ ctl.op = MOVELEFT;
+ }
+ handlesliderctl(&ctl);
+ } else if (sel == END_WIN) {
+ if (resize) {
+ ctl.op = DECREASERIGHT;
+ } else {
+ ctl.op = MOVELEFT;
+ }
+ handlesliderctl(&ctl);
+ } else if (sel == STEP_WIN) {
+ ctl.op = DECREASESTEP;
+ handlesliderctl(&ctl);
+ }
+ break;
+ case '+':
+ if (focusbuttons) {
+ break;
+ } else if (sel == START_WIN) {
+ if (resize) {
+ ctl.op = INCREASELEFT;
+ } else {
+ ctl.op = MOVERIGHT;
+ }
+ handlesliderctl(&ctl);
+ } else if (sel == END_WIN) {
+ if (resize) {
+ ctl.op = INCREASERIGHT;
+ } else {
+ ctl.op = MOVERIGHT;
+ }
+ handlesliderctl(&ctl);
+ } else if (sel == STEP_WIN) {
+ ctl.op = INCREASESTEP;
+ handlesliderctl(&ctl);
+ }
+ break;
+ case KEY_HOME:
+ if (focusbuttons) {
+ break;
+ } else if (sel == SLIDER_WIN) {
+ ctl.op = MOVEFARLEFT;
+ handlesliderctl(&ctl);
+ }
+ break;
+ case KEY_END:
+ if (focusbuttons) {
+ break;
+ } else if (sel == SLIDER_WIN) {
+ ctl.op = MOVEFARRIGHT;
+ handlesliderctl(&ctl);
+ }
+ break;
+ case KEY_PPAGE:
+ if (focusbuttons) {
+ break;
+ } else if (sel == SLIDER_WIN) {
+ ctl.op = MOVEFASTLEFT;
+ handlesliderctl(&ctl);
+ }
+ break;
+ case KEY_NPAGE:
+ if (focusbuttons) {
+ break;
+ } else if (sel == SLIDER_WIN) {
+ ctl.op = MOVEFASTRIGHT;
+ handlesliderctl(&ctl);
+ }
+ break;
+ case KEY_F(1):
+ if (conf->key.f1_file == NULL &&
+ conf->key.f1_message == NULL)
+ break;
+ if (f1help_dialog(conf) != 0)
+ return (BSDDIALOG_ERROR);
+ if (slider_draw(&dialog, true, start_win, end_win, size_win,
+ step_win, slider_win, unit) != 0)
+ return (BSDDIALOG_ERROR);
+ break;
+ case KEY_CTRL('l'):
+ case KEY_RESIZE:
+ if (slider_draw(&dialog, true, start_win, end_win, size_win,
+ step_win, slider_win, unit) != 0)
+ return (BSDDIALOG_ERROR);
+ break;
+ default:
+ if (shortcut_buttons(input, &dialog.bs)) {
+ DRAW_BUTTONS(dialog);
+ doupdate();
+ retval = BUTTONVALUE(dialog.bs);
+ loop = false;
+ }
+ }
+ }
+
+ delwin(start_win);
+ delwin(end_win);
+ delwin(step_win);
+ delwin(slider_win);
+ end_dialog(&dialog);
+
+ return (retval);
+}
diff --git a/contrib/bsddialog/lib/textbox.c b/contrib/bsddialog/lib/textbox.c
index ca3eb69fff52..1f730e0d925b 100644
--- a/contrib/bsddialog/lib/textbox.c
+++ b/contrib/bsddialog/lib/textbox.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -101,17 +101,17 @@ static int textbox_size_position(struct dialog *d, struct scrolltext *st)
return (0);
}
-static int textbox_draw(struct dialog *d, struct scrolltext *st)
+static int textbox_draw(struct dialog *d, bool redraw, struct scrolltext *st)
{
- if (d->built) {
+ if (redraw) {
hide_dialog(d);
refresh(); /* Important for decreasing screen */
}
if (textbox_size_position(d, st) != 0)
return (BSDDIALOG_ERROR);
- if (draw_dialog(d) != 0)
+ if (draw_dialog(d) != 0) /* wrefresh() and prefresh() in main loop */
return (BSDDIALOG_ERROR);
- if (d->built)
+ if (redraw)
refresh(); /* Important to fix grey lines expanding screen */
st->ys = d->y + 1;
@@ -175,7 +175,7 @@ bsddialog_textbox(struct bsddialog_conf *conf, const char *file, int rows,
fclose(fp);
set_tabsize(defaulttablen); /* reset because it is curses global */
- if (textbox_draw(&d, &st) != 0)
+ if (textbox_draw(&d, false, &st) != 0)
return (BSDDIALOG_ERROR);
loop = true;
@@ -254,12 +254,12 @@ bsddialog_textbox(struct bsddialog_conf *conf, const char *file, int rows,
break;
if (f1help_dialog(conf) != 0)
return (BSDDIALOG_ERROR);
- if (textbox_draw(&d, &st) != 0)
+ if (textbox_draw(&d, true, &st) != 0)
return (BSDDIALOG_ERROR);
break;
case KEY_CTRL('l'):
case KEY_RESIZE:
- if (textbox_draw(&d, &st) != 0)
+ if (textbox_draw(&d, true, &st) != 0)
return (BSDDIALOG_ERROR);
break;
}
diff --git a/contrib/bsddialog/lib/theme.c b/contrib/bsddialog/lib/theme.c
index 04f85b2455fa..6c17d908324b 100644
--- a/contrib/bsddialog/lib/theme.c
+++ b/contrib/bsddialog/lib/theme.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2023 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -217,7 +217,7 @@ int bsddialog_set_theme(struct bsddialog_theme *theme)
{
CHECK_PTR(theme);
set_theme(&t, theme);
- refresh();
+ wnoutrefresh(stdscr);
return (BSDDIALOG_OK);
}
@@ -239,7 +239,7 @@ int bsddialog_set_default_theme(enum bsddialog_default_theme newtheme)
"to use enum bsddialog_default_theme",
newtheme);
}
- refresh();
+ wnoutrefresh(stdscr);
return (BSDDIALOG_OK);
}
diff --git a/contrib/bsddialog/lib/timebox.c b/contrib/bsddialog/lib/timebox.c
index 1421cd7d2b81..603d5fa5d7a3 100644
--- a/contrib/bsddialog/lib/timebox.c
+++ b/contrib/bsddialog/lib/timebox.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
+ * Copyright (c) 2021-2025 Alfonso Sabato Siciliano
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -62,19 +62,19 @@ drawsquare(struct bsddialog_conf *conf, WINDOW *win, unsigned int value,
wnoutrefresh(win);
}
-static int timebox_redraw(struct dialog *d, struct clock *c)
+static int timebox_draw(struct dialog *d, bool redraw, struct clock *c)
{
int y, x;
- if (d->built) {
+ if (redraw) {
hide_dialog(d);
refresh(); /* Important for decreasing screen */
}
if (dialog_size_position(d, HBOX, MINWTIME, NULL) != 0)
return (BSDDIALOG_ERROR);
- if (draw_dialog(d) != 0)
+ if (draw_dialog(d) != 0) /* doupdate() in mail loop */
return (BSDDIALOG_ERROR);
- if (d->built)
+ if (redraw)
refresh(); /* Important to fix grey lines expanding screen */
TEXTPAD(d, HBOX + HBUTTONS);
@@ -117,7 +117,7 @@ bsddialog_timebox(struct bsddialog_conf *conf, const char* text, int rows,
wbkgd(c[i].win, t.dialog.color);
c[i].value = MIN(c[i].value, c[i].max);
}
- if (timebox_redraw(&d, c) != 0)
+ if (timebox_draw(&d, false, c) != 0)
return (BSDDIALOG_ERROR);
sel = -1;
@@ -210,12 +210,12 @@ bsddialog_timebox(struct bsddialog_conf *conf, const char* text, int rows,
break;
if (f1help_dialog(conf) != 0)
return (BSDDIALOG_ERROR);
- if (timebox_redraw(&d, c) != 0)
+ if (timebox_draw(&d, true, c) != 0)
return (BSDDIALOG_ERROR);
break;
case KEY_CTRL('l'):
case KEY_RESIZE:
- if (timebox_redraw(&d, c) != 0)
+ if (timebox_draw(&d, true, c) != 0)
return (BSDDIALOG_ERROR);
break;
default: