2012-07-14 03:16:57 +00:00
|
|
|
if [ ! "$_DIALOG_SUBR" ]; then _DIALOG_SUBR=1
|
|
|
|
#
|
2013-01-07 00:18:03 +00:00
|
|
|
# Copyright (c) 2006-2013 Devin Teske
|
2013-07-07 18:21:30 +00:00
|
|
|
# All rights reserved.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# 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
|
2013-07-07 18:51:44 +00:00
|
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
2012-07-14 03:16:57 +00:00
|
|
|
# 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
|
2013-07-07 18:51:44 +00:00
|
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
2012-07-14 03:16:57 +00:00
|
|
|
# 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.
|
|
|
|
#
|
|
|
|
# $FreeBSD$
|
|
|
|
#
|
|
|
|
############################################################ INCLUDES
|
|
|
|
|
2012-09-18 22:28:42 +00:00
|
|
|
BSDCFG_SHARE="/usr/share/bsdconfig"
|
|
|
|
. $BSDCFG_SHARE/common.subr || exit 1
|
2012-12-25 10:47:45 +00:00
|
|
|
f_dprintf "%s: loading includes..." dialog.subr
|
2012-09-18 22:28:42 +00:00
|
|
|
f_include $BSDCFG_SHARE/strings.subr
|
2013-01-07 00:15:52 +00:00
|
|
|
f_include $BSDCFG_SHARE/variable.subr
|
2012-09-18 22:28:42 +00:00
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
BSDCFG_LIBE="/usr/libexec/bsdconfig"
|
|
|
|
f_include_lang $BSDCFG_LIBE/include/messages.subr
|
|
|
|
|
|
|
|
############################################################ CONFIGURATION
|
|
|
|
|
|
|
|
#
|
2012-09-20 23:44:13 +00:00
|
|
|
# Default file descriptor to link to stdout for dialog(1) passthru allowing
|
|
|
|
# execution of dialog from within a sub-shell (so-long as its standard output
|
|
|
|
# is explicitly redirected to this file descriptor).
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
2012-12-21 19:26:17 +00:00
|
|
|
: ${DIALOG_TERMINAL_PASSTHRU_FD:=${TERMINAL_STDOUT_PASSTHRU:-3}}
|
2012-07-14 03:16:57 +00:00
|
|
|
|
|
|
|
############################################################ GLOBALS
|
|
|
|
|
|
|
|
#
|
|
|
|
# Default name of dialog(1) utility
|
|
|
|
# NOTE: This is changed to "Xdialog" by the optional `-X' argument
|
|
|
|
#
|
|
|
|
DIALOG="dialog"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Default dialog(1) title and backtitle text
|
|
|
|
#
|
|
|
|
DIALOG_TITLE="$pgm"
|
|
|
|
DIALOG_BACKTITLE="bsdconfig"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Settings used while interacting with dialog(1)
|
|
|
|
#
|
|
|
|
DIALOG_MENU_TAGS="123456789ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyz"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Declare that we are fully-compliant with Xdialog(1) by unset'ing all
|
|
|
|
# compatibility settings.
|
|
|
|
#
|
|
|
|
unset XDIALOG_HIGH_DIALOG_COMPAT
|
|
|
|
unset XDIALOG_FORCE_AUTOSIZE
|
|
|
|
unset XDIALOG_INFOBOX_TIMEOUT
|
|
|
|
|
|
|
|
#
|
2012-11-27 22:11:53 +00:00
|
|
|
# Default behavior is to call f_dialog_init() automatically when loaded.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
: ${DIALOG_SELF_INITIALIZE=1}
|
|
|
|
|
2012-12-29 00:01:24 +00:00
|
|
|
#
|
|
|
|
# Default terminal size (used if/when running without a controlling terminal)
|
|
|
|
#
|
|
|
|
: ${DEFAULT_TERMINAL_SIZE:=24 80}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
#
|
|
|
|
# Minimum width(s) for various dialog(1) implementations (sensible global
|
|
|
|
# default(s) for all widgets of a given variant)
|
|
|
|
#
|
|
|
|
: ${DIALOG_MIN_WIDTH:=24}
|
|
|
|
: ${XDIALOG_MIN_WIDTH:=35}
|
|
|
|
|
|
|
|
#
|
|
|
|
# When manually sizing Xdialog(1) widgets such as calendar and timebox, you'll
|
|
|
|
# need to know the size of the embedded GUI objects because the height passed
|
|
|
|
# to Xdialog(1) for these widgets has to be tall enough to accomodate them.
|
|
|
|
#
|
|
|
|
# These values are helpful when manually sizing with dialog(1) too, but in a
|
|
|
|
# different way. dialog(1) does not make you accomodate the custom items in the
|
|
|
|
# height (but does for width) -- a height of 3 will display three lines and a
|
|
|
|
# full calendar, for example (whereas Xdialog will truncate the calendar if
|
|
|
|
# given a height of 3). For dialog(1), use these values for making sure that
|
|
|
|
# the height does not exceed max_height (obtained by f_dialog_max_size()).
|
|
|
|
#
|
|
|
|
DIALOG_CALENDAR_HEIGHT=15
|
|
|
|
DIALOG_TIMEBOX_HEIGHT=6
|
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
############################################################ GENERIC FUNCTIONS
|
|
|
|
|
Improve portion of the dialog(1) API in dialog.subr responsible for
retrieving stored data (for the --menu, --calendar, --timebox, --checklist,
and --radiolist widgets).
When we (Ron McDowell and I) developed the first version of bsdconfig, it
used temporary files to store responses from dialog(1). That hasn't been
true for some very long time, so the need to always store the return status
of dialog(1) and then call some function to clean-up is long-deprecated. The
function that used to do the clean-up was f_dialog_menutag().
We really don't need f_dialog_menutag() for its originally designed purpose,
as all dialog invocations (even when in a sub-shell) do not use temporary
files anymore.
However, we do need to keep f_dialog_menutag() around because it still fills
the need of being able to abstract the procedure for fetching stored data
provided by functions that display the aforementioned widgets.
In re-designing f_dialog_menutag(), four important changes are made:
1. Rename f_dialog_menutag() to f_dialog_menutag_fetch()
2. Introduce the new first-argument of $var_to_set to reduce number of forks
3. Create a corresponding f_dialog_menutag_store() to abstract the storage
4. Offload the sanitization to a new function, f_dialog_data_sanitize()
NOTE: That last one is important. Not all functions need to store their data
for later fetching, meanwhile every invocation of dialog should be sanitized
(as we learned early-on in the i18n-effort -- underlying libraries will spit
warnings to stderr for bad values of $LANG and since dialog outputs its
responses to stderr, we need to sanitize every response of these warnings).
These changes greatly improve readbaility and also improve performance by
reducing unnecessary forking.
2013-06-01 23:58:44 +00:00
|
|
|
# f_dialog_data_sanitize $var_to_edit ...
|
|
|
|
#
|
|
|
|
# When using dialog(1) or Xdialog(1) sometimes unintended warnings or errors
|
|
|
|
# are generated from underlying libraries. For example, if $LANG is set to an
|
|
|
|
# invalid or unknown locale, the warnings from the Xdialog(1) libraries will
|
|
|
|
# clutter the output. This function helps by providing a centralied function
|
|
|
|
# that removes spurious warnings from the dialog(1) (or Xdialog(1)) response.
|
|
|
|
#
|
|
|
|
# Simply pass the name of one or more variables that need to be sanitized.
|
|
|
|
# After execution, the variables will hold their newly-sanitized data.
|
|
|
|
#
|
|
|
|
f_dialog_data_sanitize()
|
|
|
|
{
|
|
|
|
if [ "$#" -eq 0 ]; then
|
|
|
|
f_dprintf "%s: called with zero arguments" \
|
|
|
|
f_dialog_response_sanitize
|
|
|
|
return $FAILURE
|
|
|
|
fi
|
|
|
|
|
|
|
|
local __var_to_edit
|
|
|
|
for __var_to_edit in $*; do
|
|
|
|
# Skip warnings and trim leading/trailing whitespace
|
|
|
|
setvar $__var_to_edit "$( f_getvar $__var_to_edit | awk '
|
|
|
|
BEGIN { data = 0 }
|
|
|
|
{
|
|
|
|
if ( ! data )
|
|
|
|
{
|
|
|
|
if ( $0 ~ /^$/ ) next
|
|
|
|
if ( $0 ~ /^Gdk-WARNING \*\*:/ ) next
|
|
|
|
data = 1
|
|
|
|
}
|
|
|
|
print
|
|
|
|
}
|
|
|
|
' )"
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2013-06-02 05:45:25 +00:00
|
|
|
# f_dialog_line_sanitize $var_to_edit ...
|
|
|
|
#
|
|
|
|
# When using dialog(1) or Xdialog(1) sometimes unintended warnings or errors
|
|
|
|
# are generated from underlying libraries. For example, if $LANG is set to an
|
|
|
|
# invalid or unknown locale, the warnings from the Xdialog(1) libraries will
|
|
|
|
# clutter the output. This function helps by providing a centralied function
|
|
|
|
# that removes spurious warnings from the dialog(1) (or Xdialog(1)) response.
|
|
|
|
#
|
|
|
|
# Simply pass the name of one or more variables that need to be sanitized.
|
|
|
|
# After execution, the variables will hold their newly-sanitized data.
|
|
|
|
#
|
|
|
|
# This function, unlike f_dialog_data_sanitize(), also removes leading/trailing
|
|
|
|
# whitespace from each line.
|
|
|
|
#
|
|
|
|
f_dialog_line_sanitize()
|
|
|
|
{
|
|
|
|
if [ "$#" -eq 0 ]; then
|
|
|
|
f_dprintf "%s: called with zero arguments" \
|
|
|
|
f_dialog_response_sanitize
|
|
|
|
return $FAILURE
|
|
|
|
fi
|
|
|
|
|
|
|
|
local __var_to_edit
|
|
|
|
for __var_to_edit in $*; do
|
|
|
|
# Skip warnings and trim leading/trailing whitespace
|
|
|
|
setvar $__var_to_edit "$( f_getvar $__var_to_edit | awk '
|
|
|
|
BEGIN { data = 0 }
|
|
|
|
{
|
|
|
|
if ( ! data )
|
|
|
|
{
|
|
|
|
if ( $0 ~ /^$/ ) next
|
|
|
|
if ( $0 ~ /^Gdk-WARNING \*\*:/ ) next
|
|
|
|
data = 1
|
|
|
|
}
|
|
|
|
sub(/^[[:space:]]*/, "")
|
|
|
|
sub(/[[:space:]]*$/, "")
|
|
|
|
print
|
|
|
|
}
|
|
|
|
' )"
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
Improve portion of the dialog(1) API in dialog.subr responsible for
retrieving stored data (for the --menu, --calendar, --timebox, --checklist,
and --radiolist widgets).
When we (Ron McDowell and I) developed the first version of bsdconfig, it
used temporary files to store responses from dialog(1). That hasn't been
true for some very long time, so the need to always store the return status
of dialog(1) and then call some function to clean-up is long-deprecated. The
function that used to do the clean-up was f_dialog_menutag().
We really don't need f_dialog_menutag() for its originally designed purpose,
as all dialog invocations (even when in a sub-shell) do not use temporary
files anymore.
However, we do need to keep f_dialog_menutag() around because it still fills
the need of being able to abstract the procedure for fetching stored data
provided by functions that display the aforementioned widgets.
In re-designing f_dialog_menutag(), four important changes are made:
1. Rename f_dialog_menutag() to f_dialog_menutag_fetch()
2. Introduce the new first-argument of $var_to_set to reduce number of forks
3. Create a corresponding f_dialog_menutag_store() to abstract the storage
4. Offload the sanitization to a new function, f_dialog_data_sanitize()
NOTE: That last one is important. Not all functions need to store their data
for later fetching, meanwhile every invocation of dialog should be sanitized
(as we learned early-on in the i18n-effort -- underlying libraries will spit
warnings to stderr for bad values of $LANG and since dialog outputs its
responses to stderr, we need to sanitize every response of these warnings).
These changes greatly improve readbaility and also improve performance by
reducing unnecessary forking.
2013-06-01 23:58:44 +00:00
|
|
|
############################################################ TITLE FUNCTIONS
|
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
# f_dialog_title [$new_title]
|
|
|
|
#
|
|
|
|
# Set the title of future dialog(1) ($DIALOG_TITLE) or backtitle of Xdialog(1)
|
|
|
|
# ($DIALOG_BACKTITLE) invocations. If no arguments are given or the first
|
|
|
|
# argument is NULL, the current title is returned.
|
|
|
|
#
|
|
|
|
# Each time this function is called, a backup of the current values is made
|
|
|
|
# allowing a one-time (single-level) restoration of the previous title using the
|
|
|
|
# f_dialog_title_restore() function (below).
|
|
|
|
#
|
|
|
|
f_dialog_title()
|
|
|
|
{
|
|
|
|
local new_title="$1"
|
|
|
|
|
2012-11-27 22:14:22 +00:00
|
|
|
if [ "${1+set}" ]; then
|
2012-07-14 03:16:57 +00:00
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
_DIALOG_BACKTITLE="$DIALOG_BACKTITLE"
|
|
|
|
DIALOG_BACKTITLE="$new_title"
|
|
|
|
else
|
|
|
|
_DIALOG_TITLE="$DIALOG_TITLE"
|
|
|
|
DIALOG_TITLE="$new_title"
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
echo "$DIALOG_BACKTITLE"
|
|
|
|
else
|
|
|
|
echo "$DIALOG_TITLE"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_title_restore
|
|
|
|
#
|
|
|
|
# Restore the previous title set by the last call to f_dialog_title().
|
|
|
|
# Restoration is non-recursive and only works to restore the most-recent title.
|
|
|
|
#
|
|
|
|
f_dialog_title_restore()
|
|
|
|
{
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
DIALOG_BACKTITLE="$_DIALOG_BACKTITLE"
|
|
|
|
else
|
|
|
|
DIALOG_TITLE="$_DIALOG_TITLE"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_backtitle [$new_backtitle]
|
|
|
|
#
|
|
|
|
# Set the backtitle of future dialog(1) ($DIALOG_BACKTITLE) or title of
|
|
|
|
# Xdialog(1) ($DIALOG_TITLE) invocations. If no arguments are given or the
|
|
|
|
# first argument is NULL, the current backtitle is returned.
|
|
|
|
#
|
|
|
|
f_dialog_backtitle()
|
|
|
|
{
|
|
|
|
local new_backtitle="$1"
|
|
|
|
|
2012-11-27 22:14:22 +00:00
|
|
|
if [ "${1+set}" ]; then
|
2012-07-14 03:16:57 +00:00
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
_DIALOG_TITLE="$DIALOG_TITLE"
|
|
|
|
DIALOG_TITLE="$new_backtitle"
|
|
|
|
else
|
|
|
|
_DIALOG_BACKTITLE="$DIALOG_BACKTITLE"
|
|
|
|
DIALOG_BACKTITLE="$new_backtitle"
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
echo "$DIALOG_TITLE"
|
|
|
|
else
|
|
|
|
echo "$DIALOG_BACKTITLE"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_backtitle_restore
|
|
|
|
#
|
|
|
|
# Restore the previous backtitle set by the last call to f_dialog_backtitle().
|
|
|
|
# Restoration is non-recursive and only works to restore the most-recent
|
|
|
|
# backtitle.
|
|
|
|
#
|
|
|
|
f_dialog_backtitle_restore()
|
|
|
|
{
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
DIALOG_TITLE="$_DIALOG_TITLE"
|
|
|
|
else
|
|
|
|
DIALOG_BACKTITLE="$_DIALOG_BACKTITLE"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
############################################################ SIZE FUNCTIONS
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_max_size $var_height $var_width
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# Get the maximum height and width for a dialog widget and store the values in
|
|
|
|
# $var_height and $var_width (respectively).
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
f_dialog_max_size()
|
2012-07-14 03:16:57 +00:00
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __var_height="$1" __var_width="$2" __max_size
|
|
|
|
[ "$__var_height" -o "$__var_width" ] || return $FAILURE
|
2012-07-14 03:16:57 +00:00
|
|
|
if [ "$USE_XDIALOG" ]; then
|
2013-05-31 19:07:17 +00:00
|
|
|
__max_size="$XDIALOG_MAXSIZE" # see CONFIGURATION
|
2012-07-14 03:16:57 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
__max_size=$( stty size 2> /dev/null ) # usually "24 80"
|
|
|
|
: ${__max_size:=$DEFAULT_TERMINAL_SIZE}
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
2013-05-31 19:07:17 +00:00
|
|
|
[ "$__var_height" ] && setvar "$__var_height" "${__max_size%%[$IFS]*}"
|
|
|
|
[ "$__var_width" ] && setvar "$__var_width" "${__max_size##*[$IFS]}"
|
|
|
|
}
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_size_constrain $var_height $var_width [$min_height [$min_width]]
|
|
|
|
#
|
|
|
|
# Modify $var_height to be no-less-than $min_height (if given; zero otherwise)
|
|
|
|
# and no-greater-than terminal height (or screen height if $USE_XDIALOG is
|
|
|
|
# set).
|
|
|
|
#
|
|
|
|
# Also modify $var_width to be no-less-than $XDIALOG_MIN_WIDTH (or
|
|
|
|
# $XDIALOG_MIN_WIDTH if $_USE_XDIALOG is set) and no-greater-than terminal
|
|
|
|
# or screen width. The use of $[X]DIALOG_MIN_WIDTH can be overridden by
|
|
|
|
# passing $min_width.
|
|
|
|
#
|
|
|
|
# Return status is success unless one of the passed arguments is invalid
|
|
|
|
# or all of the $var_* arguments are either NULL or missing.
|
|
|
|
#
|
|
|
|
f_dialog_size_constrain()
|
|
|
|
{
|
|
|
|
local __var_height="$1" __var_width="$2"
|
|
|
|
local __min_height="$3" __min_width="$4"
|
|
|
|
local __retval=$SUCCESS
|
|
|
|
|
|
|
|
# Return failure unless at least one var_* argument is passed
|
|
|
|
[ "$__var_height" -o "$__var_width" ] || return $FAILURE
|
|
|
|
|
|
|
|
#
|
|
|
|
# Print debug warnings if any given (non-NULL) argument are invalid
|
|
|
|
# NOTE: Don't change the name of $__{var,min,}{height,width}
|
|
|
|
#
|
|
|
|
local __height __width
|
|
|
|
local __arg __cp __fname=f_dialog_size_constrain
|
|
|
|
for __arg in height width; do
|
|
|
|
debug= f_getvar __var_$__arg __cp
|
|
|
|
[ "$__cp" ] || continue
|
2013-06-04 00:30:05 +00:00
|
|
|
if ! debug= f_getvar "$__cp" __$__arg; then
|
2013-05-31 19:07:17 +00:00
|
|
|
f_dprintf "%s: var_%s variable \`%s' not set" \
|
|
|
|
$__fname $__arg "$__cp"
|
|
|
|
__retval=$FAILURE
|
|
|
|
elif ! eval f_isinteger \$__$__arg; then
|
|
|
|
f_dprintf "%s: var_%s variable value not a number" \
|
|
|
|
$__fname $__arg
|
|
|
|
__retval=$FAILURE
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
for __arg in height width; do
|
|
|
|
debug= f_getvar __min_$__arg __cp
|
|
|
|
[ "$__cp" ] || continue
|
|
|
|
f_isinteger "$__cp" && continue
|
|
|
|
f_dprintf "%s: min_%s value not a number" $__fname $__arg
|
|
|
|
__retval=$FAILURE
|
|
|
|
setvar __min_$__arg ""
|
|
|
|
done
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Obtain maximum height and width values
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __max_height_size_constain __max_width_size_constrain
|
|
|
|
f_dialog_max_size \
|
|
|
|
__max_height_size_constrain __max_width_size_constrain
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
if [ $__height -lt ${__min_height:-0} ]; then
|
|
|
|
setvar "$__var_height" $__min_height
|
|
|
|
elif [ $__height -gt $__max_height_size_constrain ]; then
|
|
|
|
setvar "$__var_height" $__max_height_size_constrain
|
|
|
|
fi
|
|
|
|
fi
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
: ${__min_width:=${XDIALOG_MIN_WIDTH:-35}}
|
2012-07-14 03:16:57 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
: ${__min_width:=${DIALOG_MIN_WIDTH:-24}}
|
|
|
|
fi
|
|
|
|
if [ $__width -lt $__min_width ]; then
|
|
|
|
setvar "$__var_width" $__min_width
|
|
|
|
elif [ $__width -gt $__max_width_size_constrain ]; then
|
|
|
|
setvar "$__var_width" $__max_width_size_constrain
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2013-06-04 00:30:05 +00:00
|
|
|
if [ "$debug" ]; then
|
2013-06-21 22:47:31 +00:00
|
|
|
# Print final constrained values to debugging
|
2013-06-04 00:30:05 +00:00
|
|
|
f_quietly f_getvar "$__var_height"
|
|
|
|
f_quietly f_getvar "$__var_width"
|
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
return $__retval # success if no debug warnings were printed
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_menu_constrain $var_height $var_width $var_rows "$prompt" \
|
|
|
|
# [$min_height [$min_width [$min_rows]]]
|
|
|
|
#
|
|
|
|
# Modify $var_height to be no-less-than $min_height (if given; zero otherwise)
|
|
|
|
# and no-greater-than terminal height (or screen height if $USE_XDIALOG is
|
|
|
|
# set).
|
|
|
|
#
|
|
|
|
# Also modify $var_width to be no-less-than $XDIALOG_MIN_WIDTH (or
|
|
|
|
# $XDIALOG_MIN_WIDTH if $_USE_XDIALOG is set) and no-greater-than terminal
|
|
|
|
# or screen width. The use of $[X]DIALOG_MIN_WIDTH can be overridden by
|
|
|
|
# passing $min_width.
|
|
|
|
#
|
|
|
|
# Last, modify $var_rows to be no-less-than $min_rows (if specified; zero
|
|
|
|
# otherwise) and no-greater-than (max_height - 8) where max_height is the
|
|
|
|
# terminal height (or screen height if $USE_XDIALOG is set). If $prompt is NULL
|
|
|
|
# or missing, dialog(1) allows $var_rows to be (max_height - 7), maximizing the
|
|
|
|
# number of visible rows.
|
|
|
|
#
|
|
|
|
# Return status is success unless one of the passed arguments is invalid
|
|
|
|
# or all of the $var_* arguments are either NULL or missing.
|
|
|
|
#
|
|
|
|
f_dialog_menu_constrain()
|
|
|
|
{
|
|
|
|
local __var_height="$1" __var_width="$2" __var_rows="$3" __prompt="$4"
|
|
|
|
local __min_height="$5" __min_width="$6" __min_rows="$7"
|
|
|
|
|
|
|
|
# Return failure unless at least one var_* argument is passed
|
|
|
|
[ "$__var_height" -o "$__var_width" -o "$__var_rows" ] ||
|
|
|
|
return $FAILURE
|
|
|
|
|
|
|
|
#
|
|
|
|
# Print debug warnings if any given (non-NULL) argument are invalid
|
|
|
|
# NOTE: Don't change the name of $__{var,min,}{height,width,rows}
|
|
|
|
#
|
|
|
|
local __height __width __rows
|
|
|
|
local __arg __cp __fname=f_dialog_menu_constrain
|
|
|
|
for __arg in height width rows; do
|
|
|
|
debug= f_getvar __var_$__arg __cp
|
|
|
|
[ "$__cp" ] || continue
|
2013-06-04 00:30:05 +00:00
|
|
|
if ! debug= f_getvar "$__cp" __$__arg; then
|
2013-05-31 19:07:17 +00:00
|
|
|
f_dprintf "%s: var_%s variable \`%s' not set" \
|
|
|
|
$__fname $__arg "$__cp"
|
|
|
|
__retval=$FAILURE
|
|
|
|
elif ! eval f_isinteger \$__$__arg; then
|
|
|
|
f_dprintf "%s: var_%s variable value not a number" \
|
|
|
|
$__fname $__arg
|
|
|
|
__retval=$FAILURE
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
for __arg in height width rows; do
|
|
|
|
debug= f_getvar __min_$__arg __cp
|
|
|
|
[ "$__cp" ] || continue
|
|
|
|
f_isinteger "$__cp" && continue
|
|
|
|
f_dprintf "%s: min_%s value not a number" $__fname $__arg
|
|
|
|
__retval=$FAILURE
|
|
|
|
setvar __min_$__arg ""
|
|
|
|
done
|
|
|
|
|
|
|
|
# Obtain maximum height and width values
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __max_height_menu_constrain __max_width_menu_constrain
|
|
|
|
f_dialog_max_size \
|
|
|
|
__max_height_menu_constrain __max_width_menu_constrain
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
if [ $__height -lt ${__min_height:-0} ]; then
|
|
|
|
setvar "$__var_height" $__min_height
|
|
|
|
elif [ $__height -gt $__max_height_menu_constrain ]; then
|
|
|
|
setvar "$__var_height" $__max_height_menu_constrain
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
: ${__min_width:=${XDIALOG_MIN_WIDTH:-35}}
|
|
|
|
else
|
|
|
|
: ${__min_width:=${DIALOG_MIN_WIDTH:-24}}
|
|
|
|
fi
|
|
|
|
if [ $__width -lt $__min_width ]; then
|
|
|
|
setvar "$__var_width" $__min_width
|
|
|
|
elif [ $__width -gt $__max_width_menu_constrain ]; then
|
|
|
|
setvar "$__var_width" $__max_width_menu_constrain
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust rows if desired
|
|
|
|
if [ "$__var_rows" ]; then
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
: ${__min_rows:=1}
|
|
|
|
else
|
|
|
|
: ${__min_rows:=0}
|
|
|
|
fi
|
|
|
|
|
|
|
|
local __max_rows=$(( $__max_height_menu_constrain - 8 ))
|
|
|
|
# If prompt_len is zero (no prompt), bump the max-rows by 1
|
|
|
|
# Default assumption is (if no argument) that there's no prompt
|
|
|
|
[ ${__prompt_len:-0} -gt 0 ] ||
|
|
|
|
__max_rows=$(( $__max_rows + 1 ))
|
|
|
|
|
|
|
|
if [ $__rows -lt $__min_rows ]; then
|
|
|
|
setvar "$__var_rows" $__min_rows
|
|
|
|
elif [ $__rows -gt $__max_rows ]; then
|
|
|
|
setvar "$__var_rows" $__max_rows
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2013-06-04 00:30:05 +00:00
|
|
|
if [ "$debug" ]; then
|
|
|
|
# Print final constrained values to debuggin
|
|
|
|
f_quietly f_getvar "$__var_height"
|
|
|
|
f_quietly f_getvar "$__var_width"
|
|
|
|
f_quietly f_getvar "$__var_rows"
|
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
return $__retval # success if no debug warnings were printed
|
|
|
|
}
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_infobox_size [-n] $var_height $var_width \
|
|
|
|
# $title $backtitle $prompt [$hline]
|
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--infobox' boxes sensibly.
|
|
|
|
#
|
|
|
|
# This function helps solve this issue by taking two sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height and width. The second set of arguments are the
|
|
|
|
# title, backtitle, prompt, and [optionally] hline. The optimal height and
|
|
|
|
# width for the described widget (not exceeding the actual terminal height or
|
|
|
|
# width) is stored in $var_height and $var_width (respectively).
|
|
|
|
#
|
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height and
|
|
|
|
# $var_width) are not constrained to minimum/maximum values.
|
|
|
|
#
|
|
|
|
# Newline character sequences (``\n'') in $prompt are expanded as-is done by
|
|
|
|
# dialog(1).
|
|
|
|
#
|
|
|
|
f_dialog_infobox_size()
|
|
|
|
{
|
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2"
|
|
|
|
local __title="$3" __btitle="$4" __prompt="$5" __hline="$6"
|
|
|
|
|
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" ] || return $FAILURE
|
|
|
|
|
|
|
|
# Default height/width of zero for auto-sizing
|
|
|
|
local __height=0 __width=0 __n
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
#
|
|
|
|
# Set height based on number of rows in prompt
|
|
|
|
#
|
|
|
|
__n=$( echo -n "$__prompt" | f_number_of_lines )
|
|
|
|
__n=$(( $__n + 2 ))
|
|
|
|
[ $__n -gt $__height ] && __height=$__n
|
|
|
|
|
|
|
|
#
|
|
|
|
# For Xdialog(1) bump height if backtitle is enabled (displayed
|
|
|
|
# in the X11 window with a separator line between the backtitle
|
|
|
|
# and msg text).
|
|
|
|
#
|
|
|
|
if [ "$USE_XDIALOG" -a "$__btitle" ]; then
|
|
|
|
__n=$( echo "$__btitle" | f_number_of_lines )
|
|
|
|
__height=$(( $__height + $__n + 2 ))
|
|
|
|
fi
|
|
|
|
|
|
|
|
setvar "$__var_height" $__height
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
2012-11-24 07:02:31 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
#
|
|
|
|
# Bump width for long titles
|
|
|
|
#
|
|
|
|
__n=$(( ${#__title} + 4 ))
|
|
|
|
[ $__n -gt $__width ] && __width=$__n
|
|
|
|
|
|
|
|
#
|
|
|
|
# If using Xdialog(1), bump width for long backtitles (which
|
|
|
|
# appear within the window).
|
|
|
|
#
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
__n=$(( ${#__btitle} + 4 ))
|
|
|
|
[ $__n -gt $__width ] && __width=$__n
|
|
|
|
fi
|
|
|
|
|
|
|
|
#
|
|
|
|
# Bump width for long prompts
|
|
|
|
#
|
|
|
|
__n=$( echo "$__prompt" | f_longest_line_length )
|
|
|
|
__n=$(( $__n + 4 )) # add width for border
|
|
|
|
[ $__n -gt $__width ] && __width=$__n
|
|
|
|
|
|
|
|
#
|
|
|
|
# Bump width for long hlines. Xdialog(1) supports `--hline' but
|
|
|
|
# it's currently not used (so don't do anything here if using
|
|
|
|
# Xdialog(1)).
|
|
|
|
#
|
|
|
|
if [ ! "$USE_XDIALOG" ]; then
|
|
|
|
__n=$(( ${#__hline} + 10 ))
|
|
|
|
[ $__n -gt $__width ] && __width=$__n
|
|
|
|
fi
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Bump width by 16.6% if using Xdialog(1)
|
|
|
|
[ "$USE_XDIALOG" ] && __width=$(( $__width + $__width / 6 ))
|
|
|
|
|
|
|
|
setvar "$__var_width" $__width
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Constrain values to sensible minimums/maximums unless `-n' was passed
|
|
|
|
# Return success if no-constrain, else return status from constrain
|
|
|
|
[ ! "$__constrain" ] ||
|
|
|
|
f_dialog_size_constrain "$__var_height" "$__var_width"
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_buttonbox_size [-n] $var_height $var_width \
|
|
|
|
# $title $backtitle $prompt [$hline]
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--msgbox' and `--yesno' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking two sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height and width. The second set of arguments are the
|
|
|
|
# title, backtitle, prompt, and [optionally] hline. The optimal height and
|
|
|
|
# width for the described widget (not exceeding the actual terminal height or
|
|
|
|
# width) is stored in $var_height and $var_width (respectively).
|
|
|
|
#
|
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height and
|
|
|
|
# $var_width) are not constrained to minimum/maximum values.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Newline character sequences (``\n'') in $prompt are expanded as-is done by
|
|
|
|
# dialog(1).
|
|
|
|
#
|
|
|
|
f_dialog_buttonbox_size()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2"
|
|
|
|
local __title="$3" __btitle="$4" __prompt="$5" __hline="$6"
|
|
|
|
|
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" ] || return $FAILURE
|
|
|
|
|
|
|
|
# Calculate height/width of infobox (adjusted/constrained below)
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __height_bbox_size __width_bbox_size
|
|
|
|
f_dialog_infobox_size -n \
|
|
|
|
"${__var_height:+__height_bbox_size}" \
|
|
|
|
"${__var_width:+__width_bbox_size}" \
|
|
|
|
"$__title" "$__btitle" "$__prompt" "$__hline"
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
# Add height to accomodate the buttons
|
|
|
|
__height_bbox_size=$(( $__height_bbox_size + 2 ))
|
|
|
|
|
|
|
|
# Adjust for clipping with Xdialog(1) on Linux/GTK2
|
|
|
|
[ "$USE_XDIALOG" ] &&
|
|
|
|
__height_bbox_size=$(( $__height_bbox_size + 3 ))
|
|
|
|
|
|
|
|
setvar "$__var_height" $__height_bbox_size
|
|
|
|
fi
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# No adjustemnts to width, just pass-thru the infobox width
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
setvar "$__var_width" $__width_bbox_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Constrain values to sensible minimums/maximums unless `-n' was passed
|
|
|
|
# Return success if no-constrain, else return status from constrain
|
|
|
|
[ ! "$__constrain" ] ||
|
|
|
|
f_dialog_size_constrain "$__var_height" "$__var_width"
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_inputbox_size [-n] $var_height $var_width \
|
|
|
|
# $title $backtitle $prompt $init [$hline]
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--inputbox' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking two sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height and width. The second set of arguments are the
|
|
|
|
# title, backtitle, prompt, and [optionally] hline. The optimal height and
|
|
|
|
# width for the described widget (not exceeding the actual terminal height or
|
|
|
|
# width) is stored in $var_height and $var_width (respectively).
|
|
|
|
#
|
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height and
|
|
|
|
# $var_width) are not constrained to minimum/maximum values.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Newline character sequences (``\n'') in $prompt are expanded as-is done by
|
|
|
|
# dialog(1).
|
|
|
|
#
|
|
|
|
f_dialog_inputbox_size()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2"
|
|
|
|
local __title="$3" __btitle="$4" __prompt="$5" __init="$6" __hline="$7"
|
|
|
|
|
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" ] || return $FAILURE
|
|
|
|
|
|
|
|
# Calculate height/width of buttonbox (adjusted/constrained below)
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __height_ibox_size __width_ibox_size
|
|
|
|
f_dialog_buttonbox_size -n \
|
|
|
|
"${__var_height:+__height_ibox_size}" \
|
|
|
|
"${__var_width:+__width_ibox_size}" \
|
|
|
|
"$__title" "$__btitle" "$__prompt" "$__hline"
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
# Add height for input box (not needed for Xdialog(1))
|
|
|
|
[ ! "$USE_XDIALOG" ] &&
|
|
|
|
__height_ibox_size=$(( $__height_ibox_size + 3 ))
|
|
|
|
|
|
|
|
setvar "$__var_height" $__height_ibox_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
# Bump width for initial text (something neither dialog(1) nor
|
|
|
|
# Xdialog(1) do, but worth it!; add 16.6% if using Xdialog(1))
|
|
|
|
local __n=$(( ${#__init} + 7 ))
|
|
|
|
[ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 ))
|
|
|
|
[ $__n -gt $__width_ibox_size ] && __width_ibox_size=$__n
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
setvar "$__var_width" $__width_ibox_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Constrain values to sensible minimums/maximums unless `-n' was passed
|
|
|
|
# Return success if no-constrain, else return status from constrain
|
|
|
|
[ ! "$__constrain" ] ||
|
|
|
|
f_dialog_size_constrain "$__var_height" "$__var_width"
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_xdialog_2inputsbox_size [-n] $var_height $var_width \
|
|
|
|
# $title $backtitle $prompt \
|
2012-07-14 03:16:57 +00:00
|
|
|
# $label1 $init1 $label2 $init2
|
|
|
|
#
|
|
|
|
# Xdialog(1) does not perform auto-sizing of the width and height of
|
|
|
|
# `--2inputsbox' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking two sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height and width. The second set of arguments are the
|
|
|
|
# title, backtitle, prompt, label for the first field, initial text for said
|
|
|
|
# field, label for the second field, and initial text for said field. The
|
|
|
|
# optimal height and width for the described widget (not exceeding the actual
|
|
|
|
# terminal height or width) is stored in $var_height and $var_width
|
|
|
|
# (respectively).
|
|
|
|
#
|
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height and
|
|
|
|
# $var_width) are not constrained to minimum/maximum values.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Newline character sequences (``\n'') in $prompt are expanded as-is done by
|
|
|
|
# Xdialog(1).
|
|
|
|
#
|
|
|
|
f_xdialog_2inputsbox_size()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2"
|
|
|
|
local __title="$3" __btitle="$4" __prompt="$5"
|
|
|
|
local __label1="$6" __init1="$7" __label2="$8" __init2="$9"
|
|
|
|
|
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" ] || return $FAILURE
|
|
|
|
|
|
|
|
# Calculate height/width of inputbox (adjusted/constrained below)
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __height_2ibox_size __width_2ibox_size
|
|
|
|
f_dialog_inputbox_size -n \
|
|
|
|
"${__var_height:+__height_2ibox_size}" \
|
|
|
|
"${__var_width:+__width_2ibox_size}" \
|
|
|
|
"$__title" "$__btitle" "$__prompt" "$__hline" "$__init1"
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
# Add height for 1st label, 2nd label, and 2nd input box
|
|
|
|
__height_2ibox_size=$(( $__height_2ibox_size + 2 + 2 + 2 ))
|
|
|
|
setvar "$__var_height" $__height_2ibox_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
local __n
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Bump width for first label text (+16.6% since Xdialog(1))
|
|
|
|
__n=$(( ${#__label1} + 7 ))
|
|
|
|
__n=$(( $__n + $__n / 6 ))
|
|
|
|
[ $__n -gt $__width_2ibox_size ] && __width_2ibox_size=$__n
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Bump width for second label text (+16.6% since Xdialog(1))
|
|
|
|
__n=$(( ${#__label2} + 7 ))
|
|
|
|
__n=$(( $__n + $__n / 6 ))
|
|
|
|
[ $__n -gt $__width_2ibox_size ] && __width_2ibox_size=$__n
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Bump width for 2nd initial text (something neither dialog(1)
|
|
|
|
# nor Xdialog(1) do, but worth it!; +16.6% since Xdialog(1))
|
|
|
|
__n=$(( ${#__init2} + 7 ))
|
|
|
|
__n=$(( $__n + $__n / 6 ))
|
|
|
|
[ $__n -gt $__width_2ibox_size ] && __width_2ibox_size=$__n
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
setvar "$__var_width" $__width_2ibox_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Constrain values to sensible minimums/maximums unless `-n' was passed
|
|
|
|
# Return success if no-constrain, else return status from constrain
|
|
|
|
[ ! "$__constrain" ] ||
|
|
|
|
f_dialog_size_constrain "$__var_height" "$__var_width"
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_menu_size [-n] $var_height $var_width $var_rows \
|
|
|
|
# $title $backtitle $prompt $hline \
|
2012-07-14 03:16:57 +00:00
|
|
|
# $tag1 $item1 $tag2 $item2 ...
|
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--menu' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking three sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height, width, and rows. The second set of arguments
|
|
|
|
# are the title, backtitle, prompt, and hline. The [optional] third set of
|
|
|
|
# arguments are the menu list itself (comprised of tag/item couplets). The
|
|
|
|
# optimal height, width, and rows for the described widget (not exceeding the
|
|
|
|
# actual terminal height or width) is stored in $var_height, $var_width, and
|
|
|
|
# $var_rows (respectively).
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height, $var_width,
|
|
|
|
# and $var_rows) are not constrained to minimum/maximum values.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
f_dialog_menu_size()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2" __var_rows="$3"
|
|
|
|
local __title="$4" __btitle="$5" __prompt="$6" __hline="$7"
|
|
|
|
shift 7 # var_height/var_width/var_rows/title/btitle/prompt/hline
|
|
|
|
|
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" -o "$__var_rows" ] ||
|
|
|
|
return $FAILURE
|
|
|
|
|
|
|
|
# Calculate height/width of infobox (adjusted/constrained below)
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __height_menu_size __width_menu_size
|
|
|
|
f_dialog_infobox_size -n \
|
|
|
|
"${__var_height:+__height_menu_size}" \
|
|
|
|
"${__var_width:+__width_menu_size}" \
|
|
|
|
"$__title" "$__btitle" "$__prompt" "$__hline"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Always process the menu-item arguments to get the longest tag-length,
|
|
|
|
# longest item-length (both used to bump the width), and the number of
|
|
|
|
# rows (used to bump the height).
|
|
|
|
#
|
|
|
|
local __longest_tag=0 __longest_item=0 __rows=0
|
2012-07-14 03:16:57 +00:00
|
|
|
while [ $# -ge 2 ]; do
|
2013-05-31 19:07:17 +00:00
|
|
|
local __tag="$1" __item="$2"
|
2012-07-14 03:16:57 +00:00
|
|
|
shift 2 # tag/item
|
2013-05-31 19:07:17 +00:00
|
|
|
[ ${#__tag} -gt $__longest_tag ] && __longest_tag=${#__tag}
|
|
|
|
[ ${#__item} -gt $__longest_item ] && __longest_item=${#__item}
|
|
|
|
__rows=$(( $__rows + 1 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
done
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust rows early (for up-comning height calculation)
|
|
|
|
if [ "$__var_height" -o "$__var_rows" ]; then
|
|
|
|
# Add a row for visual aid if using Xdialog(1)
|
|
|
|
[ "$USE_XDIALOG" ] && __rows=$(( $__rows + 1 ))
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
# Add rows to height
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
__height_menu_size=$((
|
|
|
|
$__height_menu_size + $__rows + 7 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
__height_menu_size=$((
|
|
|
|
$__height_menu_size + $__rows + 4 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
2013-05-31 19:07:17 +00:00
|
|
|
setvar "$__var_height" $__height_menu_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
# The sum total between the longest tag-length and the
|
|
|
|
# longest item-length should be used to bump menu width
|
|
|
|
local __n=$(( $__longest_tag + $__longest_item + 10 ))
|
|
|
|
[ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 )) # plus 16.6%
|
|
|
|
[ $__n -gt $__width_menu_size ] && __width_menu_size=$__n
|
|
|
|
|
|
|
|
setvar "$__var_width" $__width_menu_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Store adjusted rows if desired
|
|
|
|
[ "$__var_rows" ] && setvar "$__var_rows" $__rows
|
|
|
|
|
|
|
|
# Constrain height, width, and rows to sensible minimum/maximum values
|
|
|
|
# Return success if no-constrain, else return status from constrain
|
|
|
|
[ ! "$__constrain" ] || f_dialog_menu_constrain \
|
|
|
|
"$__var_height" "$__var_width" "$__var_rows" "$__prompt"
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_menu_with_help_size [-n] $var_height $var_width $var_rows \
|
|
|
|
# $title $backtitle $prompt $hline \
|
2012-07-14 03:16:57 +00:00
|
|
|
# $tag1 $item1 $help1 $tag2 $item2 $help2 ...
|
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--menu' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking three sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height, width, and rows. The second set of arguments
|
|
|
|
# are the title, backtitle, prompt, and hline. The [optional] third set of
|
|
|
|
# arguments are the menu list itself (comprised of tag/item/help triplets). The
|
|
|
|
# optimal height, width, and rows for the described widget (not exceeding the
|
|
|
|
# actual terminal height or width) is stored in $var_height, $var_width, and
|
|
|
|
# $var_rows (respectively).
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height, $var_width,
|
|
|
|
# and $var_rows) are not constrained to minimum/maximum values.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
f_dialog_menu_with_help_size()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2" __var_rows="$3"
|
|
|
|
local __title="$4" __btitle="$5" __prompt="$6" __hline="$7"
|
|
|
|
shift 7 # var_height/var_width/var_rows/title/btitle/prompt/hline
|
|
|
|
|
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" -o "$__var_rows" ] ||
|
|
|
|
return $FAILURE
|
|
|
|
|
|
|
|
# Calculate height/width of infobox (adjusted/constrained below)
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __height_menu_with_help_size __width_menu_with_help_size
|
|
|
|
f_dialog_infobox_size -n \
|
|
|
|
"${__var_height:+__height_menu_with_help_size}" \
|
|
|
|
"${__var_width:+__width_menu_with_help_size}" \
|
|
|
|
"$__title" "$__btitle" "$__prompt" "$__hline"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Always process the menu-item arguments to get the longest tag-length,
|
|
|
|
# longest item-length, longest help-length (help-length only considered
|
|
|
|
# if using Xdialog(1), as it places the help string in the widget) --
|
|
|
|
# all used to bump the width -- and the number of rows (used to bump
|
|
|
|
# the height).
|
|
|
|
#
|
|
|
|
local __longest_tag=0 __longest_item=0 __longest_help=0 __rows=0
|
2012-07-14 03:16:57 +00:00
|
|
|
while [ $# -ge 3 ]; do
|
2013-05-31 19:07:17 +00:00
|
|
|
local __tag="$1" __item="$2" __help="$3"
|
2012-07-14 03:16:57 +00:00
|
|
|
shift 3 # tag/item/help
|
2013-05-31 19:07:17 +00:00
|
|
|
[ ${#__tag} -gt $__longest_tag ] && __longest_tag=${#__tag}
|
|
|
|
[ ${#__item} -gt $__longest_item ] && __longest_item=${#__item}
|
|
|
|
[ ${#__help} -gt $__longest_help ] && __longest_help=${#__help}
|
|
|
|
__rows=$(( $__rows + 1 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
done
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust rows early (for up-coming height calculation)
|
|
|
|
if [ "$__var_height" -o "$__var_rows" ]; then
|
|
|
|
# Add a row for visual aid if using Xdialog(1)
|
|
|
|
[ "$USE_XDIALOG" ] && __rows=$(( $__rows + 1 ))
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
# Add rows to height
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
__height_menu_with_help_size=$((
|
|
|
|
$__height_menu_with_help_size + $__rows + 8 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
__height_menu_with_help_size=$((
|
|
|
|
$__height_menu_with_help_size + $__rows + 4 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
2013-05-31 19:07:17 +00:00
|
|
|
setvar "$__var_height" $__height_menu_with_help_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
# The sum total between the longest tag-length and the
|
|
|
|
# longest item-length should be used to bump menu width
|
|
|
|
local __n=$(( $__longest_tag + $__longest_item + 10 ))
|
|
|
|
[ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 )) # plus 16.6%
|
|
|
|
[ $__n -gt $__width_menu_with_help_size ] &&
|
|
|
|
__width_menu_with_help_size=$__n
|
|
|
|
|
|
|
|
# Update width for help text if using Xdialog(1)
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
__n=$(( $__longest_help + 10 ))
|
|
|
|
__n=$(( $__n + $__n / 6 )) # plus 16.6%
|
|
|
|
[ $__n -gt $__width_menu_with_help_size ] &&
|
|
|
|
__width_menu_with_help_size=$__n
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
setvar "$__var_width" $__width_menu_with_help_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Store adjusted rows if desired
|
|
|
|
[ "$__var_rows" ] && setvar "$__var_rows" $__rows
|
|
|
|
|
|
|
|
# Constrain height, width, and rows to sensible minimum/maximum values
|
|
|
|
# Return success if no-constrain, else return status from constrain
|
|
|
|
[ ! "$__constrain" ] || f_dialog_menu_constrain \
|
|
|
|
"$__var_height" "$__var_width" "$__var_rows" "$__prompt"
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_radiolist_size [-n] $var_height $var_width $var_rows \
|
|
|
|
# $title $backtitle $prompt $hline \
|
2012-07-14 03:16:57 +00:00
|
|
|
# $tag1 $item1 $status1 $tag2 $item2 $status2 ...
|
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--radiolist' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking three sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height, width, and rows. The second set of arguments
|
|
|
|
# are the title, backtitle, prompt, and hline. The [optional] third set of
|
|
|
|
# arguments are the radio list itself (comprised of tag/item/status triplets).
|
|
|
|
# The optimal height, width, and rows for the described widget (not exceeding
|
|
|
|
# the actual terminal height or width) is stored in $var_height, $var_width,
|
|
|
|
# and $var_rows (respectively).
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height, $var_width,
|
|
|
|
# and $var_rows) are not constrained to minimum/maximum values.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
f_dialog_radiolist_size()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2" __var_rows="$3"
|
|
|
|
local __title="$4" __btitle="$5" __prompt="$6" __hline="$7"
|
|
|
|
shift 7 # var_height/var_width/var_rows/title/btitle/prompt/hline
|
|
|
|
|
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" -o "$__var_rows" ] ||
|
|
|
|
return $FAILURE
|
|
|
|
|
|
|
|
# Calculate height/width of infobox (adjusted/constrained below)
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __height_rlist_size __width_rlist_size
|
|
|
|
f_dialog_infobox_size -n \
|
|
|
|
"${__var_height:+__height_rlist_size}" \
|
|
|
|
"${__var_width:+__width_rlist_size}" \
|
|
|
|
"$__title" "$__btitle" "$__prompt" "$__hline"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Always process the menu-item arguments to get the longest tag-length,
|
|
|
|
# longest item-length (both used to bump the width), and the number of
|
|
|
|
# rows (used to bump the height).
|
|
|
|
#
|
|
|
|
local __longest_tag=0 __longest_item=0 __rows=0
|
2013-04-22 06:27:14 +00:00
|
|
|
while [ $# -ge 3 ]; do
|
2013-05-31 19:07:17 +00:00
|
|
|
local __tag="$1" __item="$2"
|
2013-04-22 06:27:14 +00:00
|
|
|
shift 3 # tag/item/status
|
2013-05-31 19:07:17 +00:00
|
|
|
[ ${#__tag} -gt $__longest_tag ] && __longest_tag=${#__tag}
|
|
|
|
[ ${#__item} -gt $__longest_item ] && __longest_item=${#__item}
|
|
|
|
__rows=$(( $__rows + 1 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
done
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust rows early (for up-coming height calculation)
|
|
|
|
if [ "$__var_height" -o "$__var_rows" ]; then
|
|
|
|
# Add a row for visual aid if using Xdialog(1)
|
|
|
|
[ "$USE_XDIALOG" ] && __rows=$(( $__rows + 1 ))
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
# Add rows to height
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
__height_rlist_size=$((
|
|
|
|
$__height_rlist_size + $__rows + 7 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
__height_rlist_size=$((
|
|
|
|
$__height_rlist_size + $__rows + 4 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
2013-05-31 19:07:17 +00:00
|
|
|
setvar "$__var_height" $__height_rlist_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
# Sum total between longest tag-length, longest item-length,
|
|
|
|
# and radio-button width should be used to bump menu width
|
|
|
|
local __n=$(( $__longest_tag + $__longest_item + 13 ))
|
|
|
|
[ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 )) # plus 16.6%
|
|
|
|
[ $__n -gt $__width_rlist_size ] && __width_rlist_size=$__n
|
|
|
|
|
|
|
|
setvar "$__var_width" $__width_rlist_size
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Store adjusted rows if desired
|
|
|
|
[ "$__var_rows" ] && setvar "$__var_rows" $__rows
|
|
|
|
|
|
|
|
# Constrain height, width, and rows to sensible minimum/maximum values
|
|
|
|
# Return success if no-constrain, else return status from constrain
|
|
|
|
[ ! "$__constrain" ] || f_dialog_menu_constrain \
|
|
|
|
"$__var_height" "$__var_width" "$__var_rows" "$__prompt"
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_checklist_size [-n] $var_height $var_width $var_rows \
|
|
|
|
# $title $backtitle $prompt $hline \
|
2013-04-22 06:28:45 +00:00
|
|
|
# $tag1 $item1 $status1 $tag2 $item2 $status2 ...
|
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--checklist' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking three sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height, width, and rows. The second set of arguments
|
|
|
|
# are the title, backtitle, prompt, and hline. The [optional] third set of
|
|
|
|
# arguments are the check list itself (comprised of tag/item/status triplets).
|
|
|
|
# The optimal height, width, and rows for the described widget (not exceeding
|
|
|
|
# the actual terminal height or width) is stored in $var_height, $var_width,
|
|
|
|
# and $var_rows (respectively).
|
2013-04-22 06:28:45 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height, $var_width,
|
|
|
|
# and $var_rows) are not constrained to minimum/maximum values.
|
2013-04-22 06:28:45 +00:00
|
|
|
#
|
|
|
|
f_dialog_checklist_size()
|
|
|
|
{
|
|
|
|
f_dialog_radiolist_size "$@"
|
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_radiolist_with_help_size [-n] $var_height $var_width $var_rows \
|
|
|
|
# $title $backtitle $prompt $hline \
|
2013-04-22 06:28:45 +00:00
|
|
|
# $tag1 $item1 $status1 $help1 \
|
|
|
|
# $tag2 $item2 $status2 $help2 ...
|
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--radiolist' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking three sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height, width, and rows. The second set of arguments
|
|
|
|
# are the title, backtitle, prompt, and hline. The [optional] third set of
|
|
|
|
# arguments are the radio list itself (comprised of tag/item/status/help
|
|
|
|
# quadruplets). The optimal height, width, and rows for the described widget
|
|
|
|
# (not exceeding the actual terminal height or width) is stored in $var_height,
|
|
|
|
# $var_width, and $var_rows (respectively).
|
2013-04-22 06:28:45 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height, $var_width,
|
|
|
|
# and $var_rows) are not constrained to minimum/maximum values.
|
2013-04-22 06:28:45 +00:00
|
|
|
#
|
|
|
|
f_dialog_radiolist_with_help_size()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2" __var_rows="$3"
|
|
|
|
local __title="$4" __btitle="$5" __prompt="$6" __hline="$7"
|
|
|
|
shift 7 # var_height/var_width/var_rows/title/btitle/prompt/hline
|
|
|
|
|
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" -o "$__var_rows" ] ||
|
|
|
|
return $FAILURE
|
|
|
|
|
|
|
|
# Calculate height/width of infobox (adjusted/constrained below)
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __height_rlist_with_help_size __width_rlist_with_help_size
|
|
|
|
f_dialog_infobox_size -n \
|
|
|
|
"${__var_height:+__height_rlist_with_help_size}" \
|
|
|
|
"${__var_width:+__width_rlist_with_help_size}" \
|
|
|
|
"$__title" "$__btitle" "$__prompt" "$__hline"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Always process the menu-item arguments to get the longest tag-length,
|
|
|
|
# longest item-length, longest help-length (help-length only considered
|
|
|
|
# if using Xdialog(1), as it places the help string in the widget) --
|
|
|
|
# all used to bump the width -- and the number of rows (used to bump
|
|
|
|
# the height).
|
|
|
|
#
|
|
|
|
local __longest_tag=0 __longest_item=0 __longest_help=0 __rows=0
|
2013-04-22 06:28:45 +00:00
|
|
|
while [ $# -ge 4 ]; do
|
2013-05-31 19:07:17 +00:00
|
|
|
local __tag="$1" __item="$2" __status="$3" __help="$4"
|
2013-04-22 06:28:45 +00:00
|
|
|
shift 4 # tag/item/status/help
|
2013-05-31 19:07:17 +00:00
|
|
|
[ ${#__tag} -gt $__longest_tag ] && __longest_tag=${#__tag}
|
|
|
|
[ ${#__item} -gt $__longest_item ] && __longest_item=${#__item}
|
|
|
|
[ ${#__help} -gt $__longest_help ] && __longest_help=${#__help}
|
|
|
|
__rows=$(( $__rows + 1 ))
|
2013-04-22 06:28:45 +00:00
|
|
|
done
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust rows early (for up-coming height calculation)
|
|
|
|
if [ "$__var_height" -o "$__var_rows" ]; then
|
|
|
|
# Add a row for visual aid if using Xdialog(1)
|
|
|
|
[ "$USE_XDIALOG" ] && __rows=$(( $__rows + 1 ))
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Adjust height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
# Add rows to height
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
__height_rlist_with_help_size=$((
|
|
|
|
$__height_rlist_with_help_size + $__rows + 7 ))
|
2013-04-22 06:28:45 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
__height_rlist_with_help_size=$((
|
|
|
|
$__height_rlist_with_help_size + $__rows + 4 ))
|
2013-04-22 06:28:45 +00:00
|
|
|
fi
|
2013-05-31 19:07:17 +00:00
|
|
|
setvar "$__var_height" $__height
|
2013-04-22 06:28:45 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Adjust width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
# Sum total between longest tag-length, longest item-length,
|
|
|
|
# and radio-button width should be used to bump menu width
|
|
|
|
local __n=$(( $__longest_tag + $__longest_item + 13 ))
|
|
|
|
[ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 )) # plus 16.6%
|
|
|
|
[ $__n -gt $__width_rlist_with_help_size ] &&
|
|
|
|
__width_rlist_with_help_size=$__n
|
|
|
|
|
|
|
|
# Update width for help text if using Xdialog(1)
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
__n=$(( $__longest_help + 10 ))
|
|
|
|
__n=$(( $__n + $__n / 6 )) # plus 16.6%
|
|
|
|
[ $__n -gt $__width_rlist_with_help_size ] &&
|
|
|
|
__width_rlist_with_help_size=$__n
|
2013-04-22 06:28:45 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
setvar "$__var_width" $__width_rlist_with_help_size
|
2013-04-22 06:28:45 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Store adjusted rows if desired
|
|
|
|
[ "$__var_rows" ] && setvar "$__var_rows" $__rows
|
|
|
|
|
|
|
|
# Constrain height, width, and rows to sensible minimum/maximum values
|
|
|
|
# Return success if no-constrain, else return status from constrain
|
|
|
|
[ ! "$__constrain" ] || f_dialog_menu_constrain \
|
|
|
|
"$__var_height" "$__var_width" "$__var_rows" "$__prompt"
|
2013-04-22 06:28:45 +00:00
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_checklist_with_help_size [-n] $var_height $var_width $var_rows \
|
|
|
|
# $title $backtitle $prompt $hline \
|
2013-04-22 06:28:45 +00:00
|
|
|
# $tag1 $item1 $status1 $help1 \
|
|
|
|
# $tag2 $item2 $status2 $help2 ...
|
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--checklist' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking three sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height, width, and rows. The second set of arguments
|
|
|
|
# are the title, backtitle, prompt, and hline. The [optional] third set of
|
|
|
|
# arguments are the check list itself (comprised of tag/item/status/help
|
|
|
|
# quadruplets). The optimal height, width, and rows for the described widget
|
|
|
|
# (not exceeding the actual terminal height or width) is stored in $var_height,
|
|
|
|
# $var_width, and $var_rows (respectively).
|
2013-04-22 06:28:45 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height, $var_width,
|
|
|
|
# and $var_rows) are not constrained to minimum/maximum values.
|
2013-04-22 06:28:45 +00:00
|
|
|
#
|
|
|
|
f_dialog_checklist_with_help_size()
|
|
|
|
{
|
|
|
|
f_dialog_radiolist_with_help_size "$@"
|
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_calendar_size [-n] $var_height $var_width \
|
|
|
|
# $title $backtitle $prompt [$hline]
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--calendar' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking two sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height and width. The second set of arguments are the
|
|
|
|
# title, backtitle, prompt, and [optionally] hline. The optimal height and
|
|
|
|
# width for the described widget (not exceeding the actual terminal height or
|
|
|
|
# width) is stored in $var_height and $var_width (respectively).
|
|
|
|
#
|
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height and
|
|
|
|
# $var_width) are not constrained to minimum/maximum values.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Newline character sequences (``\n'') in $prompt are expanded as-is done by
|
|
|
|
# dialog(1).
|
|
|
|
#
|
|
|
|
f_dialog_calendar_size()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2"
|
|
|
|
local __title="$3" __btitle="$4" __prompt="$5" __hline="$6"
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" ] || return $FAILURE
|
2012-07-14 03:16:57 +00:00
|
|
|
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# Obtain/Adjust minimum and maximum thresholds
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
local __max_height_cal_size __max_width_cal_size
|
|
|
|
f_dialog_max_size __max_height_cal_size __max_width_cal_size
|
|
|
|
__max_width_cal_size=$(( $__max_width_cal_size - 2 ))
|
|
|
|
# the calendar box will refuse to display if too wide
|
|
|
|
local __min_width
|
2012-07-14 03:16:57 +00:00
|
|
|
if [ "$USE_XDIALOG" ]; then
|
2013-05-31 19:07:17 +00:00
|
|
|
__min_width=55
|
|
|
|
else
|
|
|
|
__min_width=40
|
|
|
|
__max_height_cal_size=$((
|
|
|
|
$__max_height_cal_size - $DIALOG_CALENDAR_HEIGHT ))
|
|
|
|
# When using dialog(1), we can't predict whether the user has
|
|
|
|
# disabled shadow's in their `$HOME/.dialogrc' file, so we'll
|
|
|
|
# subtract one for the potential shadow around the widget
|
|
|
|
__max_height_cal_size=$(( $__max_height_cal_size - 1 ))
|
|
|
|
fi
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Calculate height if desired
|
|
|
|
if [ "$__var_height" ]; then
|
|
|
|
local __height
|
|
|
|
__height=$( echo "$__prompt" | f_number_of_lines )
|
|
|
|
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
|
|
|
# Add height to accomodate for embedded calendar widget
|
|
|
|
__height=$(( $__height + $DIALOG_CALENDAR_HEIGHT - 1 ))
|
|
|
|
|
|
|
|
# Also, bump height if backtitle is enabled
|
|
|
|
if [ "$__btitle" ]; then
|
|
|
|
local __n
|
|
|
|
__n=$( echo "$__btitle" | f_number_of_lines )
|
|
|
|
__height=$(( $__height + $__n + 2 ))
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
[ "$__prompt" ] && __height=$(( $__height + 1 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
2013-05-31 19:07:17 +00:00
|
|
|
|
|
|
|
# Enforce maximum height, unless `-n' was passed
|
|
|
|
[ "$__constrain" -a $__height -gt $__max_height_cal_size ] &&
|
|
|
|
__height=$__max_height_cal_size
|
|
|
|
|
|
|
|
setvar "$__var_height" $__height
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Calculate width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width}
|
|
|
|
# values from becoming local (and thus preventing setvar
|
|
|
|
# from working).
|
|
|
|
local __width_cal_size
|
|
|
|
f_dialog_infobox_size -n "" __width_cal_size \
|
|
|
|
"$__title" "$__btitle" "$__prompt" "$__hline"
|
|
|
|
|
|
|
|
# Enforce minimum/maximum width, unless `-n' was passed
|
|
|
|
if [ "$__constrain" ]; then
|
|
|
|
if [ $__width_cal_size -lt $__min_width ]; then
|
|
|
|
__width_cal_size=$__min_width
|
|
|
|
elif [ $__width_cal_size -gt $__max_width_cal_size ]
|
|
|
|
then
|
|
|
|
__width_cal_size=$__max_width_size
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
setvar "$__var_width" $__width_cal_size
|
|
|
|
fi
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
return $SUCCESS
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# f_dialog_timebox_size [-n] $var_height $var_width \
|
|
|
|
# $title $backtitle $prompt [$hline]
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Not all versions of dialog(1) perform auto-sizing of the width and height of
|
|
|
|
# `--timebox' boxes sensibly.
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# This function helps solve this issue by taking two sets of sequential
|
|
|
|
# arguments. The first set of arguments are the variable names to use when
|
|
|
|
# storing the calculated height and width. The second set of arguments are the
|
|
|
|
# title, backtitle, prompt, and [optionally] hline. The optional height and
|
|
|
|
# width for the described widget (not exceeding the actual terminal height or
|
|
|
|
# width) is stored in $var_height and $var_width (respectively).
|
|
|
|
#
|
|
|
|
# If the first argument is `-n', the calculated sizes ($var_height and
|
|
|
|
# $var_width) are not constrained to minimum/maximum values.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Newline character sequences (``\n'') in $prompt are expanded as-is done by
|
|
|
|
# dialog(1).
|
|
|
|
#
|
|
|
|
f_dialog_timebox_size()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local __constrain=1
|
|
|
|
[ "$1" = "-n" ] && __constrain= && shift 1 # -n
|
|
|
|
local __var_height="$1" __var_width="$2"
|
|
|
|
local __title="$3" __btitle="$4" __prompt="$5" __hline="$6"
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Return unless at least one size aspect has been requested
|
|
|
|
[ "$__var_height" -o "$__var_width" ] || return $FAILURE
|
2012-07-14 03:16:57 +00:00
|
|
|
|
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
# Obtain/Adjust minimum and maximum thresholds
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
2013-05-31 19:07:17 +00:00
|
|
|
local __max_height_tbox_size __max_width_tbox_size
|
|
|
|
f_dialog_max_size __max_height_tbox_size __max_width_tbox_size
|
|
|
|
__max_width_tbox_size=$(( $__max_width_tbox_size - 2 ))
|
|
|
|
# the timebox widget refuses to display if too wide
|
|
|
|
local __min_width
|
2012-07-14 03:16:57 +00:00
|
|
|
if [ "$USE_XDIALOG" ]; then
|
2013-05-31 19:07:17 +00:00
|
|
|
__min_width=40
|
2012-07-14 03:16:57 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
__min_width=20
|
|
|
|
__max_height_tbox_size=$(( \
|
|
|
|
$__max_height_tbox_size - $DIALOG_TIMEBOX_HEIGHT ))
|
|
|
|
# When using dialog(1), we can't predict whether the user has
|
|
|
|
# disabled shadow's in their `$HOME/.dialogrc' file, so we'll
|
|
|
|
# subtract one for the potential shadow around the widget
|
|
|
|
__max_height_tbox_size=$(( $__max_height_tbox_size - 1 ))
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
# Calculate height if desired
|
|
|
|
if [ "$__var_height" -a "$USE_XDIALOG" ]; then
|
|
|
|
# When using Xdialog(1), the height seems to have
|
|
|
|
# no effect. All values provide the same results.
|
|
|
|
setvar "$__var_height" 0 # autosize
|
|
|
|
elif [ "$__var_height" ]; then
|
|
|
|
local __height
|
|
|
|
__height=$( echo "$__prompt" | f_number_of_lines )
|
|
|
|
__height=$(( $__height ${__prompt:++1} + 1 ))
|
|
|
|
|
|
|
|
# Enforce maximum height, unless `-n' was passed
|
|
|
|
[ "$__constrain" -a $__height -gt $__max_height_tbox_size ] &&
|
|
|
|
__height=$__max_height_tbox_size
|
|
|
|
|
|
|
|
setvar "$__var_height" $__height
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Calculate width if desired
|
|
|
|
if [ "$__var_width" ]; then
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width}
|
|
|
|
# values from becoming local (and thus preventing setvar
|
|
|
|
# from working).
|
|
|
|
local __width_tbox_size
|
|
|
|
f_dialog_infobox_size -n "" __width_tbox_size \
|
|
|
|
"$__title" "$__btitle" "$__prompt" "$__hline"
|
|
|
|
|
|
|
|
# Enforce the minimum width for displaying the timebox
|
|
|
|
if [ "$__constrain" ]; then
|
|
|
|
if [ $__width_tbox_size -lt $__min_width ]; then
|
|
|
|
__width_tbox_size=$__min_width
|
|
|
|
elif [ $__width_tbox_size -ge $__max_width_tbox_size ]
|
|
|
|
then
|
|
|
|
__width_tbox_size=$__max_width_tbox_size
|
|
|
|
fi
|
|
|
|
fi
|
2012-07-14 03:16:57 +00:00
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
setvar "$__var_width" $__width_tbox_size
|
|
|
|
fi
|
|
|
|
|
|
|
|
return $SUCCESS
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
############################################################ CLEAR FUNCTIONS
|
|
|
|
|
|
|
|
# f_dialog_clear
|
|
|
|
#
|
|
|
|
# Clears any/all previous dialog(1) displays.
|
|
|
|
#
|
|
|
|
f_dialog_clear()
|
|
|
|
{
|
|
|
|
$DIALOG --clear
|
|
|
|
}
|
|
|
|
|
|
|
|
############################################################ INFO FUNCTIONS
|
|
|
|
|
|
|
|
# f_dialog_info $info_text ...
|
|
|
|
#
|
|
|
|
# Throw up a dialog(1) infobox. The infobox remains until another dialog is
|
2012-12-29 00:30:30 +00:00
|
|
|
# displayed or `dialog --clear' (or f_dialog_clear) is called.
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
f_dialog_info()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local info_text="$*" height width
|
|
|
|
f_dialog_infobox_size height width \
|
|
|
|
"$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$info_text"
|
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
|
|
|
${USE_XDIALOG:+--ignore-eof} \
|
|
|
|
${USE_XDIALOG:+--no-buttons} \
|
|
|
|
--infobox "$info_text" $height $width
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# f_xdialog_info $info_text ...
|
|
|
|
#
|
|
|
|
# Throw up an Xdialog(1) infobox and do not dismiss it until stdin produces
|
|
|
|
# EOF. This implies that you must execute this either as an rvalue to a pipe,
|
|
|
|
# lvalue to indirection or in a sub-shell that provides data on stdin.
|
|
|
|
#
|
|
|
|
f_xdialog_info()
|
|
|
|
{
|
2013-05-31 19:07:17 +00:00
|
|
|
local info_text="$*" height width
|
|
|
|
f_dialog_infobox_size height width \
|
|
|
|
"$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$info_text"
|
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
|
|
|
--no-close --no-buttons \
|
|
|
|
--infobox "$info_text" $height $width \
|
2012-07-14 03:16:57 +00:00
|
|
|
-1 # timeout of -1 means abort when EOF on stdin
|
|
|
|
}
|
|
|
|
|
|
|
|
############################################################ MSGBOX FUNCTIONS
|
|
|
|
|
2013-06-18 08:54:02 +00:00
|
|
|
# f_dialog_msgbox $msg_text [$hline]
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Throw up a dialog(1) msgbox. The msgbox remains until the user presses ENTER
|
|
|
|
# or ESC, acknowledging the modal dialog.
|
|
|
|
#
|
|
|
|
# If the user presses ENTER, the exit status is zero (success), otherwise if
|
|
|
|
# the user presses ESC the exit status is 255.
|
|
|
|
#
|
|
|
|
f_dialog_msgbox()
|
|
|
|
{
|
2013-06-18 08:54:02 +00:00
|
|
|
local msg_text="$1" hline="$2" height width
|
2013-05-31 19:07:17 +00:00
|
|
|
f_dialog_buttonbox_size height width \
|
2013-06-18 08:54:02 +00:00
|
|
|
"$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$msg_text" "$hline"
|
2013-05-31 19:07:17 +00:00
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
2013-06-18 08:54:02 +00:00
|
|
|
--hline "$hline" \
|
2013-05-31 19:07:17 +00:00
|
|
|
--ok-label "$msg_ok" \
|
|
|
|
--msgbox "$msg_text" $height $width
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2012-10-26 00:31:25 +00:00
|
|
|
############################################################ TEXTBOX FUNCTIONS
|
|
|
|
|
|
|
|
# f_dialog_textbox $file
|
|
|
|
#
|
|
|
|
# Display the contents of $file (or an error if $file does not exist, etc.) in
|
|
|
|
# a dialog(1) textbox (which has a scrollable region for the text). The textbox
|
|
|
|
# remains until the user presses ENTER or ESC, acknowledging the modal dialog.
|
|
|
|
#
|
|
|
|
# If the user presses ENTER, the exit status is zero (success), otherwise if
|
|
|
|
# the user presses ESC the exit status is 255.
|
|
|
|
#
|
|
|
|
f_dialog_textbox()
|
|
|
|
{
|
|
|
|
local file="$1"
|
2013-05-31 19:07:17 +00:00
|
|
|
local contents height width retval
|
2012-10-26 00:31:25 +00:00
|
|
|
|
|
|
|
contents=$( cat "$file" 2>&1 )
|
|
|
|
retval=$?
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
f_dialog_buttonbox_size height width \
|
|
|
|
"$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$contents"
|
2012-10-26 00:31:25 +00:00
|
|
|
|
|
|
|
if [ $retval -eq $SUCCESS ]; then
|
2013-05-31 19:07:17 +00:00
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
|
|
|
--exit-label "$msg_ok" \
|
|
|
|
--no-cancel \
|
|
|
|
--textbox "$file" $height $width
|
2012-10-26 00:31:25 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
|
|
|
--ok-label "$msg_ok" \
|
|
|
|
--msgbox "$contents" $height $width
|
2012-10-26 00:31:25 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
############################################################ YESNO FUNCTIONS
|
|
|
|
|
2013-06-18 23:48:05 +00:00
|
|
|
# f_dialog_yesno $msg_text [$hline]
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Display a dialog(1) Yes/No prompt to allow the user to make some decision.
|
|
|
|
# The yesno prompt remains until the user presses ENTER or ESC, acknowledging
|
|
|
|
# the modal dialog.
|
|
|
|
#
|
|
|
|
# If the user chooses YES the exit status is zero, or chooses NO the exit
|
|
|
|
# status is one, or presses ESC the exit status is 255.
|
|
|
|
#
|
|
|
|
f_dialog_yesno()
|
|
|
|
{
|
2013-06-18 23:48:05 +00:00
|
|
|
local msg_text="$1" height width
|
|
|
|
local hline="${2-$hline_arrows_tab_enter}"
|
2013-01-07 00:15:52 +00:00
|
|
|
|
|
|
|
f_interactive || return 0 # If non-interactive, return YES all the time
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
f_dialog_buttonbox_size height width \
|
|
|
|
"$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$msg_text" "$hline"
|
2012-07-14 03:16:57 +00:00
|
|
|
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
2013-05-31 19:07:17 +00:00
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
|
|
|
--hline "$hline" \
|
|
|
|
--ok-label "$msg_yes" \
|
|
|
|
--cancel-label "$msg_no" \
|
|
|
|
--yesno "$msg_text" $height $width
|
2012-07-14 03:16:57 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
|
|
|
--hline "$hline" \
|
|
|
|
--yes-label "$msg_yes" \
|
|
|
|
--no-label "$msg_no" \
|
|
|
|
--yesno "$msg_text" $height $width
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2013-06-18 23:48:05 +00:00
|
|
|
# f_dialog_noyes $msg_text [$hline]
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Display a dialog(1) No/Yes prompt to allow the user to make some decision.
|
|
|
|
# The noyes prompt remains until the user presses ENTER or ESC, acknowledging
|
|
|
|
# the modal dialog.
|
|
|
|
#
|
|
|
|
# If the user chooses YES the exit status is zero, or chooses NO the exit
|
|
|
|
# status is one, or presses ESC the exit status is 255.
|
|
|
|
#
|
|
|
|
# NOTE: This is just like the f_dialog_yesno function except "No" is default.
|
|
|
|
#
|
|
|
|
f_dialog_noyes()
|
|
|
|
{
|
2013-06-18 23:48:05 +00:00
|
|
|
local msg_text="$1" height width
|
|
|
|
local hline="${2-$hline_arrows_tab_enter}"
|
2013-01-07 00:15:52 +00:00
|
|
|
|
|
|
|
f_interactive || return 1 # If non-interactive, return NO all the time
|
|
|
|
|
2013-05-31 19:07:17 +00:00
|
|
|
f_dialog_buttonbox_size height width \
|
|
|
|
"$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$msg_text" "$hline"
|
2012-07-14 03:16:57 +00:00
|
|
|
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
2013-05-31 19:07:17 +00:00
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
|
|
|
--hline "$hline" \
|
|
|
|
--default-no \
|
|
|
|
--ok-label "$msg_yes" \
|
|
|
|
--cancel-label "$msg_no" \
|
|
|
|
--yesno "$msg_text" $height $width
|
2012-07-14 03:16:57 +00:00
|
|
|
else
|
2013-05-31 19:07:17 +00:00
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
|
|
|
--hline "$hline" \
|
|
|
|
--defaultno \
|
|
|
|
--yes-label "$msg_yes" \
|
|
|
|
--no-label "$msg_no" \
|
|
|
|
--yesno "$msg_text" $height $width
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
############################################################ INPUT FUNCTIONS
|
|
|
|
|
2013-06-02 05:45:25 +00:00
|
|
|
# f_dialog_inputstr_store [-s] $text
|
|
|
|
#
|
|
|
|
# Store some text from a dialog(1) inputbox to be retrieved later by
|
|
|
|
# f_dialog_inputstr_fetch(). If the first argument is `-s', the text is
|
|
|
|
# sanitized before being stored.
|
|
|
|
#
|
|
|
|
f_dialog_inputstr_store()
|
|
|
|
{
|
|
|
|
local sanitize=
|
|
|
|
[ "$1" = "-s" ] && sanitize=1 && shift 1 # -s
|
|
|
|
local text="$1"
|
|
|
|
|
|
|
|
# Sanitize the line before storing it if desired
|
|
|
|
[ "$sanitize" ] && f_dialog_line_sanitize text
|
|
|
|
|
|
|
|
setvar DIALOG_INPUTBOX_$$ "$text"
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_inputstr_fetch [$var_to_set]
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Obtain the inputstr entered by the user from the most recently displayed
|
2013-06-02 05:45:25 +00:00
|
|
|
# dialog(1) inputbox (previously stored with f_dialog_inputstr_store() above).
|
|
|
|
# If $var_to_set is NULL or missing, output is printed to stdout (which is less
|
|
|
|
# recommended due to performance degradation; in a loop for example).
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
2013-06-02 05:45:25 +00:00
|
|
|
f_dialog_inputstr_fetch()
|
2012-07-14 03:16:57 +00:00
|
|
|
{
|
2013-06-02 05:45:25 +00:00
|
|
|
local __var_to_set="$1" __cp
|
|
|
|
|
|
|
|
debug= f_getvar DIALOG_INPUTBOX_$$ "${__var_to_set:-__cp}" # get data
|
2012-09-20 23:44:13 +00:00
|
|
|
setvar DIALOG_INPUTBOX_$$ "" # scrub memory in case data was sensitive
|
2013-06-02 05:45:25 +00:00
|
|
|
|
|
|
|
# Return the line on standard-out if desired
|
|
|
|
[ "$__var_to_set" ] || echo "$__cp"
|
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
return $SUCCESS
|
|
|
|
}
|
|
|
|
|
2013-06-02 05:45:25 +00:00
|
|
|
# f_dialog_input $var_to_set $prompt [$init [$hline]]
|
2012-12-21 18:58:19 +00:00
|
|
|
#
|
|
|
|
# Prompt the user with a dialog(1) inputbox to enter some value. The inputbox
|
|
|
|
# remains until the the user presses ENTER or ESC, or otherwise ends the
|
2013-06-02 22:34:40 +00:00
|
|
|
# editing session (by selecting `Cancel' for example).
|
2012-12-21 18:58:19 +00:00
|
|
|
#
|
|
|
|
# If the user presses ENTER, the exit status is zero (success), otherwise if
|
|
|
|
# the user presses ESC the exit status is 255, or if the user chose Cancel, the
|
|
|
|
# exit status is instead 1.
|
|
|
|
#
|
|
|
|
# NOTE: The hline should correspond to the type of data you want from the user.
|
|
|
|
# NOTE: Should not be used to edit multiline values.
|
|
|
|
#
|
|
|
|
f_dialog_input()
|
|
|
|
{
|
2013-06-02 05:45:25 +00:00
|
|
|
local __var_to_set="$1" __prompt="$2" __init="$3" __hline="$4"
|
|
|
|
|
|
|
|
# NOTE: Function name appended to prevent __var_{height,width} values
|
|
|
|
# from becoming local (and thus preventing setvar from working).
|
|
|
|
local __height_input __width_input
|
|
|
|
f_dialog_inputbox_size __height_input __width_input \
|
2013-05-31 19:07:17 +00:00
|
|
|
"$DIALOG_TITLE" "$DIALOG_BACKTITLE" \
|
2013-06-02 05:45:25 +00:00
|
|
|
"$__prompt" "$__init" "$__hline"
|
2012-12-21 18:58:19 +00:00
|
|
|
|
2013-06-02 05:45:25 +00:00
|
|
|
local __opterm="--"
|
|
|
|
[ "$USE_XDIALOG" ] && __opterm=
|
2012-12-21 18:58:19 +00:00
|
|
|
|
2013-06-02 05:45:25 +00:00
|
|
|
local __dialog_input
|
|
|
|
__dialog_input=$(
|
2013-05-31 19:07:17 +00:00
|
|
|
$DIALOG \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
2013-06-02 05:45:25 +00:00
|
|
|
--hline "$__hline" \
|
2013-05-31 19:07:17 +00:00
|
|
|
--ok-label "$msg_ok" \
|
|
|
|
--cancel-label "$msg_cancel" \
|
2013-06-02 05:45:25 +00:00
|
|
|
--inputbox "$__prompt" \
|
|
|
|
$__height_input $__width_input \
|
|
|
|
$__opterm "$__init" \
|
2012-12-21 18:58:19 +00:00
|
|
|
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
|
|
|
|
)
|
2013-06-02 05:45:25 +00:00
|
|
|
local __retval=$?
|
2012-12-21 18:58:19 +00:00
|
|
|
|
2013-06-02 05:45:25 +00:00
|
|
|
# Remove warnings and leading/trailing whitespace from user input
|
|
|
|
f_dialog_line_sanitize __dialog_input
|
2012-12-21 18:58:19 +00:00
|
|
|
|
2013-06-02 05:45:25 +00:00
|
|
|
setvar "$__var_to_set" "$__dialog_input"
|
|
|
|
return $__retval
|
2012-12-21 18:58:19 +00:00
|
|
|
}
|
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
############################################################ MENU FUNCTIONS
|
|
|
|
|
Improve portion of the dialog(1) API in dialog.subr responsible for
retrieving stored data (for the --menu, --calendar, --timebox, --checklist,
and --radiolist widgets).
When we (Ron McDowell and I) developed the first version of bsdconfig, it
used temporary files to store responses from dialog(1). That hasn't been
true for some very long time, so the need to always store the return status
of dialog(1) and then call some function to clean-up is long-deprecated. The
function that used to do the clean-up was f_dialog_menutag().
We really don't need f_dialog_menutag() for its originally designed purpose,
as all dialog invocations (even when in a sub-shell) do not use temporary
files anymore.
However, we do need to keep f_dialog_menutag() around because it still fills
the need of being able to abstract the procedure for fetching stored data
provided by functions that display the aforementioned widgets.
In re-designing f_dialog_menutag(), four important changes are made:
1. Rename f_dialog_menutag() to f_dialog_menutag_fetch()
2. Introduce the new first-argument of $var_to_set to reduce number of forks
3. Create a corresponding f_dialog_menutag_store() to abstract the storage
4. Offload the sanitization to a new function, f_dialog_data_sanitize()
NOTE: That last one is important. Not all functions need to store their data
for later fetching, meanwhile every invocation of dialog should be sanitized
(as we learned early-on in the i18n-effort -- underlying libraries will spit
warnings to stderr for bad values of $LANG and since dialog outputs its
responses to stderr, we need to sanitize every response of these warnings).
These changes greatly improve readbaility and also improve performance by
reducing unnecessary forking.
2013-06-01 23:58:44 +00:00
|
|
|
# f_dialog_menutag_store [-s] $text
|
|
|
|
#
|
|
|
|
# Store some text from a dialog(1) menu to be retrieved later by
|
|
|
|
# f_dialog_menutag_fetch(). If the first argument is `-s', the text is
|
|
|
|
# sanitized before being stored.
|
|
|
|
#
|
|
|
|
f_dialog_menutag_store()
|
|
|
|
{
|
|
|
|
local sanitize=
|
|
|
|
[ "$1" = "-s" ] && sanitize=1 && shift 1 # -s
|
|
|
|
local text="$1"
|
|
|
|
|
|
|
|
# Sanitize the menutag before storing it if desired
|
|
|
|
[ "$sanitize" ] && f_dialog_data_sanitize text
|
|
|
|
|
|
|
|
setvar DIALOG_MENU_$$ "$text"
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_menutag_fetch [$var_to_set]
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Obtain the menutag chosen by the user from the most recently displayed
|
Improve portion of the dialog(1) API in dialog.subr responsible for
retrieving stored data (for the --menu, --calendar, --timebox, --checklist,
and --radiolist widgets).
When we (Ron McDowell and I) developed the first version of bsdconfig, it
used temporary files to store responses from dialog(1). That hasn't been
true for some very long time, so the need to always store the return status
of dialog(1) and then call some function to clean-up is long-deprecated. The
function that used to do the clean-up was f_dialog_menutag().
We really don't need f_dialog_menutag() for its originally designed purpose,
as all dialog invocations (even when in a sub-shell) do not use temporary
files anymore.
However, we do need to keep f_dialog_menutag() around because it still fills
the need of being able to abstract the procedure for fetching stored data
provided by functions that display the aforementioned widgets.
In re-designing f_dialog_menutag(), four important changes are made:
1. Rename f_dialog_menutag() to f_dialog_menutag_fetch()
2. Introduce the new first-argument of $var_to_set to reduce number of forks
3. Create a corresponding f_dialog_menutag_store() to abstract the storage
4. Offload the sanitization to a new function, f_dialog_data_sanitize()
NOTE: That last one is important. Not all functions need to store their data
for later fetching, meanwhile every invocation of dialog should be sanitized
(as we learned early-on in the i18n-effort -- underlying libraries will spit
warnings to stderr for bad values of $LANG and since dialog outputs its
responses to stderr, we need to sanitize every response of these warnings).
These changes greatly improve readbaility and also improve performance by
reducing unnecessary forking.
2013-06-01 23:58:44 +00:00
|
|
|
# dialog(1) menu (previously stored with f_dialog_menutag_store() above). If
|
|
|
|
# $var_to_set is NULL or missing, output is printed to stdout (which is less
|
|
|
|
# recommended due to performance degradation; in a loop for example).
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
Improve portion of the dialog(1) API in dialog.subr responsible for
retrieving stored data (for the --menu, --calendar, --timebox, --checklist,
and --radiolist widgets).
When we (Ron McDowell and I) developed the first version of bsdconfig, it
used temporary files to store responses from dialog(1). That hasn't been
true for some very long time, so the need to always store the return status
of dialog(1) and then call some function to clean-up is long-deprecated. The
function that used to do the clean-up was f_dialog_menutag().
We really don't need f_dialog_menutag() for its originally designed purpose,
as all dialog invocations (even when in a sub-shell) do not use temporary
files anymore.
However, we do need to keep f_dialog_menutag() around because it still fills
the need of being able to abstract the procedure for fetching stored data
provided by functions that display the aforementioned widgets.
In re-designing f_dialog_menutag(), four important changes are made:
1. Rename f_dialog_menutag() to f_dialog_menutag_fetch()
2. Introduce the new first-argument of $var_to_set to reduce number of forks
3. Create a corresponding f_dialog_menutag_store() to abstract the storage
4. Offload the sanitization to a new function, f_dialog_data_sanitize()
NOTE: That last one is important. Not all functions need to store their data
for later fetching, meanwhile every invocation of dialog should be sanitized
(as we learned early-on in the i18n-effort -- underlying libraries will spit
warnings to stderr for bad values of $LANG and since dialog outputs its
responses to stderr, we need to sanitize every response of these warnings).
These changes greatly improve readbaility and also improve performance by
reducing unnecessary forking.
2013-06-01 23:58:44 +00:00
|
|
|
f_dialog_menutag_fetch()
|
2012-07-14 03:16:57 +00:00
|
|
|
{
|
Improve portion of the dialog(1) API in dialog.subr responsible for
retrieving stored data (for the --menu, --calendar, --timebox, --checklist,
and --radiolist widgets).
When we (Ron McDowell and I) developed the first version of bsdconfig, it
used temporary files to store responses from dialog(1). That hasn't been
true for some very long time, so the need to always store the return status
of dialog(1) and then call some function to clean-up is long-deprecated. The
function that used to do the clean-up was f_dialog_menutag().
We really don't need f_dialog_menutag() for its originally designed purpose,
as all dialog invocations (even when in a sub-shell) do not use temporary
files anymore.
However, we do need to keep f_dialog_menutag() around because it still fills
the need of being able to abstract the procedure for fetching stored data
provided by functions that display the aforementioned widgets.
In re-designing f_dialog_menutag(), four important changes are made:
1. Rename f_dialog_menutag() to f_dialog_menutag_fetch()
2. Introduce the new first-argument of $var_to_set to reduce number of forks
3. Create a corresponding f_dialog_menutag_store() to abstract the storage
4. Offload the sanitization to a new function, f_dialog_data_sanitize()
NOTE: That last one is important. Not all functions need to store their data
for later fetching, meanwhile every invocation of dialog should be sanitized
(as we learned early-on in the i18n-effort -- underlying libraries will spit
warnings to stderr for bad values of $LANG and since dialog outputs its
responses to stderr, we need to sanitize every response of these warnings).
These changes greatly improve readbaility and also improve performance by
reducing unnecessary forking.
2013-06-01 23:58:44 +00:00
|
|
|
local __var_to_set="$1" __cp
|
|
|
|
|
|
|
|
debug= f_getvar DIALOG_MENU_$$ "${__var_to_set:-__cp}" # get the data
|
2012-09-20 23:44:13 +00:00
|
|
|
setvar DIALOG_MENU_$$ "" # scrub memory in case data was sensitive
|
Improve portion of the dialog(1) API in dialog.subr responsible for
retrieving stored data (for the --menu, --calendar, --timebox, --checklist,
and --radiolist widgets).
When we (Ron McDowell and I) developed the first version of bsdconfig, it
used temporary files to store responses from dialog(1). That hasn't been
true for some very long time, so the need to always store the return status
of dialog(1) and then call some function to clean-up is long-deprecated. The
function that used to do the clean-up was f_dialog_menutag().
We really don't need f_dialog_menutag() for its originally designed purpose,
as all dialog invocations (even when in a sub-shell) do not use temporary
files anymore.
However, we do need to keep f_dialog_menutag() around because it still fills
the need of being able to abstract the procedure for fetching stored data
provided by functions that display the aforementioned widgets.
In re-designing f_dialog_menutag(), four important changes are made:
1. Rename f_dialog_menutag() to f_dialog_menutag_fetch()
2. Introduce the new first-argument of $var_to_set to reduce number of forks
3. Create a corresponding f_dialog_menutag_store() to abstract the storage
4. Offload the sanitization to a new function, f_dialog_data_sanitize()
NOTE: That last one is important. Not all functions need to store their data
for later fetching, meanwhile every invocation of dialog should be sanitized
(as we learned early-on in the i18n-effort -- underlying libraries will spit
warnings to stderr for bad values of $LANG and since dialog outputs its
responses to stderr, we need to sanitize every response of these warnings).
These changes greatly improve readbaility and also improve performance by
reducing unnecessary forking.
2013-06-01 23:58:44 +00:00
|
|
|
|
|
|
|
# Return the data on standard-out if desired
|
|
|
|
[ "$__var_to_set" ] || echo "$__cp"
|
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
return $SUCCESS
|
|
|
|
}
|
|
|
|
|
2013-06-04 03:30:44 +00:00
|
|
|
# f_dialog_menuitem_store [-s] $text
|
|
|
|
#
|
|
|
|
# Store the item from a dialog(1) menu (see f_dialog_menutag2item()) to be
|
|
|
|
# retrieved later by f_dialog_menuitem_fetch(). If the first argument is `-s',
|
|
|
|
# the text is sanitized before being stored.
|
|
|
|
#
|
|
|
|
f_dialog_menuitem_store()
|
|
|
|
{
|
|
|
|
local sanitize=
|
|
|
|
[ "$1" = "-s" ] && sanitize=1 && shift 1 # -s
|
|
|
|
local text="$1"
|
|
|
|
|
|
|
|
# Sanitize the menuitem before storing it if desired
|
|
|
|
[ "$sanitize" ] && f_dialog_data_sanitize text
|
|
|
|
|
|
|
|
setvar DIALOG_MENUITEM_$$ "$text"
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_menuitem_fetch [$var_to_set]
|
|
|
|
#
|
|
|
|
# Obtain the menuitem chosen by the user from the most recently displayed
|
|
|
|
# dialog(1) menu (previously stored with f_dialog_menuitem_store() above). If
|
|
|
|
# $var_to_set is NULL or missing, output is printed to stdout (which is less
|
|
|
|
# recommended due to performance degradation; in a loop for example).
|
|
|
|
#
|
|
|
|
f_dialog_menuitem_fetch()
|
|
|
|
{
|
|
|
|
local __var_to_set="$1" __cp
|
|
|
|
|
|
|
|
debug= f_getvar DIALOG_MENUITEM_$$ "${__var_to_set:-__cp}" # get data
|
|
|
|
setvar DIALOG_MENUITEM_$$ "" # scrub memory in case data was sensitive
|
|
|
|
|
|
|
|
# Return the data on standard-out if desired
|
|
|
|
[ "$__var_to_set" ] || echo "$__cp"
|
|
|
|
|
|
|
|
return $SUCCESS
|
|
|
|
}
|
|
|
|
|
2013-06-02 09:02:12 +00:00
|
|
|
# f_dialog_default_store [-s] $text
|
|
|
|
#
|
|
|
|
# Store some text to be used later as the --default-item argument to dialog(1)
|
|
|
|
# (or Xdialog(1)) for --menu, --checklist, and --radiolist widgets. Retrieve
|
|
|
|
# the text later with f_dialog_menutag_fetch(). If the first argument is `-s',
|
|
|
|
# the text is sanitized before being stored.
|
|
|
|
#
|
|
|
|
f_dialog_default_store()
|
|
|
|
{
|
|
|
|
local sanitize=
|
|
|
|
[ "$1" = "-s" ] && sanitize=1 && shift 1 # -s
|
|
|
|
local text="$1"
|
|
|
|
|
|
|
|
# Sanitize the defaulitem before storing it if desired
|
|
|
|
[ "$sanitize" ] && f_dialog_data_sanitize text
|
|
|
|
|
|
|
|
setvar DEFAULTITEM_$$ "$text"
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_default_fetch [$var_to_set]
|
|
|
|
#
|
|
|
|
# Obtain text to be used with the --default-item argument of dialog(1) (or
|
|
|
|
# Xdialog(1)) (previously stored with f_dialog_default_store() above). If
|
|
|
|
# $var_to_set is NULL or missing, output is printed to stdout (which is less
|
|
|
|
# recommended due to performance degradation; in a loop for example).
|
|
|
|
#
|
|
|
|
f_dialog_default_fetch()
|
|
|
|
{
|
|
|
|
local __var_to_set="$1" __cp
|
|
|
|
|
|
|
|
debug= f_getvar DEFAULTITEM_$$ "${__var_to_set:-__cp}" # get the data
|
|
|
|
setvar DEFAULTITEM_$$ "" # scrub memory in case data was sensitive
|
|
|
|
|
|
|
|
# Return the data on standard-out if desired
|
|
|
|
[ "$__var_to_set" ] || echo "$__cp"
|
|
|
|
|
|
|
|
return $SUCCESS
|
|
|
|
}
|
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
# f_dialog_menutag2item $tag_chosen $tag1 $item1 $tag2 $item2 ...
|
|
|
|
#
|
|
|
|
# To use the `--menu' option of dialog(1) you must pass an ordered list of
|
|
|
|
# tag/item pairs on the command-line. When the user selects a menu option the
|
|
|
|
# tag for that item is printed to stderr.
|
|
|
|
#
|
|
|
|
# This function allows you to dereference the tag chosen by the user back into
|
|
|
|
# the item associated with said tag.
|
|
|
|
#
|
|
|
|
# Pass the tag chosen by the user as the first argument, followed by the
|
|
|
|
# ordered list of tag/item pairs (HINT: use the same tag/item list as was
|
|
|
|
# passed to dialog(1) for consistency).
|
|
|
|
#
|
|
|
|
# If the tag cannot be found, NULL is returned.
|
|
|
|
#
|
|
|
|
f_dialog_menutag2item()
|
|
|
|
{
|
|
|
|
local tag="$1" tagn item
|
|
|
|
shift 1 # tag
|
|
|
|
|
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
tagn="$1"
|
|
|
|
item="$2"
|
|
|
|
shift 2 # tagn/item
|
|
|
|
|
|
|
|
if [ "$tag" = "$tagn" ]; then
|
|
|
|
echo "$item"
|
|
|
|
return $SUCCESS
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
return $FAILURE
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_menutag2item_with_help $tag_chosen $tag1 $item1 $help1 \
|
|
|
|
# $tag2 $item2 $help2 ...
|
|
|
|
#
|
|
|
|
# To use the `--menu' option of dialog(1) with the `--item-help' option, you
|
|
|
|
# must pass an ordered list of tag/item/help triplets on the command-line. When
|
|
|
|
# the user selects a menu option the tag for that item is printed to stderr.
|
|
|
|
#
|
|
|
|
# This function allows you to dereference the tag chosen by the user back into
|
|
|
|
# the item associated with said tag (help is discarded/ignored).
|
|
|
|
#
|
|
|
|
# Pass the tag chosen by the user as the first argument, followed by the
|
|
|
|
# ordered list of tag/item/help triplets (HINT: use the same tag/item/help list
|
|
|
|
# as was passed to dialog(1) for consistency).
|
|
|
|
#
|
|
|
|
# If the tag cannot be found, NULL is returned.
|
|
|
|
#
|
|
|
|
f_dialog_menutag2item_with_help()
|
|
|
|
{
|
|
|
|
local tag="$1" tagn item
|
|
|
|
shift 1 # tag
|
|
|
|
|
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
tagn="$1"
|
|
|
|
item="$2"
|
|
|
|
shift 3 # tagn/item/help
|
|
|
|
|
|
|
|
if [ "$tag" = "$tagn" ]; then
|
|
|
|
echo "$item"
|
|
|
|
return $SUCCESS
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
return $FAILURE
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_menutag2index $tag_chosen $tag1 $item1 $tag2 $item2 ...
|
|
|
|
#
|
|
|
|
# To use the `--menu' option of dialog(1) you must pass an ordered list of
|
|
|
|
# tag/item pairs on the command-line. When the user selects a menu option the
|
|
|
|
# tag for that item is printed to stderr.
|
|
|
|
#
|
|
|
|
# This function allows you to dereference the tag chosen by the user back into
|
|
|
|
# the index associated with said tag. The index is the one-based tag/item pair
|
|
|
|
# array position within the ordered list of tag/item pairs passed to dialog(1).
|
|
|
|
#
|
|
|
|
# Pass the tag chosen by the user as the first argument, followed by the
|
|
|
|
# ordered list of tag/item pairs (HINT: use the same tag/item list as was
|
|
|
|
# passed to dialog(1) for consistency).
|
|
|
|
#
|
|
|
|
# If the tag cannot be found, NULL is returned.
|
|
|
|
#
|
|
|
|
f_dialog_menutag2index()
|
|
|
|
{
|
|
|
|
local tag="$1" tagn n=1
|
|
|
|
shift 1 # tag
|
|
|
|
|
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
tagn="$1"
|
|
|
|
shift 2 # tagn/item
|
|
|
|
|
|
|
|
if [ "$tag" = "$tagn" ]; then
|
|
|
|
echo $n
|
|
|
|
return $SUCCESS
|
|
|
|
fi
|
|
|
|
n=$(( $n + 1 ))
|
|
|
|
done
|
|
|
|
return $FAILURE
|
|
|
|
}
|
|
|
|
|
|
|
|
# f_dialog_menutag2index_with_help $tag_chosen $tag1 $item1 $help1 \
|
|
|
|
# $tag2 $item2 $help2 ...
|
|
|
|
#
|
|
|
|
# To use the `--menu' option of dialog(1) with the `--item-help' option, you
|
|
|
|
# must pass an ordered list of tag/item/help triplets on the command-line. When
|
|
|
|
# the user selects a menu option the tag for that item is printed to stderr.
|
|
|
|
#
|
|
|
|
# This function allows you to dereference the tag chosen by the user back into
|
|
|
|
# the index associated with said tag. The index is the one-based tag/item/help
|
|
|
|
# triplet array position within the ordered list of tag/item/help triplets
|
|
|
|
# passed to dialog(1).
|
|
|
|
#
|
|
|
|
# Pass the tag chosen by the user as the first argument, followed by the
|
|
|
|
# ordered list of tag/item/help triplets (HINT: use the same tag/item/help list
|
|
|
|
# as was passed to dialog(1) for consistency).
|
|
|
|
#
|
|
|
|
# If the tag cannot be found, NULL is returned.
|
|
|
|
#
|
|
|
|
f_dialog_menutag2index_with_help()
|
|
|
|
{
|
|
|
|
local tag="$1" tagn n=1
|
|
|
|
shift 1 # tag
|
|
|
|
|
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
tagn="$1"
|
|
|
|
shift 3 # tagn/item/help
|
|
|
|
|
|
|
|
if [ "$tag" = "$tagn" ]; then
|
|
|
|
echo $n
|
|
|
|
return $SUCCESS
|
|
|
|
fi
|
|
|
|
n=$(( $n + 1 ))
|
|
|
|
done
|
|
|
|
return $FAILURE
|
|
|
|
}
|
|
|
|
|
|
|
|
############################################################ INIT FUNCTIONS
|
|
|
|
|
|
|
|
# f_dialog_init
|
|
|
|
#
|
|
|
|
# Initialize (or re-initialize) the dialog module after setting/changing any
|
|
|
|
# of the following environment variables:
|
|
|
|
#
|
|
|
|
# USE_XDIALOG Either NULL or Non-NULL. If given a value will indicate
|
|
|
|
# that Xdialog(1) should be used instead of dialog(1).
|
|
|
|
#
|
|
|
|
# SECURE Either NULL or Non-NULL. If given a value will indicate
|
|
|
|
# that (while running as root) sudo(8) authentication is
|
|
|
|
# required to proceed.
|
|
|
|
#
|
|
|
|
f_dialog_init()
|
|
|
|
{
|
|
|
|
DIALOG_SELF_INITIALIZE=
|
|
|
|
|
2012-09-20 23:44:13 +00:00
|
|
|
#
|
|
|
|
# Clone terminal stdout so we can redirect to it from within sub-shells
|
|
|
|
#
|
|
|
|
eval exec $DIALOG_TERMINAL_PASSTHRU_FD\>\&1
|
|
|
|
|
2013-05-14 03:21:13 +00:00
|
|
|
#
|
|
|
|
# Add `-S' and `-X' to the list of standard arguments supported by all
|
|
|
|
#
|
|
|
|
case "$GETOPTS_STDARGS" in
|
|
|
|
*SX*) : good ;; # already present
|
|
|
|
*) GETOPTS_STDARGS="${GETOPTS_STDARGS}SX"
|
|
|
|
esac
|
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
#
|
|
|
|
# Process stored command-line arguments
|
|
|
|
#
|
2013-05-14 03:21:13 +00:00
|
|
|
f_dprintf "f_dialog_init: ARGV=[%s] GETOPTS_STDARGS=[%s]" \
|
|
|
|
"$ARGV" "$GETOPTS_STDARGS"
|
|
|
|
SECURE=$( set -- $ARGV
|
2013-06-02 22:04:39 +00:00
|
|
|
while getopts \
|
|
|
|
"$GETOPTS_STDARGS$GETOPTS_EXTRA$GETOPTS_ALLFLAGS" \
|
|
|
|
flag > /dev/null; do
|
2012-07-14 03:16:57 +00:00
|
|
|
case "$flag" in
|
2013-06-24 20:58:54 +00:00
|
|
|
S) echo 1 ;;
|
2012-07-14 03:16:57 +00:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
)
|
2013-05-14 03:21:13 +00:00
|
|
|
USE_XDIALOG=$( set -- $ARGV
|
2013-06-02 22:04:39 +00:00
|
|
|
while getopts \
|
|
|
|
"$GETOPTS_STDARGS$GETOPTS_EXTRA$GETOPTS_ALLFLAGS" \
|
|
|
|
flag > /dev/null; do
|
2012-07-14 03:16:57 +00:00
|
|
|
case "$flag" in
|
2013-06-24 20:58:54 +00:00
|
|
|
S|X) echo 1 ;;
|
2012-07-14 03:16:57 +00:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
)
|
2013-05-14 03:21:13 +00:00
|
|
|
f_dprintf "f_dialog_init: SECURE=[%s] USE_XDIALOG=[%s]" \
|
|
|
|
"$SECURE" "$USE_XDIALOG"
|
2012-07-14 03:16:57 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# Process `-X' command-line option
|
|
|
|
#
|
|
|
|
[ "$USE_XDIALOG" ] && DIALOG=Xdialog
|
|
|
|
|
|
|
|
#
|
|
|
|
# Sanity check, or die gracefully
|
|
|
|
#
|
|
|
|
if ! f_have $DIALOG; then
|
|
|
|
unset USE_XDIALOG
|
2013-06-02 22:45:54 +00:00
|
|
|
local failed_dialog="$DIALOG"
|
2012-07-14 03:16:57 +00:00
|
|
|
DIALOG=dialog
|
|
|
|
f_die 1 "$msg_no_such_file_or_directory" "$pgm" "$failed_dialog"
|
|
|
|
fi
|
|
|
|
|
|
|
|
#
|
|
|
|
# If we're already running as root but we got there by way of sudo(8)
|
|
|
|
# and we have X11, we should merge the xauth(1) credentials from our
|
|
|
|
# original user.
|
|
|
|
#
|
|
|
|
if [ "$USE_XDIALOG" ] &&
|
|
|
|
[ "$( id -u )" = "0" ] &&
|
|
|
|
[ "$SUDO_USER" -a "$DISPLAY" ]
|
|
|
|
then
|
|
|
|
if ! f_have xauth; then
|
|
|
|
# Die gracefully, as we [likely] can't use Xdialog(1)
|
|
|
|
unset USE_XDIALOG
|
|
|
|
DIALOG=dialog
|
|
|
|
f_die 1 "$msg_no_such_file_or_directory" "$pgm" "xauth"
|
|
|
|
fi
|
|
|
|
HOSTNAME=$(hostname)
|
2013-06-02 22:45:54 +00:00
|
|
|
local displaynum="${DISPLAY#*:}"
|
2012-07-14 03:16:57 +00:00
|
|
|
eval xauth -if \~$SUDO_USER/.Xauthority extract - \
|
|
|
|
\"\$HOSTNAME/unix:\$displaynum\" \
|
|
|
|
\"\$HOSTNAME:\$displaynum\" | sudo sh -c 'xauth -ivf \
|
2012-09-21 19:03:25 +00:00
|
|
|
~root/.Xauthority merge - > /dev/null 2>&1'
|
2012-07-14 03:16:57 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
#
|
|
|
|
# Probe Xdialog(1) for maximum height/width constraints, or die
|
|
|
|
# gracefully
|
|
|
|
#
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
2013-06-02 22:45:54 +00:00
|
|
|
local maxsize
|
2012-07-14 03:16:57 +00:00
|
|
|
if ! maxsize=$( LANG= LC_ALL= $DIALOG --print-maxsize 2>&1 )
|
|
|
|
then
|
|
|
|
# Xdialog(1) failed, fall back to dialog(1)
|
|
|
|
unset USE_XDIALOG
|
2013-05-31 19:07:17 +00:00
|
|
|
|
|
|
|
# Display the error message produced by Xdialog(1)
|
|
|
|
local height width
|
|
|
|
f_dialog_buttonbox_size height width \
|
|
|
|
"$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$maxsize"
|
|
|
|
dialog \
|
|
|
|
--title "$DIALOG_TITLE" \
|
|
|
|
--backtitle "$DIALOG_BACKTITLE" \
|
|
|
|
--ok-label "$msg_ok" \
|
|
|
|
--msgbox "$maxsize" $height $width
|
2012-07-14 03:16:57 +00:00
|
|
|
exit $FAILURE
|
|
|
|
fi
|
|
|
|
|
|
|
|
XDIALOG_MAXSIZE=$(
|
|
|
|
set -- ${maxsize##*:}
|
|
|
|
|
|
|
|
height=${1%,}
|
|
|
|
width=$2
|
|
|
|
|
|
|
|
echo $height $width
|
|
|
|
)
|
|
|
|
fi
|
|
|
|
|
|
|
|
#
|
|
|
|
# If using Xdialog(1), swap DIALOG_TITLE with DIALOG_BACKTITLE.
|
|
|
|
# The reason for this is because many dialog(1) applications use
|
|
|
|
# --backtitle for the program name (which is better suited as
|
|
|
|
# --title with Xdialog(1)).
|
|
|
|
#
|
|
|
|
if [ "$USE_XDIALOG" ]; then
|
2013-06-02 22:45:54 +00:00
|
|
|
local _DIALOG_TITLE="$DIALOG_TITLE"
|
2012-07-14 03:16:57 +00:00
|
|
|
DIALOG_TITLE="$DIALOG_BACKTITLE"
|
|
|
|
DIALOG_BACKTITLE="$_DIALOG_TITLE"
|
|
|
|
fi
|
2012-12-25 10:47:45 +00:00
|
|
|
|
|
|
|
f_dprintf "f_dialog_init: dialog(1) API initialized."
|
2012-07-14 03:16:57 +00:00
|
|
|
}
|
|
|
|
|
2012-11-27 22:11:53 +00:00
|
|
|
############################################################ MAIN
|
|
|
|
|
2012-12-29 00:30:30 +00:00
|
|
|
#
|
|
|
|
# Self-initialize unless requested otherwise
|
|
|
|
#
|
2012-12-25 10:47:45 +00:00
|
|
|
f_dprintf "%s: DIALOG_SELF_INITIALIZE=[%s]" \
|
|
|
|
dialog.subr "$DIALOG_SELF_INITIALIZE"
|
2012-12-21 20:46:58 +00:00
|
|
|
case "$DIALOG_SELF_INITIALIZE" in
|
|
|
|
""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
|
|
|
|
*) f_dialog_init
|
|
|
|
esac
|
2012-11-27 22:11:53 +00:00
|
|
|
|
2012-12-25 10:47:45 +00:00
|
|
|
f_dprintf "%s: Successfully loaded." dialog.subr
|
|
|
|
|
2012-07-14 03:16:57 +00:00
|
|
|
fi # ! $_DIALOG_SUBR
|