[comp.lang.c] how do I trap a single keystroke in VMS C?

andersen@vaxr.llnl.gov (07/25/90)

Does anybody have code written to trap a single keystroke in VMS C?  I know I
need to use a QIO, and with enough dinking I could figure it out, but if I
can steal somebody elses solution I'd much rather.  I need my code to respond
to a keystroke without having to also hit RETURN.  (In OS-9 C, a 
read( 0, &ch, 1) does the trick, but not in VMS.)

-- Roger Andersen
	LLNL

rankin@eql.caltech.edu (07/26/90)

In article <1990Jul25.085526.1@vaxr.llnl.gov>, andersen@vaxr.llnl.gov writes:
> Does anybody have code written to trap a single keystroke in VMS C?  I know I
> need to use a QIO, and with enough dinking I could figure it out, but if I
> can steal somebody elses solution I'd much rather.  I need my code to respond
> to a keystroke without having to also hit RETURN.  (In OS-9 C, a 
> read( 0, &ch, 1) does the trick, but not in VMS.)

     This isn't really a C question; you'd get more of a response from
comp.os.vms.  $QIO is not difficult to use, but if you want to take the
simplest route, use SMG$READ_KEYSTROKE.  It handles the $QIO details and
also performs multi-byte escape sequence recognition (into an unsigned
short) for arrow and function keys.

#include <smgdef.h>	/* extended key codes */
 unsigned long kb, sts;
 unsigned short keycode;

 (void)SMG$CREATE_VIRTUAL_KEYBOARD(&kd);
 sts = SMG$READ_KEYSTROKE(&kd, &keycode);

Normal keys result in that key's ascii value being placed into 'keycode'.
Some control keys trigger out-of-band actions.  You'll need to either
use $QIO directly or place the terminal in VMS's equivalent of "raw" mode
if you want full control of those.

		Pat Rankin, rankin@eql.caltech.edu