DEFINITION MODULE InputDevice;

(* Revision 1.1                                                         *)
(* Das Modul InputDevice enthält verschiedene Routinen um den Umgang    *)
(* mit dem Eingabesystem des Computers zu erleichtern. Es besteht die   *)
(* Möglichkeit eigene InputHandler zu starten, eigene InputEvents zu    *)
(* starten und voreingestellte Werte des Eingabesystems zu verändern    *)
(* Die Files InputDevice.obj und InputDevice.sym sind Copyright-frei.   *)
(* Sie dürfen auch in kommerziellen Produkten benutzt werden. Diese     *)
(* Files dürfen allerdings nur mit den Sourcecodes und dem Demo         *)
(* weitergegeben werden. Jeder Art Änderungen am Sourcecode oder am     *)
(* Definitionsfile ohne meine ausdrückliche Genehmigung sind verboten.  *)
(* Das Definitionsfile und der Sourcecode, sowie Teile daraus, sind     *)
(* Copyrightgeschützt!                                                  *)
(*                      © 1992 by Andre Wiethoff                        *)
(*                                                                      *)
(* Bei Verbesserungsvorschlägen, Fehlern oder bei Fragen:               *)
(* Andre Wiethoff                                                       *)
(* Höhenweg 2                                                           *)
(* D-57392 Schmallenberg / Germany                                      *)


FROM InputEvent IMPORT InputEvent,InputEventPtr;
FROM Timer      IMPORT TimeVal;
FROM GamePort   IMPORT KeySet,Controller;


(* Die Flags in 'InputCommands' geben Kommandos wieder, die mittels     *)
(* 'InputCommand' an das InputDevice gesendet werden können.            *)
(* 'ResetDevice'   : Setzt das InputDevice auf voreingestellte Werte    *)
(*                   zurück. Ein InputHandler wird nicht gelöscht!      *)
(* 'ClearBuffer'   : Löscht alle InputEvents aus dem Buffer             *)
(* 'StopDevice'    : Das InputDevice wird gestoppt                      *)
(* 'RestartDevice' : Das InputDevice wird nach 'StopDevice' wieder      *)
(*                   gestartet                                          *)

TYPE InputCommands   = (ResetDevice, ClearBuffer, StopDevice, RestartDevice);



(* 'KeyboardOptions' werden im Befehl 'SetKeyboard' benötigt. Diese     *)
(* Flags geben an, was mit diesem Befehl verändert werden soll.         *)
(* 'Period'     : Legt die Tastenwiederholungsgeschwindigkeit fest      *)
(* 'Threshhold' : Legt die Warte-Schwelle vor der Tastenwiederholung    *)
(*                fest                                                  *)

TYPE KeyboardOptions = (Period, Threshhold);



(* 'inputEvent' wird in eigenen InputHandlern benutzt um den aktuellen  *)
(* InputEvent zu bekommen. Darin wird auch der geänderte InputEvent     *)
(* nach Gebrauch gesichert.                                             *)

VAR  inputEvent      : InputEventPtr;



(* 'OpenInput' öffnet das InputDevice für den Benutzer. Es braucht nur  *)
(* einmal geöffnet werden, darum gibt es auf keinen Zeiger auf eine     *)
(* charakteristische Struktur zurück. Damit die folgenden Befehle       *)
(* muß dieser Befehl einmal angewandt werden. Bei einem erfolgreichen   *)
(* Versuch wird TRUE zurückgegeben.                                     *)

PROCEDURE OpenInput() : BOOLEAN;



(* 'SetInputHandler' bestimmt eine eigene M2 Routine zu einem Input-    *)
(* Handler. Diese kann die 'inputEvent' Variable benutzen um Eingriffe  *)
(* in das Informationssystem vorzunehmen. Wenn schon ein anderer        *)
(* InputHandler aktiviert war, wird dieser gelöscht und der neue        *)
(* gesetzt. 'pri' gibt die Priorität des Handlers an,welche von -128    *)
(* bis 127 reichen kann. Der normale InputHandler des Betriebssystem    *)
(* verfügt eine Priorität von 50. Wenn also die eigene Routine die      *)
(* Daten vorher abfangen will, muß sie eine Priorität höher als 50      *)
(* besitzen.                                                            *)

PROCEDURE SetInputHandler(handler : PROC;
                          pri     : SHORTINT);



(* 'RemoveInputHandler' entfernt einen mit 'SetInputHandler' gesetzten  *)
(* InputHandler aus dem System.                                         *)

PROCEDURE RemoveInputHandler;



(* 'AddInputEvent' fügt ein InputEvent in die Kette der im Buffer       *)
(* befindlichen InputEvents ein. Dieser wird ausgeführt wenn ein        *)
(* InputHandler alle vorhergehenden im Buffer ausgelesen hat. So kann   *)
(* z.B. der Mauszeiger ohne äußere Einwirkungen einfachst über den      *)
(* Bildschirm bewegt werden.                                            *)

PROCEDURE AddInputEvent(event : InputEvent);



(* 'InputCommand' übergibt einen einfachen Befehl an das InputDevice.   *)
(* Die möglichen Befehle wurden in 'InputCommands' definiert.           *)

PROCEDURE InputCommand(com : InputCommands);



(* 'SetKeyboard' setzt spezielle Daten im Umgang mit der Tastatur. So   *)
(* können die Tastenwiederholgeschwindigkeit, sowie die Warte-Schwelle  *)
(* bis zum Wiederholen angegeben werden. Die Zeit die dazwischen        *)
(* jeweils vergeht, wird in 'time' angegeben. 'com' entspricht einer    *)
(* 'KeyboardOptions' die im Konstantenteil definiert sind, und die      *)
(* Wahl zwischen 'Period' und 'Threshhold' zulassen.                    *)

PROCEDURE SetKeyboard(com  : KeyboardOptions;
                      time : TimeVal);



(* 'SetMouseTrigger' setzt die Mausbewegungsgeschwindigkeit durch das   *)
(* InputDevice. 'keys' stammt aus dem Modul GamePort und bestimmt ob    *)
(* auf das Drücken oder das Loslassen der Maustasten reagiert werden    *)
(* soll. 'timeout' gibt an, nach wie vielen Vertical Blank Interrupts   *)
(* ein InputEvent für die Maus losgeschickt werden soll, falls sie      *)
(* nicht in ausreichendem Maße bewegt worden ist. Im System ist hier    *)
(* eine 1 voreingestellt. 'xDelta' und 'yDelta' geben an wieviele       *)
(* Impulse von der Maus benötigt werden, um den Zeiger um einen Pixel   *)
(* in die jeweilige Richtung zu bewegen.                                *)

PROCEDURE SetMouseTrigger(keys          : KeySet;
                          timeout       : CARDINAL;
                          xDelta,yDelta : CARDINAL);



(* 'SetMousePort' setzt nun den Port in welchem die Maus eingesteckt    *)
(* ist. Hier muß eine 1 für den Standardmouseport angegeben werden und  *)
(* eine 2 für den Port, der normalerweise mit dem Joystick belegt ist.  *)

PROCEDURE SetMousePort(port : SHORTCARD);



(* 'SetControllerType' kann eine andere Bewegungsmöglichkeit als die    *)
(* Maus für den Mauspfeil einsetzen. Hierzu bietet 'Controller' aus dem *)
(* Modul GamePort die Geräte Maus, relativer Joystick, absoluter        *)
(* Joystick und kein Controller an.                                     *)

PROCEDURE SetControllerType(type : Controller);



(* 'CloseInput' schließt das InputDevice und entfernt vorher noch       *)
(* aktive InputHandler. Am Programmende wird, falls noch nicht          *)
(* geschehen, automatisch das Device geschlossen.                       *)

PROCEDURE CloseInput;


END InputDevice.
