Article Listing 1 Listing 2 Listing 3 oct2004.tar

Listing 1 GetKey

#!/usr/bin/ksh
# Listing 1: GetKey - 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.
GetKey () {
   typeset readchar
   typeset second
   typeset third
   typeset oldstty="$(stty -g)" # save original terminal settings

   stty -icanon -echo min 1 time 0 -isig
   readchar=$(dd bs=1 count=1 2>/dev/null)
   case "$readchar" in
        '^?') readchar=DEL;;   # ACTUAL CONTROL KEY
        '^D') readchar=CTRL_D;; # ACTUAL CONTROL KEY
        '^p') readchar=CTRL_P;; # ACTUAL CONTROL KEY
         '    ') readchar=TAB;; # ACTUAL CONTROL KEY
        '^') # ecape sequence? Read second char.
            second=$(dd bs=1 count=1 2>/dev/null)
            case "$second" in
                '[')   # 2nd Character '[' : arrow keys
                    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')   # 2nd character 'O' : 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 settings
   echo "$readchar"
}

echo 'Type any key (control-d to end)' 
while :
do
    Key=$(GetKey)
    case "$Key" in
         CTRL_P)        echo "control-p";;
         CTRL_D)        echo "control-d"; exit 0;; 
            TAB)        echo "TAB key";;
        CURS_UP)        echo "up arrow key";;
      CURS_DOWN)        echo "down arrow key";;
     CURS_RIGHT)        echo "right arrow key";;
      CURS_LEFT)        echo "left arrow key";;
         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