DEFINITION MODULE Keyboard;

	(************************************************)
	(*						*)
	(*	Module to deal with keyboard input.	*)
	(*						*)
	(*  Programmer:		P. Moylan		*)
	(*  Last edited:	8 February 1994		*)
	(*  Status:		OK			*)
	(*						*)
	(************************************************)

FROM Semaphores IMPORT
    (* type *)	Semaphore;

PROCEDURE KeyPressed(): BOOLEAN;

    (* Returns TRUE iff a character is available. *)

PROCEDURE InKey (): CHAR;

    (* Reads a single character code from the keyboard.	*)

PROCEDURE PutBack (ch: CHAR);

    (* This is an "un-read" operation, i.e. the character ch will	*)
    (* re-appear on the next call to InKey.  This facility is provided	*)
    (* for the use of software which can overshoot by one character	*)
    (* when reading its input - a situation which can often occur.	*)
    (* Some versions of this module will allow several calls to PutBack	*)
    (* before the next call to InKey, but no guarantee is made in that	*)
    (* case of uniform treatment from version to version.		*)

PROCEDURE StuffKeyboardBuffer (ch: CHAR);

    (* Stores ch as if it had come from the keyboard, so that a		*)
    (* subsequent InKey() will pick it up.				*)

    (* NOTE: Procedures PutBack and StuffKeyboardBuffer do almost the	*)
    (* same thing, but not quite.  The differences are:			*)
    (*  1. StuffKeyboardBuffer stores characters in a first-in-first-out*)
    (*     order, whereas PutBack uses last-in-first-out.		*)
    (*  2. StuffKeyboardBuffer is intended for the case of a task	*)
    (*     sending data to another task (where that other task is	*)
    (*     expecting keyboard input), and PutBack is designed for the	*)
    (*     case of a task talking to itself (i.e. the PutBack(ch) and	*)
    (*	   the InKey() are in the same task).  If you get this the	*)
    (*     wrong way around then you could have timing-related		*)
    (*     problems, up to and including deadlock.			*)

PROCEDURE SetLocks (code: CARDINAL);

    (* Set/clear the caps lock, num lock, and scroll lock conditions.	*)
    (* The code is defined in KBDRIVER.DEF.				*)

PROCEDURE LockStatus (): CARDINAL;

    (* Returns the current state of the caps lock, num lock, and scroll	*)
    (* lock conditions, using the code defined in KBDRIVER.DEF.		*)

PROCEDURE HotKey (FunctionKey: BOOLEAN;  code: CHAR;  S: Semaphore);

    (* After this procedure is called, typing the key combination for	*)
    (* 'code' will cause a Signal(S).  Set FunctionKey=TRUE to trap one	*)
    (* of the two-character special function keys, and FALSE otherwise.	*)
    (* The character is consumed; if it should be passed on, then the	*)
    (* user's hot key handler can do a PutBack().  Note: there is no	*)
    (* provision for having multiple hot key handlers for the same key;	*)
    (* any existing hot key mapping will be overridden.			*)

END Keyboard.
