2 # Copyright (C) 2006 Andre Noll
3 # Licensed under the LGPL, version 3. See COPYING and COPYING.LESSER.
5 if [[ "$(type -t _gsu_setup)" != "function" ]]; then
6 gsu_dir
=${gsu_dir:-${BASH_SOURCE[0]%/*}}
7 .
"$gsu_dir/common" ||
exit 1
11 _gsu_node_name_pattern
='[a-zA-Z_]'
18 gsu_msg
"fatal: could not get terminal geometry"
33 1) ret
=1;; # cancelled
35 result
="dialog exit code $ec"
40 # Open a dialog box which asks the user to input a text
42 # Usage: gsu_input_box <text> <init>
44 # <text> is displayed above of the input field, which is is preset to <init>.
45 # The entered text is returned in $result. On success (user pressed OK)
46 # the function returns zero. If the user selected Cancel, the return value is
47 # one. On dialog errors, a negative error code is returned.
50 local g text
="$1" init
="$2"
54 result
="$(dialog --inputbox "$text" $g "$init" 3>&1 1>&2 2>&3 3>&-)"
58 # Show the given file in a text box
60 # Usage: gsu_textbox <path>
62 # The box has an OK button which closes the box when activated.
72 dialog
--textbox "$file" $g
76 # Show a message in a text box
78 # Usage: gsu_msgbox <text>
80 # This is like gsu_textbox() but the text is passed as a string.
85 # Some versions of dialog segfault if the text is too long. Hence we
86 # always use a temporary file.
87 gsu_make_tempfile
'gsu_msgbox.XXXXXXXXXX'
90 trap "rm -f $tmp" EXIT
93 rm -f "$tmp" # ignore errors
98 local header
="${1:-root}"
108 result
="$(dialog --menu "$gsu_banner_txt ($header)" $opts 3>&1 1>&2 2>&3 3>&-)"
114 local tmp
="${1%%$_gsu_node_name_pattern*}"
120 local tree
="$1" root
="${2%/}"
123 ret
=-$E_GSU_MENU_TREE
124 result
="subtree grep failed"
125 first
="$(grep -n "$TAB\
{1,\
}$root/" <<< "$tree")" ||
return
126 [[ -z "$first" ]] && return
128 line_num
="${first%%:*}"
129 _get_level
"${first#*:}"
132 #echo "line: $line_num, root: $root, indent level: $level"
133 result
="$(sed -e "1,${line_num}d
;" <<< "$tree" \
134 | sed -e "/^
$TAB\
{1,$level\
}$_gsu_node_name_pattern/,\
$d" \
135 | sed -e "/^
$TAB\
{$
((level
+ 2))\
}/d
")"
137 ret
=-$E_GSU_MENU_TREE
138 result
="sed command for subtree $root failed"
146 local tree
="$1" TAB
=' '
148 result
="$(grep "^
${TAB}${_gsu_node_name_pattern}" <<< "$tree")"
150 ret
=-$E_GSU_MENU_TREE
151 result
="root node grep failed"
159 local header
="$1" old_header
160 local tree
="$2" subtree
="$3"
163 _gsu_menu
"$header" "$subtree"
164 ((ret
< 0)) && return
165 [[ -z "$result" ]] && return # menu was cancelled
166 if [[ "${result%/}" != "$result" ]]; then
169 _get_subtree
"$tree" "$header"
170 ((ret
< 0)) && return
171 _browse
"$header" "$tree" "$result"
172 ((ret
< 0)) && return
176 eval ${gsu_name}_
$result
182 local tree
="$1" subtree
184 type -t dialog
&> /dev
/null
186 gsu_msg
"dialog executable not found"
189 _get_root_nodes
"$tree"
191 _browse
"main menu" "$tree" "$subtree"