X-Git-Url: http://git.tuebingen.mpg.de/?p=gsu.git;a=blobdiff_plain;f=gui;h=34f732e27bacc9646710efb0c11eef09659a2ce4;hp=db81f7fd1c308d84cc6691791de13b248bc2e305;hb=32134f1512eab90da01e9cfd9f676bffef27a939;hpb=ce3fe9aefcd3c79fe87085e62684fa7d2d9bb9f2 diff --git a/gui b/gui index db81f7f..34f732e 100644 --- a/gui +++ b/gui @@ -1,4 +1,6 @@ #!/bin/bash +# Copyright (C) 2006 Andre Noll +# Licensed under the LGPL, version 3. See COPYING and COPYING.LESSER. if [[ "$(type -t _gsu_setup)" != "function" ]]; then gsu_dir=${gsu_dir:-${BASH_SOURCE[0]%/*}} @@ -22,6 +24,27 @@ _get_geometry() result="$y $x" } +_set_dialog_ret() +{ + local ec="$1" + + case "$ec" in + 0) ret=$GSU_SUCCESS;; + 1) ret=1;; # cancelled + *) + result="dialog exit code $ec" + ret=-$E_GSU_DIALOG + esac +} + +# Open a dialog box which asks the user to input a text +# +# Usage: gsu_input_box +# +# is displayed above of the input field, which is is preset to . +# The entered text is returned in $result. On success (user pressed OK) +# the function returns zero. If the user selected Cancel, the return value is +# one. On dialog errors, a negative error code is returned. gsu_inputbox() { local g text="$1" init="$2" @@ -29,29 +52,45 @@ gsu_inputbox() _get_geometry g="$result" result="$(dialog --inputbox "$text" $g "$init" 3>&1 1>&2 2>&3 3>&-)" - ret="$?" + _set_dialog_ret $? } +# Show the given file in a text box +# +# Usage: gsu_textbox +# +# The box has an OK button which closes the box when activated. gsu_textbox() { - local file="$1" + local g file="$1" _get_geometry - dialog --textbox "$file" $result + g="$result" + + ret=-$E_GSU_DIALOG + result='textbox' + dialog --textbox "$file" $g + _set_dialog_ret $? } -# dialog segfaults if message is too long. Hence we always use a temporary file +# Show a message in a text box +# +# Usage: gsu_msgbox +# +# This is like gsu_textbox() but the text is passed as a string. gsu_msgbox() { - local tmp="$(mktemp gsu_msgbox.XXXXXXXXXX)" - - if (($? != 0)); then - dialog --msgbox "mktemp error" 0 0 - return - fi + local tmp + + # Some versions of dialog segfault if the text is too long. Hence we + # always use a temporary file. + gsu_make_tempfile 'gsu_msgbox.XXXXXXXXXX' + (($ret < 0)) && return + tmp="$result" + trap "rm -f $tmp" EXIT echo "$1" > "$tmp" gsu_textbox "$tmp" - rm -f "$tmp" + rm -f "$tmp" # ignore errors } _gsu_menu() @@ -67,7 +106,7 @@ _gsu_menu() opts+=" $i $num" done result="$(dialog --menu "$gsu_banner_txt ($header)" $opts 3>&1 1>&2 2>&3 3>&-)" - ret="$?" + _set_dialog_ret $? } _get_level() @@ -79,9 +118,11 @@ _get_level() _get_subtree() { local tree="$1" root="${2%/}" - local TAB=' ' + local first TAB=' ' - first="$(grep -n "$TAB\{1,\}$root/" <<< "$tree")" + ret=-$E_GSU_MENU_TREE + result="subtree grep failed" + first="$(grep -n "$TAB\{1,\}$root/" <<< "$tree")" || return [[ -z "$first" ]] && return line_num="${first%%:*}" @@ -92,7 +133,12 @@ _get_subtree() result="$(sed -e "1,${line_num}d;" <<< "$tree" \ | sed -e "/^$TAB\{1,$level\}$_gsu_node_name_pattern/,\$d" \ | sed -e "/^$TAB\{$(($level + 2))\}/d")" - ret="$level" + if (($? != 0)); then + ret=-$E_GSU_MENU_TREE + result="sed command for subtree $root failed" + return + fi + ret=$GSU_SUCCESS } _get_root_nodes() @@ -100,6 +146,12 @@ _get_root_nodes() local tree="$1" TAB=' ' result="$(grep "^${TAB}${_gsu_node_name_pattern}" <<< "$tree")" + if (($? != 0)); then + ret=-$E_GSU_MENU_TREE + result="root node grep failed" + return + fi + ret=$GSU_SUCCESS } _browse() @@ -109,13 +161,15 @@ _browse() while :; do _gsu_menu "$header" "$subtree" - (($ret != 0)) && return - [[ -z "$result" ]] && return + (($ret < 0)) && return + [[ -z "$result" ]] && return # menu was cancelled if [[ "${result%/}" != "$result" ]]; then old_header="$header" header="$result" _get_subtree "$tree" "$header" + (($ret < 0)) && return _browse "$header" "$tree" "$result" + (($ret < 0)) && return header="$old_header" continue fi