KEYB ; clear keyboard buffer ClrBuff W *-1 Q ; interpret a key-press ; TimeOut is optional ReadLKey(TimeOut) Q $$Cvt2List($$ReadKey($G(TimeOut))) ReadKey(TimeOut) N Rslt,Code S TimeOut=+$G(TimeOut) S Rslt="^^" ; clear result variable U 0:(:"FIS") I (TimeOut=0) R *Code E R *Code:TimeOut U 0:(:"-F") I (Code=-1) S Rslt="^^TIMEOUT" ; time out I (Code=27) S Rslt=$$PcsEscape E D .I (Code>32),(Code'=127) S Rslt=$C(Code)_"^"_Code_"^" .E D ..I (Code=8)!(Code=127) S Rslt="^8^BACKSPACE" ..I (Code=9) S Rslt="^9^TAB" ..I (Code=13) S Rslt="^13^RETURN" ..I (Code=32) S Rslt=" ^32^SPACE" .Q End U 0:(:"CRT") Q Rslt PcsEscape() N Rslt N Code2,Code3,Code4,Code5 S Rslt="^^ESCAPE" ; set default value R *Code2:0 ; read extra codes R *Code3:0 R *Code4:0 R *Code5:0 I (Code2=79) D ; 2e char is "O" .I (Code3=80) S Rslt="^^F1" .E I (Code3=81) S Rslt="^^F2" .E I (Code3=82) S Rslt="^^F3" .E I (Code3=83) S Rslt="^^F4" .Q I (Code2=91) D ; 2e char = "[" .I (Code3=65) S Rslt="^^UP_ARROW" .I (Code3=66) S Rslt="^^DOWN_ARROW" .I (Code3=67) S Rslt="^^RIGHT_ARROW" .I (Code3=68) S Rslt="^^LEFT_ARROW" .I (Code4=126) D ; 4e char = "~" ..I (Code3=49) S Rslt="^^HOME" ..E I (Code3=50) S Rslt="^^INSERT" ..E I (Code3=51) S Rslt="^^DELETE" ..E I (Code3=52) S Rslt="^^END" ..E I (Code3=53) S Rslt="^^PAGE_UP" ..E I (Code3=54) S Rslt="^^PAGE_DOWN" ..Q .I (Code5=126) D ..I (Code3=49),(Code4=54) S Rslt="^^F5" ..I (Code3=49),(Code4=55) S Rslt="^^F6" ..I (Code3=49),(Code4=56) S Rslt="^^F7" ..I (Code3=49),(Code4=57) S Rslt="^^F8" ..I (Code3=50),(Code4=48) S Rslt="^^F9" ..I (Code3=50),(Code4=49) S Rslt="^^F10" ..I (Code3=50),(Code4=51) S Rslt="^^F11" ..I (Code3=50),(Code4=52) S Rslt="^^F12" ..Q .Q Q Rslt Escape(Delay) N Code,Escaped U 0:(:"IS") R *Code:+$G(Delay) U 0:(:"CRT") S Escaped=0 I (Code=27) S Escaped=1 Q Escaped Cvt2List(Rslt) N ListFormat I $P(Rslt,"^",3)=94 S ListFormat=$lb("^","94","") E S ListFormat=$lb($P(Rslt,"^",1),$P(Rslt,"^",2),$P(Rslt,"^",3)) Q ListFormat