summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordteske <dteske@FreeBSD.org>2013-06-04 03:30:44 +0000
committerdteske <dteske@FreeBSD.org>2013-06-04 03:30:44 +0000
commit5bc8f8ca233e4b9a424e65b9803014678682095b (patch)
tree5d470a5de573a2a5f4cea933a5c7634367aa240e
parent1110d62208360bbc03f7dc79c457de81a9e49f4c (diff)
downloadFreeBSD-src-5bc8f8ca233e4b9a424e65b9803014678682095b.zip
FreeBSD-src-5bc8f8ca233e4b9a424e65b9803014678682095b.tar.gz
Similar to r251236, r251242, and r251244. Introduce new function-pair to
dialog(1) API in dialog.subr responsible for retrieving menu-choice data (for the --menu widget). Add f_dialog_menuitem_store()/f_dialog_menuitem_fetch() for storing and retrieving the menuitem (not the tag) from a --menu widget result. The dialog --menu widget returns the `tag' from the tag/item pair of choices for a menu list. Because the menu list is often local to the function that is displaying it, the ability to dereference this into the item is not possible unless you use a global. This changes things so the function (upon successful return of dialog) dereferences the tag into the item and stores it for later retrieval using these functions. NOTE: Tags are dereferenced into items using f_dialog_menutag2item().
-rwxr-xr-xusr.sbin/bsdconfig/console/ttys40
-rw-r--r--usr.sbin/bsdconfig/share/dialog.subr38
-rwxr-xr-xusr.sbin/bsdconfig/share/packages/packages.subr11
-rwxr-xr-xusr.sbin/bsdconfig/startup/rcvar30
4 files changed, 81 insertions, 38 deletions
diff --git a/usr.sbin/bsdconfig/console/ttys b/usr.sbin/bsdconfig/console/ttys
index f488efd..d03afab 100755
--- a/usr.sbin/bsdconfig/console/ttys
+++ b/usr.sbin/bsdconfig/console/ttys
@@ -48,22 +48,6 @@ ipgm=$( f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
#
ETC_TTYS=/etc/ttys
-############################################################ GLOBALS
-
-#
-# Terminal-type map/menu-item list
-#
-TTY_MENU_LIST="
- '1 $msg_none' '$msg_none_ttys_desc'
- '2 $msg_ibm_437_vga_default' 'cons25'
- '3 $msg_iso_8859_1' 'cons25l1'
- '4 $msg_iso_8859_2' 'cons25l2'
- '5 $msg_iso_8859_7' 'cons25l7'
- '6 $msg_koi8_r' 'cons25r'
- '7 $msg_koi8_u' 'cons25u'
- '8 $msg_us_ascii' 'cons25w'
-" # END-QUOTE
-
############################################################ FUNCTIONS
# dialog_menu_main
@@ -73,6 +57,16 @@ TTY_MENU_LIST="
dialog_menu_main()
{
local prompt="$msg_ttys_menu_text"
+ local menu_list="
+ '1 $msg_none' '$msg_none_ttys_desc'
+ '2 $msg_ibm_437_vga_default' 'cons25'
+ '3 $msg_iso_8859_1' 'cons25l1'
+ '4 $msg_iso_8859_2' 'cons25l2'
+ '5 $msg_iso_8859_7' 'cons25l7'
+ '6 $msg_koi8_r' 'cons25r'
+ '7 $msg_koi8_u' 'cons25u'
+ '8 $msg_us_ascii' 'cons25w'
+ " # END-QUOTE
local hline="$hline_choose_a_terminal_type"
local height width rows
@@ -81,7 +75,7 @@ dialog_menu_main()
\"\$DIALOG_BACKTITLE\" \
\"\$prompt\" \
\"\$hline\" \
- $TTY_MENU_LIST
+ $menu_list
local menu_choice
menu_choice=$( eval $DIALOG \
@@ -92,11 +86,19 @@ dialog_menu_main()
--cancel-label \"\$msg_cancel\" \
--menu \"\$prompt\" \
$height $width $rows \
- $TTY_MENU_LIST \
+ $menu_ist \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
local retval=$?
f_dialog_menutag_store -s "$menu_choice"
+
+ if [ $retval -eq $SUCCESS ]; then
+ local item
+ item=$( eval f_dialog_menutag2item \
+ \"\$menu_choice\" $menu_list )
+ f_dialog_menuitem_store "$item"
+ fi
+
return $retval
}
@@ -187,7 +189,7 @@ while :; do
[ "$mtag" = "1 $msg_none" ] && break
- consterm=$( eval f_dialog_menutag2item \"\$mtag\" $TTY_MENU_LIST )
+ f_dialog_menuitem_fetch consterm
err=$( ttys_set_type "$consterm" 2>&1 )
[ "$err" ] || break
diff --git a/usr.sbin/bsdconfig/share/dialog.subr b/usr.sbin/bsdconfig/share/dialog.subr
index 523ef1a..43a78ed 100644
--- a/usr.sbin/bsdconfig/share/dialog.subr
+++ b/usr.sbin/bsdconfig/share/dialog.subr
@@ -1770,6 +1770,44 @@ f_dialog_menutag_fetch()
return $SUCCESS
}
+# 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
+}
+
# f_dialog_default_store [-s] $text
#
# Store some text to be used later as the --default-item argument to dialog(1)
diff --git a/usr.sbin/bsdconfig/share/packages/packages.subr b/usr.sbin/bsdconfig/share/packages/packages.subr
index 3e5c031..28ed7f1 100755
--- a/usr.sbin/bsdconfig/share/packages/packages.subr
+++ b/usr.sbin/bsdconfig/share/packages/packages.subr
@@ -360,9 +360,10 @@ f_package_index_get_page()
# only matters if there are multiple pages; which is determined by the global
# maximum $PACKAGE_MENU_PAGESIZE).
#
-# On success, if the user doesn't press ESC or choose Cancel, the environment
-# variable $DIALOG_MENUITEM_$$ will hold the item associated with the chosen
-# tag (accessible through f_dialog_menutag_fetch()).
+# On success, if the user doesn't press ESC or choose Cancel, use
+# f_dialog_menuitem_fetch() to populate a local variable with the item (not
+# tag) corresponding to the user's selection. The tag portion of the user's
+# selection is available through f_dialog_menutag_fetch().
#
f_package_menu_select()
{
@@ -499,7 +500,7 @@ f_package_menu_select()
local item
item=$( eval f_dialog_menutag2item${SHOW_DESC:+_with_help} \
\"\$menu_choice\" $menu_list )
- setvar DIALOG_MENUITEM_$$ "$item"
+ f_dialog_menuitem_store "$item"
fi
return $retval
@@ -739,7 +740,7 @@ f_package_config()
# Treat any other selection as a package
package="${menu_choice# }" # Trim leading space
f_str2varname $package varpkg
- f_getvar DIALOG_MENUITEM_$$ mark
+ f_dialog_menuitem_fetch mark
mark="${mark#?}"
mark="${mark%%\] *}"
case "$mark" in
diff --git a/usr.sbin/bsdconfig/startup/rcvar b/usr.sbin/bsdconfig/startup/rcvar
index 7f6d52b..f335886 100755
--- a/usr.sbin/bsdconfig/startup/rcvar
+++ b/usr.sbin/bsdconfig/startup/rcvar
@@ -49,7 +49,6 @@ ipgm=$( f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
#
RCVAR_MAP=
_RCVAR_MAP=
-RCVAR_MENU_LIST=
#
# Options
@@ -66,15 +65,12 @@ RCVAR_MENU_LIST=
dialog_menu_main()
{
local prompt=
- local hline="$hline_arrows_tab_enter"
- local defaultitem= # Calculated below
-
- # NOTE: Using a GLOBAL here because caller will need this list to turn
- # the menu tag into the menu item with f_dialog_menutag2item()
- RCVAR_MENU_LIST="
+ local menu_list="
'X $msg_exit' '$msg_exit_this_menu'
${SHOW_DESC:+'$msg_exit_this_menu'}
" # END-QUOTE
+ local hline="$hline_arrows_tab_enter"
+ local defaultitem= # Calculated below
if [ ! "$_RCVAR_MAP" ]; then
# Generate RCVAR_MAP of `rcvar dflt script desc ...' per-line
@@ -84,7 +80,7 @@ dialog_menu_main()
export _RCVAR_MAP=1
fi
- RCVAR_MENU_LIST="$RCVAR_MENU_LIST $(
+ menu_list="$menu_list $(
. "$RC_DEFAULTS" > /dev/null
source_rc_confs > /dev/null
for rcvar in $( echo "$RCVAR_MAP" | awk '{print $1}' ); do
@@ -126,7 +122,7 @@ dialog_menu_main()
}'
)"
- set -f # set noglob because descriptions in the $RCVAR_MENU_LIST may
+ set -f # set noglob because descriptions in the $menu_list may
# contain `*' and get expanded by dialog(1). This prevents
# dialog(1) from expanding wildcards in the help line.
@@ -137,7 +133,7 @@ dialog_menu_main()
\"\$DIALOG_BACKTITLE\" \
\"\$prompt\" \
\"\$hline\" \
- $RCVAR_MENU_LIST
+ $menu_list
# Obtain default-item from previously stored selection
f_dialog_default_fetch defaultitem
@@ -154,13 +150,21 @@ dialog_menu_main()
--default-item \"\$defaultitem\" \
--menu \"\$prompt\" \
$height $width $rows \
- $RCVAR_MENU_LIST \
+ $menu_list \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
local retval=$?
f_dialog_data_sanitize menu_choice
f_dialog_menutag_store "$menu_choice"
f_dialog_default_store "$menu_choice"
+
+ if [ $retval -eq $SUCCESS ]; then
+ local item
+ item=$( eval f_dialog_menutag2item${SHOW_DESC:+_with_help} \
+ \"\$menu_choice\" $menu_list )
+ f_dialog_menuitem_store "$item"
+ fi
+
return $retval
}
@@ -193,10 +197,8 @@ while :; do
case "$mtag" in
"X $msg_exit") break ;;
*) # Anything else is an rcvar to toggle
-
rcvar="${mtag# }"
- value=$( eval f_dialog_menutag2item${SHOW_DESC:+_with_help} \
- \"\$mtag\" $RCVAR_MENU_LIST )
+ f_dialog_menuitem_fetch value
# Determine the new [toggled] value to use
case "$value" in
OpenPOWER on IntegriCloud