(****************************************************************************)
(*                                                                          *)
(*                           GSX Input Module                               *)
(*                           ================                               *)
(* This Module contains all GSX input functions. Input is available from    *)
(* CRT and (maybe) PLOTTER devices. Not all functions may be implemented.   *)
(*                                                                          *)
(* 16.5.1988          Wolfgang Muees, Hagenring 22, 3300 Braunschweig       *)
(*                                                                          *)
(****************************************************************************)

CONST
  Keyboard = 1; Mouse    = 2;                (* Predefined Input Locator Devices     *)
  locator  = 1; valuator = 2;                (* Constants for changing input modes   *)
  choice   = 3; strings  = 4;
  request  = 1; sample   = 2;                (* Available input modes                *)
  CursorX : INTEGER = 16384;                 (* Actual cursor ( locator ) position   *)
  CursorY : INTEGER = 16384;

VAR
  Value          : INTEGER;                  (* Actual valuator position             *)


FUNCTION Tablet : BOOLEAN;                   (* Returns TRUE if a graphic input, like a
                                                mouse, joystick, lightpen etc, is connected
                                                to this device. If Tablet is TRUE you can
                                                access the locator with Device = Mouse, else
                                                you have to use the Device Keyboard. *)
BEGIN
  simplESC ( 16 );
  Tablet := ( INTOUT[1] > 0 );
END;


PROCEDURE GetLocator ( Device : INTEGER;   (* Access Device, gets a coordinate and/or a *)
                       VAR C  : CHAR;      (* terminator, and report this action.       *)
                       VAR Moved, Terminated : BOOLEAN );
BEGIN
  INTIN[1]   := Device;
  PTSIN[1].X := CursorX;
  PTSIN[1].Y := CursorY;
  PTSOUT[1]  := PTSIN[1];                  (* ...if not moved at all *)
  WITH CB DO
    BEGIN
      IINLEN   := 1;
      PINLEN   := 1;
    END;
  simple ( 28 );
  CursorX    := PTSOUT[1].X;
  CursorY    := PTSOUT[1].Y;
  C          := CHAR ( INTOUT[1] );
  Moved      := CB.POUTLEN > 0;
  Terminated := CB.IOUTLEN > 0;
END;


PROCEDURE GetValuator ( VAR C : CHAR;      (* Simulates a variable resistor. May be used to *)
                        VAR Changed,       (* regulate analog functions like intensities.   *)
                            Terminated : BOOLEAN );
BEGIN
  INTIN[2]   := Value;
  INTOUT[1]  := Value;
  CB.IINLEN  := 2;
  simple ( 29 );
  Value      := INTOUT[1];
  C          := CHAR ( INTOUT[2] );
  Changed    := CB.IOUTLEN > 0;
  Terminated := CB.IOUTLEN = 2;
END;


PROCEDURE GetChoice ( Device : INTEGER;    (* Request function keys, get a key number or *)
                      VAR N  : INTEGER;    (* a nonchoice character.                     *)
                      VAR C  : CHAR;
                      VAR Choiced, Terminated : BOOLEAN );
BEGIN
  INTIN[1]   := Device;
  CB.IINLEN  := 1;
  simple ( 30 );
  N          := INTOUT[1];
  C             := CHAR ( INTOUT[2] );
  Choiced    := CB.IOUTLEN = 1;
  Terminated := CB.IOUTLEN = 2;
END;


PROCEDURE GetString ( Device : INTEGER;   (* Request input of string, echo string on screen *)
                      Echo   : BOOLEAN;   (* if desired.                                          *)
                      X,Y    : INTEGER;
                    VAR Text : Lstring;
                    VAR Done : BOOLEAN );
VAR i, m : INTEGER;
BEGIN
  INTIN[1]   := Device;
  INTIN[2]   := Length ( Text );
  INTIN[3]   := ORD ( Echo );
  PTSIN[1].X := X;
  PTSIN[1].Y := Y;
  WITH CB DO
    BEGIN
      IINLEN := 3;
      PINLEN := 1;
    END;
  simple ( 31 );
  m          := CB.IOUTLEN;
  Done       := m > 0;
  IF Done THEN
    FOR i := 1 TO m DO Text[i] := CHAR ( INTOUT[i] );
  Text[0] := CHAR ( m );
END;


PROCEDURE InputMode ( Device, Mode : INTEGER );    (* Sets Device to request or sample. *)
BEGIN
  INTIN[1]   := Device;
  INTIN[2]   := Mode;
  CB.IINLEN  := 2;
  simple ( 33 );
END;

