#!/bin/bash if [ "$TERM" != "xterm" ]; then echo "not tested on '${TERM}' mode" fi KEYINDEX=0 KEY="" # "name" codenum code0 code1 code2 code3 code4 reserved declare -r _ELMS_=8 oldifs=$IFS IFS= KEY_ENTER=( "ENTER" 1 $'\012' "-" "-" "-" "-" 0 ) #FIXME KEY_SPC=( "SPACE" 1 $'\040' "-" "-" "-" "-" 0 ) KEY_TAB=( "TAB" 1 $'\011' "-" "-" "-" "-" 0 ) _SEQ_O=( $'\E' "O" ) _SEQ_P=( $'\E' "[" ) KEY_HOME=( "HOME" 3 ${_SEQ_O[*]} "H" "-" "-" 0 ) KEY_END=( "END" 3 ${_SEQ_O[*]} "F" "-" "-" 0 ) KEY_UP=( "UP" 3 ${_SEQ_P[*]} "A" "-" "-" 0 ) KEY_DOWN=( "DOWN" 3 ${_SEQ_P[*]} "B" "-" "-" 0 ) KEY_RIGHT=("RIGHT" 3 ${_SEQ_P[*]} "C" "-" "-" 0 ) KEY_LEFT=( "LEFT" 3 ${_SEQ_P[*]} "D" "-" "-" 0 ) KEY_KHOME=("KP_HOME" 4 ${_SEQ_P[*]} "1" "~" "-" 0 ) # keypad HOME KEY_INS=( "INSERT" 4 ${_SEQ_P[*]} "2" "~" "-" 0 ) KEY_DEL=( "DELETE" 4 ${_SEQ_P[*]} "3" "~" "-" 0 ) KEY_KEND=( "KP_END" 4 ${_SEQ_P[*]} "4" "~" "-" 0 ) # keypad END KEY_PGUP=( "PGUP" 4 ${_SEQ_P[*]} "5" "~" "-" 0 ) KEY_PGDN=( "PGDN" 4 ${_SEQ_P[*]} "6" "~" "-" 0 ) KEY_CENTER=("CENTER" 3 ${_SEQ_P[*]} "E" "-" "-" 0 ) # keypad CENTER KEY_FUNC7=( "FUNC7" 5 ${_SEQ_P[*]} "1" "8" "~" 0 ) KEY_FUNC8=( "FUNC8" 5 ${_SEQ_P[*]} "1" "9" "~" 0 ) KEYS=( ${KEY_ENTER[*]} ${KEY_SPC[*]} ${KEY_TAB[*]} ${KEY_HOME[*]} ${KEY_END[*]} ${KEY_UP[*]} ${KEY_DOWN[*]} ${KEY_RIGHT[*]} ${KEY_LEFT[*]} ${KEY_KHOME[*]} ${KEY_INS[*]} ${KEY_DEL[*]} ${KEY_KEND[*]} ${KEY_PGUP[*]} ${KEY_PGDN[*]} ${KEY_CENTER[*]} ${KEY_FUNC7[*]} ${KEY_FUNC8[*]} ) NR_KEYS=$(expr ${#KEYS[*]} / $_ELMS_) IFS=$oldifs function __check_key_one() { local ret=0 local _i=0 local _index=0 [ $KEYINDEX -eq 1 ] && read -s -n 1 || read -s -t 1 -n 1 if [ $? -ne 0 ]; then return 1 fi if [ "$REPLY" == "" ]; then KEY="ENTER" return 1 fi while ((_i < NR_KEYS)) do ((_index = _i * _ELMS_)) ((_i++)) ((_index_codenum = _index + 1)) ((_index_count = _index + 7)) [ $KEYINDEX -eq 1 ] && let "KEYS[$_index_count] = 0" ((_index_code = _index + 2 + $KEYINDEX - 1)) [ $KEYINDEX -gt ${KEYS[$_index_codenum]} ] && continue [ $REPLY != ${KEYS[$_index_code]} ] && continue let "KEYS[$_index_count] = ${KEYS[$_index_count]} + 1" if [ ${KEYS[$_index_count]} -eq ${KEYS[$_index_codenum]} ]; then KEY="${KEYS[$_index]}" return 1 fi done return 0 } function check_key() { KEYINDEX=1 oldifs=$IFS IFS= __check_key_one while [ $? == 0 ]; do ((KEYINDEX++)) __check_key_one done IFS=$oldifs } KEY="" check_key : ${KEY:="unknown"} echo "$KEY"