Choice routine for REXX

[Autolink] Menu

 
/* sample choice routine with timeout                                 */

                        /* load REXXUTIL                              */
 call rxFuncAdd "SysLoadFuncs", "REXXUTIL", "SysLoadFuncs"
 call SysLoadFuncs

                        /* default key if no key is pressed           */
 thisDefault= "Y"
                        /* timeout value in seconds                   */
 thisTimeOut = 10

 call CharOut , "Waiting for a key "
 parse value GetKey( thisDefault, thisTimeOut, "." ) with ,
             thisRC "," pressedKey "," KeyPressed "," isFunctionKey

 if thisRC = 1 then
   if keyPressed = 1 then
     if isFunctionKey = 1 then
       say "Pressed the function key with the code " || C2D( pressedKey )
     else
       say "Pressed key is <" || pressedKey || ">"
   else
     say "No key pressed. Using the default."
 else
   say "Error while calling GetKey()!"
exit 0

/* ------------------------------------------------------------------ */
/* function: Get a key with timeout                                   */
/*                                                                    */
/* usage:    GetKey default , timeOut, inProgressInd                  */
/*                                                                    */
/* where:    default       - default key                              */
/*           timeOut       - timeOut in seconds                       */
/*           inProgressInd - if <> "" char for the in progress        */
/*                           indicator                                */
/*                                                                    */
/* returns:  thisRc, key, keypressed, functionKey                     */
/*                                                                    */
/* where:    thisRC      - 1 if okay, else error                      */
/*           key         - pressed key (or default)                   */
/*           keypressed  - 1 if a key was pressed else 0              */
/*           functionKey - 1 if a function key was pressed else 0     */
/*                                                                    */
/* note:     This function does not work as desired in OO REXX! v2.30 */
/*           The reason is the different behaviour of the       v2.30 */
/*           function CHARS() in OO REXX!                       v2.30 */
/*                                                                    */
/*           [Tested with OBJREXX 6.00 12 Jul 1996]                   */
/*           [Fixed in OBJREXX 6.00 26 Feb 1997 and newer versions]   */
/*                                                                    */
GetKey: PROCEDURE
  parse arg default, timeOut, inProgressInd

                            /* init the return code(s)                */
  thisRC = 0
  thisKey = default
  keyPressed = 0
  functionKey = 0

                            /* install a local error handler          */
  SIGNAL ON SYNTAX Name GetKeyEnd

  do timeCount = 0 to timeOut
    if InProgressInd <> "" then
      call CharOut , inProgressInd

    if chars() <> 0 then
    do
                            /* there is a key available               */
      thisKey = SysGetKey( "NOECHO" )
      if thisKey = "00"x | thisKey = "E0"x then
      do
                            /* function key pressed                   */
        thisKey = SysGetKey( "NOECHO" )
        functionKey = 1
      end /* if thisKey = "00"x | thisKey = "E0"x then */
      keypressed = 1
      leave
    end /* if chars() <> 0 then */
    else
    do
                            /* wait a second                          */
      call SysSleep 1
    end /* else */
  end /* do timeCount = 0 to timeOut */

                            /* set rc to execution is okay            */
  thisRC = 1

  if inProgressInd <> "" then
    say ""

GetKeyEnd:
RETURN thisRC || "," || thisKey || "," || keyPressed || "," || FunctionKey


[Back: Simple Yes/No question]
[Next: sprintf routine for REXX]