Article Listing 1 Listing 2 Listing 3 oct2004.tar

Listing 2 NewGetKey

#!/usr/bin/ksh
# Listing 2: NewGetKey

# this function returns a string identifying the keystroke as a
# special character.
special_char_str () {

if [[ -z "$1" ]]
then # undefined argument
   echo ""
elif [[ -z $(echo "$1"|tr -d '\020') ]]
then # control_p
   echo "CTRL_P"
elif [[ -z $(echo "$1"|tr -d '\033') ]]
then # ESC
   echo "ESC"
elif [[ -z $(echo "$1"|tr -d '\004') ]]
then # control_d
   echo "CTRL_D"
elif [[ -z $(echo "$1"|tr -d '\011') ]]
then # TAB key or control-i
   echo "TAB"
elif [[ -z $(echo "$1"|tr -d '\177') ]]
then # DEL key 
   echo "DEL"
else
   echo $1
fi
}

# NewGetKey - this function demonstrates using cursor keys in ksh 
# scripts. Return a string identifying the key stroke as a special character
# or just return the key.
# Original by Heiner Steven (heiner.steven@odn.de)
# modified by Ed Schaefer and John Spurgeon to add function keys
# and control characters.

NewGetKey () {
   typeset readchar
   typeset xchar
   typeset second
   typeset xsecond
   typeset third
   typeset oldstty="$(stty -g)"

   stty -icanon -echo min 1 time 0 -isig
   readchar=$(dd bs=1 count=1 2>/dev/null)
   xchar=$(special_char_str "$readchar")

   case "$xchar" in
        CTRL_P|CTRL_D|TAB|DEL) readchar=$xchar;;
        ESC) # ecape sequence.  Read second char.
            second=$(dd bs=1 count=1 2>/dev/null)
            xsecond=$(special_char_str $second)
            case "$xsecond" in
                '[')
                    third=$(dd bs=1 count=1 2>/dev/null)
                    case "$third" in
                        'A')    readchar=CURS_UP;;
                        'B')    readchar=CURS_DOWN;;
                        'C')    readchar=CURS_RIGHT;;
                        'D')    readchar=CURS_LEFT;;
                          *)    readchar="$readchar$second$third";;
                    esac;;
                'O')  # O for function keys
                    third=`dd bs=1 count=1 2>/dev/null`
                    case "$third" in
                        'P')    readchar=F1_KEY;;
                        'Q')    readchar=F2_KEY;;
                        'R')    readchar=F3_KEY;;
                        'S')    readchar=F4_KEY;;
                        *)      readchar="$readchar$second$third";;
                    esac;;

                *)              # No escape sequence
                    readchar="$readchar$second";;
            esac ;;
   esac
   stty $oldstty # restore original terminal settings
   echo "$readchar"
}

echo 'Type any key (control-d to end)' >&2
while :
do
    Key=$(NewGetKey)
    case "$Key" in
           CTRL_P)      echo "control-p";;
           CTRL_D)      echo "control-d"; exit 0;;
              TAB)      echo "TAB key";;
          CURS_UP)      echo "up arrow";;
        CURS_DOWN)      echo "down arrow";;
       CURS_RIGHT)      echo "right arrow";;
        CURS_LEFT)      echo "left arrow";;
           F1_KEY)      echo "F1 key";;
           F2_KEY)      echo "F2 key";;
           F3_KEY)      echo "F3 key";;
           F4_KEY)      echo "F4 key";;
              DEL)      echo "DEL key";;
                *)      echo "Key=$Key" ;;
    esac
done