home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 09_10 / oop / moukey.pas next >
Encoding:
Pascal/Delphi Source File  |  1991-06-12  |  20.3 KB  |  571 lines

  1. (* ----------------------------------------------------- *)
  2. (*                      MOUKEY.PAS                       *)
  3. (* Datenobjekte:                                         *)
  4. (*  ■ EventObj: Beschreibt ein beliebiges Event.         *)
  5. (*  ■ EventQueue: Verwaltet einen Array von "EventObj"'s *)
  6. (*    nach dem Überlaufprinzip: Wenn der Array voll ist, *)
  7. (*    wird wieder vorne angefangen zu überschreiben.     *)
  8. (*  ■ HandlerObj: Enthält Zeiger auf Handler-Prozedur.   *)
  9. (*                                                       *)
  10. (* ■ EventHandlerObj: Verwaltet alle hereinkommenden Er- *)
  11. (*   eignisse. Die Unit stellt die einzige Instanze      *)
  12. (*   dieses Objekts zur Verfügung; Init und Done sollten *)
  13. (*   nicht aufgerufen werden, es sei den beim Aufruf von *)
  14. (*   ReInstall (siehe Demo). "TakeOut" sollte FALSE sein,*)
  15. (*   wenn Turbo's Eingabeprozeduren benutzt werden, und  *)
  16. (*   TRUE, wenn Ereignisse mit "EvHand" bearbeitet werden*)
  17. (*                                                       *)
  18. (*           (c) 1991 by R.Reichert & toolbox            *)
  19. (* ----------------------------------------------------- *)
  20. UNIT MouKey;
  21.  
  22. INTERFACE
  23.  
  24. USES Dos, UBase, UMouse;
  25.  
  26. CONST
  27.   MaxEvents = 100;                { max. Anzahl Events           }
  28.   EvNoEv = 0;                     { kein Event liegt vor         }
  29.   EvMouMove = 1;                  { Maus wurde bewegt            }
  30.   EvLeftPress = 2;                { linke MausTaste gedrückt     }
  31.   EvLeftRel = 4;                  { linke MausTaste losgelassen  }
  32.   EvRightPress = 8;               { rechte Taste gedrückt        }
  33.   EvRightRel = 16;                { rechte Taste losgelasssen    }
  34.   EvKeyPressed = 256;             { "normale" Taste gedrückt     }
  35.   EvKeyUnknown = 512;             { unbekannt Taste gedrückt     }
  36.   EvKeyState = 1024;              { Statustaste betätigt         }
  37.   EvMouAll = 31;                  { alle Mausereignisse          }
  38.   EvKeyAll = 1792;                { alle Tastaturereignisse      }
  39.   EvAll = 1823;                   { alle Ereignisse              }
  40.  
  41.   IndexArray : ARRAY[1..9] OF WORD =
  42.   (0, 1, 2, 4, 8, 16, 256, 512, 1024);
  43.  
  44.   RightShift = 1;                 { Bitwerte von den einzelnen   }
  45.   LeftShift = 2;                  { Statustasten zur Abfrage auf }
  46.   Ctrl = 4;                       { deren Zustand                }
  47.   Alt = 8;
  48.   ScrollLock = 16;
  49.   NumLock = 32;
  50.   CapsLock = 64;
  51.   INSERT = 128;
  52.  
  53. TYPE
  54.   EventObj = OBJECT
  55.                Time : LONGINT;    { Zeitpunkt des Events }
  56.                EventType : WORD;  { Art des Events       }
  57.                { mit den dazugehörigen Daten: }
  58.                x, y,
  59.                Buttons : INTEGER; { für EvMouAll         }
  60.                Key : WORD;        { für EvKeyPressed     }
  61.                ScanCode,
  62.                State : BYTE;      { für EvKeyUnknown     }
  63.                StateKey : BYTE;   { für EvKeyState       }
  64.              END;
  65.   EventObjArray = ARRAY[1..MaxEvents] OF EventObj;
  66.  
  67.   EventQueuePtr = ^EventQueue;
  68.   EventQueue = OBJECT
  69.                  NextToCall,      { nächst aufzurufendes Event }
  70.                  CameLastIn : INTEGER; { letzt eingetroffenes Event }
  71.                  Queue : EventObjArray; { die Events                 }
  72.                END;
  73.   { der Typ einer EventHandler-Prozedur: }
  74.   HandlerProc = PROCEDURE(VAR Event : EventObj);
  75.   HandlerObj = OBJECT
  76.                  Installed : BOOLEAN; { Prozedur aufrufen ? }
  77.                  Handler : HandlerProc; { Adresse der HandlerProz }
  78.                END;
  79.   HandlerArray = ARRAY[1..16] OF HandlerObj;
  80.  
  81.   EventHandlerObjPtr = ^EventHandlerObj;
  82.   EventHandlerObj = OBJECT(Base)
  83.  
  84.                       MouQueue : EventQueuePtr; { Warteschlange der Maus- }
  85.                       KeyQueue : EventQueuePtr; { und Tastaturevents      }
  86.                       TakeOut,    { aus Tastaturpuffer entfernen ? }
  87.                       TextModus : BOOLEAN; { im Textmodus ? }
  88.                       AktState,   { Tastaturstatus }
  89.                       AktMouX,    { akt. Mausposition }
  90.                       AktMouY : BYTE;
  91.                       HandlerTable : HandlerArray; { Tab. mit Handlern }
  92.  
  93.                       CONSTRUCTOR Init;
  94.                       PROCEDURE KeybHandler(Key : BYTE); VIRTUAL;
  95.                       PROCEDURE MouseHandler; VIRTUAL;
  96.                       PROCEDURE PutEvInQueue
  97.                       (Queue : EventQueuePtr; Event : EventObj); VIRTUAL;
  98.                       PROCEDURE GetEvFromQueue
  99.                       (VAR Queue : EventQueuePtr;
  100.                        VAR Event : EventObj); VIRTUAL;
  101.                       PROCEDURE PeekEvFromQueue
  102.                       (VAR Queue : EventQueuePtr;
  103.                        VAR Event : EventObj); VIRTUAL;
  104.                       PROCEDURE PeekEvent
  105.                       (VAR Event : EventObj); VIRTUAL;
  106.                       PROCEDURE GetEvent
  107.                       (VAR Event : EventObj); VIRTUAL;
  108.                       PROCEDURE WaitForEvent
  109.                       (WaitForEv : INTEGER;
  110.                        VAR Event : EventObj); VIRTUAL;
  111.                       PROCEDURE RegisterHandler
  112.                       (Event : WORD; NewHandler : HandlerProc); VIRTUAL;
  113.                       PROCEDURE DeRegisterHandler(Event : WORD); VIRTUAL;
  114.                       PROCEDURE SetTakeOut(T : BOOLEAN); VIRTUAL;
  115.  
  116.                       FUNCTION GetEvIndex(EventType : WORD) : BYTE; VIRTUAL;
  117.                       FUNCTION GetTakeOut : BOOLEAN; VIRTUAL;
  118.                       FUNCTION KeyState : BYTE; VIRTUAL;
  119.                       FUNCTION MouPressed(Ev : EventObj) : BOOLEAN; VIRTUAL;
  120.                       FUNCTION MouReleased(Ev : EventObj) : BOOLEAN; VIRTUAL;
  121.                       DESTRUCTOR Done; VIRTUAL;
  122.                     END;
  123.  
  124. PROCEDURE DeInstall;
  125.   (* Löst Eventhandler "EvHand" und "Mouse" auf. Danach  *)
  126.   (* EvHand und Mouse nicht mehr benutzen !              *)
  127.  
  128. PROCEDURE DeInstallMouse;
  129. PROCEDURE ReInstallMouse(NewMouse : MouseObjPtr);
  130.  
  131. PROCEDURE ReInstall(NewHandler : EventHandlerObjPtr);
  132.   (* Installiert neuen Eventhandler.                     *)
  133.   (* Zweck dieser vier Prozeduren ist, dass sie, kom-    *)
  134.   (* biniert angewendet, es ermöglichen, einen Nachkommen*)
  135.   (* von EventHandlerObj und/oder MouseObj zu benutzen.  *)
  136.   (* Sie sollten in der hier aufgeführten Reihenfolge    *)
  137.   (* aufgerufen werden ! (siehe auch Demo)               *)
  138.  
  139.  
  140. VAR                               { öffentlich: Ein Maus- und ein EventHandlerObj }
  141.   Mouse : MouseObjPtr;            { ACHTUNG: Kon- bzw Destruktor }
  142.   EvHand : EventHandlerObjPtr;    { NICHT aufrufen !     }
  143.  
  144. IMPLEMENTATION
  145.  
  146. {$L MouKeyAs}
  147.  
  148. {$F+} PROCEDURE NewMouHandler; EXTERNAL; {$F-}
  149.   { wird vom Mausinterrupt aufgerufen }
  150.  
  151.   {SF+} PROCEDURE NewKeybHandler; EXTERNAL; {$F-}
  152.   { ersetzt Interupt 09hex }
  153.  
  154.  
  155. VAR
  156.   KeybState : BYTE ABSOLUTE $40 : $17; { Tastaturstatus }
  157.   BiosTime : LONGINT ABSOLUTE $40 : $6C; { Zeit in Ticks  }
  158.   OldInt09,                       { zum Sichern der alten Adresse }
  159.   OldExitProc : POINTER;          { dito }
  160.   NewFlags,                       { Die New... werden gesetzt, sobald ein }
  161.   NewButtons,                     { Mausereignis eintrifft. Nicht als Pa- }
  162.   NewX,                           { rameter, da dabei die Gefahr eines    }
  163.   NewY : INTEGER;                 { "Stack Overflow" besteht.             }
  164.   Installed : BOOLEAN;            { "EvHand" installiert ? }
  165.  
  166.   (* ----------------------------------------------------- *)
  167.   (* Initialisiert EventHandlerObj. ACHTUNG: Nur in Ver-   *)
  168.   (* bindung mit ReInstall aufrufen !                      *)
  169.   (* ----------------------------------------------------- *)
  170.   CONSTRUCTOR EventHandlerObj.Init;
  171.   VAR Regs : Registers;
  172.     i : BYTE;
  173.   BEGIN
  174.     NEW(MouQueue);                { anlegen der "Ereignisschlangen" }
  175.     NEW(KeyQueue);
  176.     IF (MouQueue = NIL) OR
  177.     (KeyQueue = NIL) THEN FAIL;   { auch kein Fehler ? }
  178.     WITH MouQueue^ DO BEGIN
  179.       NextToCall := 1; CameLastIn := 1;
  180.     END;
  181.     WITH KeyQueue^ DO BEGIN
  182.       NextToCall := 1; CameLastIn := 1;
  183.     END;
  184.     TextModus := TRUE;
  185.     TakeOut := FALSE;
  186.     AktState := KeybState;        { Tastaturstatus festhalten }
  187.     FOR i := 1 TO 16 DO           { kein Handler installiert }
  188.       HandlerTable[i].Installed := FALSE;
  189.     IF Mouse^.Avail THEN BEGIN
  190.       AktMouX := Mouse^.GetX;
  191.       AktMouY := Mouse^.GetY;
  192.       Regs.AX := $C;              { Funktion Handler installieren }
  193.       Regs.CX := EvMouAll;        { für jegl. Mausereignisse }
  194.       Regs.DX := OFS(NewMouHandler);
  195.       Regs.ES := SEG(NewMouHandler);
  196.       Intr($33, Regs);
  197.     END;
  198.   END;
  199.  
  200.   PROCEDURE EventHandlerObj.KeybHandler(Key : BYTE);
  201.   VAR
  202.     Event : EventObj;
  203.     Regs : Registers;
  204.     Quit : BOOLEAN;
  205.     NewKbState : BYTE;
  206.   BEGIN
  207.     Quit := TRUE;
  208.     REPEAT
  209.       Event.Time := BiosTime;     { Zeitpunkt des Eintreffens }
  210.       Regs.AH := $11;             { liegt Tastendruck vor ? }
  211.       Intr($16, Regs);
  212.       IF (Regs.Flags AND FZero = 0) THEN BEGIN { ja ... }
  213.         IF TakeOut THEN BEGIN
  214.           Regs.AH := $10;
  215.           Intr($16, Regs);
  216.         END ELSE BEGIN
  217.           Regs.AH := $11;
  218.           Intr($16, Regs);
  219.         END;
  220.         IF (Regs.AL = 0) OR
  221.         (Regs.AL = 224) THEN
  222.           Event.Key := Regs.AH+256
  223.         ELSE
  224.           Event.Key := Regs.AL;
  225.         Event.EventType := EvKeyPressed;
  226.         PutEvInQueue(KeyQueue, Event);
  227.       END ELSE BEGIN              { nein, nichts im Tastaturpuffer }
  228.         NewKbState := KeybState;  { Neuer Status }
  229.         IF (AktState <> NewKbState) THEN BEGIN
  230.           IF (AktState < NewKbState) THEN BEGIN
  231.             Event.StateKey := AktState XOR NewKbState;
  232.             IF (Event.StateKey <> INSERT) THEN BEGIN
  233.               Event.EventType := EvKeyState;
  234.               PutEvInQueue(KeyQueue, Event);
  235.             END;
  236.           END;
  237.         END ELSE BEGIN            { keine Statustaste gedrückt }
  238.           IF (Key < 128) THEN BEGIN { Make-Code ? }
  239.             Event.EventType := EvKeyUnknown;
  240.             Event.ScanCode := Key;
  241.             Event.State := NewKbState;
  242.             PutEvInQueue(KeyQueue, Event);
  243.           END;
  244.         END;
  245.         AktState := NewKbState    { neuen Status behalten }
  246.       END;
  247.  
  248.       IF (TakeOut) AND
  249.       (Event.EventType <> EvKeyState) THEN
  250.         Quit := (MEM[$40:$1A] = MEM[$40:$1C]);
  251.  
  252.     { Diese Abfrage dient dazu, sicherzustellen, dass
  253.       alle Tastendrücke (bei zu langer Betätigung mit er-
  254.       höhter Wiederholfrequenz) abgearbeitet werden.      }
  255.  
  256.     UNTIL Quit;
  257.   END;
  258.  
  259.   PROCEDURE EventHandlerObj.MouseHandler;
  260.   VAR
  261.     Event : EventObj;
  262.     i, Mask : INTEGER;
  263.   BEGIN
  264.     WITH Event DO BEGIN
  265.       Time := BiosTime;
  266.       IF TextModus THEN BEGIN
  267.         x := SUCC(NewX SHR 3); y := SUCC(NewY SHR 3);
  268.       END ELSE BEGIN
  269.         x := NewX; y := NewY;
  270.       END;
  271.       Buttons := NewButtons;
  272.     END;
  273.     Mask := 1;
  274.     FOR i := 0 TO 5 DO BEGIN
  275.       IF NOT((NewFlags AND Mask = 0) OR
  276.              ((Mask = EvMouMove) AND
  277.               ((Event.x = AktMouX) AND
  278.                (Event.y = AktMouY)))) THEN BEGIN
  279.         Event.EventType := Mask;
  280.         PutEvInQueue(MouQueue, Event); { in Queue }
  281.       END;
  282.       Mask := Mask SHL 1;
  283.     END;
  284.     AktMouX := Event.x; AktMouY := Event.y;
  285.   END;
  286.  
  287.   PROCEDURE EventHandlerObj.PutEvInQueue
  288.     (Queue : EventQueuePtr;
  289.      Event : EventObj);
  290.   BEGIN
  291.     WITH Queue^ DO BEGIN
  292.       Queue[CameLastIn] := Event;
  293.       INC(CameLastIn);
  294.       IF CameLastIn > MaxEvents THEN
  295.         CameLastIn := 1;
  296.     END;
  297.   END;
  298.  
  299.   PROCEDURE EventHandlerObj.GetEvFromQueue
  300.     (VAR Queue : EventQueuePtr;
  301.      VAR Event : EventObj);
  302.   BEGIN
  303.     WITH Queue^ DO
  304.       IF NextToCall = CameLastIn THEN BEGIN
  305.         { noch kein Event, dann }
  306.         Event.Time := MAXLONGINT; { ungültige Zeit }
  307.         Event.EventType := EvNoEv { und kein Event zurück }
  308.       END ELSE BEGIN
  309.         Event := Queue[NextToCall];
  310.         IF (NextToCall = MaxEvents) THEN
  311.           NextToCall := 1
  312.         ELSE
  313.           INC(NextToCall);
  314.       END;
  315.   END;
  316.  
  317.   PROCEDURE EventHandlerObj.PeekEvFromQueue
  318.     (VAR Queue : EventQueuePtr;
  319.      VAR Event : EventObj);
  320.   BEGIN
  321.     WITH Queue^ DO
  322.       IF NextToCall = CameLastIn THEN BEGIN
  323.         Event.Time := MAXLONGINT;
  324.         Event.EventType := EvNoEv;
  325.       END ELSE
  326.         Event := Queue[NextToCall];
  327.   END;
  328.  
  329.   (* ----------------------------------------------------- *)
  330.   (* Gibt nächstes aufzurufendes Event zurück und entfernt *)
  331.   (* es aus der entsprechenden Queue.                      *)
  332.   (* ----------------------------------------------------- *)
  333.   PROCEDURE EventHandlerObj.GetEvent(VAR Event : EventObj);
  334.   VAR MouEvent, KeyEvent : EventObj;
  335.   BEGIN
  336.     REPEAT
  337.       PeekEvFromQueue(MouQueue, MouEvent);
  338.       PeekEvFromQueue(KeyQueue, KeyEvent);
  339.     UNTIL (MouEvent.EventType <> EvNoEv) OR
  340.     (KeyEvent.EventType <> EvNoEv);
  341.     IF (KeyEvent.Time >= MouEvent.Time) THEN
  342.       GetEvFromQueue(MouQueue, Event)
  343.     ELSE
  344.       GetEvFromQueue(KeyQueue, Event);
  345.   END;
  346.  
  347.   (* ----------------------------------------------------- *)
  348.   (* Gibt nächstes aufzurufendes Event zurück, belässt es  *)
  349.   (* aber in der entsprechenden Queue.                     *)
  350.   (* ----------------------------------------------------- *)
  351.   PROCEDURE EventHandlerObj.PeekEvent(VAR Event : EventObj);
  352.   VAR MouEvent, KeyEvent : EventObj;
  353.   BEGIN
  354.     PeekEvFromQueue(MouQueue, MouEvent);
  355.     PeekEvFromQueue(KeyQueue, KeyEvent);
  356.     IF (KeyEvent.Time >= MouEvent.Time) THEN
  357.       Event := MouEvent
  358.     ELSE
  359.       Event := KeyEvent;
  360.   END;
  361.  
  362.   (* ----------------------------------------------------- *)
  363.   (*           Wartet auf Event der Art WaitForEv          *)
  364.   (* ----------------------------------------------------- *)
  365.   PROCEDURE EventHandlerObj.WaitForEvent
  366.     (WaitForEv : INTEGER;
  367.      VAR Event : EventObj);
  368.   VAR EvIndex : BYTE;
  369.   BEGIN
  370.     REPEAT
  371.       GetEvent(Event);
  372.       EvIndex := GetEvIndex(Event.EventType);
  373.       IF (HandlerTable[EvIndex].Installed) THEN
  374.         HandlerTable[EvIndex].Handler(Event);
  375.     UNTIL (Event.EventType AND WaitForEv <> 0);
  376.     Event := Event;
  377.   END;
  378.  
  379.   (* ----------------------------------------------------- *)
  380.   (* Liefert den Index, dh Position eines Handlers für     *)
  381.   (* EventType in einem Array HandlerArray, zurück.        *)
  382.   (* ----------------------------------------------------- *)
  383.   FUNCTION EventHandlerObj.GetEvIndex
  384.     (EventType : WORD) : BYTE;
  385.   VAR
  386.     i : BYTE;
  387.     Index : BYTE;
  388.   BEGIN
  389.     Index := 0;
  390.     FOR i := 1 TO 9 DO
  391.       IF EventType = IndexArray[i] THEN
  392.         Index := i;
  393.     GetEvIndex := Index;
  394.   END;
  395.  
  396.   (* ----------------------------------------------------- *)
  397.   (* Installiert Handler NewHandler für Eventart Event.    *)
  398.   (* Die furchtbar aussehenden Abfragen sind notwendig     *)
  399.   (* damit NewHandler, falls Handler z.B. EvMouAll ist     *)
  400.   (* auch für alle Mausereignisse eingetragen wird.        *)
  401.   (* ----------------------------------------------------- *)
  402.   PROCEDURE EventHandlerObj.RegisterHandler
  403.     (Event : WORD; NewHandler : HandlerProc);
  404.   VAR i : INTEGER;
  405.   BEGIN
  406.     IF (Event = EvMouAll) OR
  407.     (Event = EvKeyAll) OR
  408.     (Event = EvAll) THEN BEGIN
  409.       IF (Event = EvMouAll) OR(Event = EvAll) THEN
  410.         FOR i := 2 TO 6 DO
  411.           WITH HandlerTable[i] DO BEGIN
  412.             Handler := NewHandler; Installed := TRUE;
  413.           END;
  414.       IF (Event = EvKeyAll) OR(Event = EvAll) THEN
  415.         FOR i := 7 TO 9 DO
  416.           WITH HandlerTable[i] DO BEGIN
  417.             Handler := NewHandler; Installed := TRUE;
  418.           END;
  419.     END ELSE
  420.       WITH HandlerTable[GetEvIndex(Event)] DO BEGIN
  421.         Handler := NewHandler; Installed := TRUE;
  422.       END;
  423.   END;
  424.  
  425.   PROCEDURE EventHandlerObj.DeRegisterHandler(Event : WORD);
  426.   VAR i : INTEGER;
  427.   BEGIN
  428.     IF (Event = EvMouAll) OR
  429.     (Event = EvKeyAll) OR
  430.     (Event = EvAll) THEN BEGIN
  431.       IF (Event = EvMouAll) OR(Event = EvAll) THEN
  432.         FOR i := 2 TO 6 DO
  433.           WITH HandlerTable[i] DO
  434.             Installed := FALSE;
  435.       IF (Event = EvKeyAll) OR(Event = EvAll) THEN
  436.         FOR i := 7 TO 7 DO
  437.           WITH HandlerTable[i] DO
  438.             Installed := FALSE;
  439.     END ELSE
  440.       WITH HandlerTable[GetEvIndex(Event)] DO
  441.         Installed := FALSE;
  442.   END;
  443.  
  444.   PROCEDURE EventHandlerObj.SetTakeOut(T : BOOLEAN);
  445.   BEGIN
  446.     TakeOut := T;
  447.   END;
  448.  
  449.   FUNCTION EventHandlerObj.GetTakeOut : BOOLEAN;
  450.   BEGIN
  451.     GetTakeOut := TakeOut;
  452.   END;
  453.  
  454.   FUNCTION EventHandlerObj.KeyState : BYTE;
  455.   BEGIN
  456.     KeyState := AktState;
  457.   END;
  458.  
  459.   FUNCTION EventHandlerObj.MouPressed(Ev : EventObj) : BOOLEAN;
  460.   BEGIN
  461.     MouPressed := (Ev.EventType = EvLeftPress) OR
  462.                   (Ev.EventType = EvRightPress);
  463.   END;
  464.  
  465.   FUNCTION EventHandlerObj.MouReleased(Ev : EventObj) : BOOLEAN;
  466.   BEGIN
  467.     MouReleased := ((Ev.EventType = EvLeftRel) OR
  468.                     (Ev.EventType = EvRightRel)) AND
  469.                    (Ev.Buttons = 0);
  470.   END;
  471.  
  472.   DESTRUCTOR EventHandlerObj.Done;
  473.   BEGIN
  474.     IF MouQueue <> NIL THEN DISPOSE(MouQueue);
  475.     IF KeyQueue <> NIL THEN DISPOSE(KeyQueue);
  476.   END;
  477.  
  478.   (* ----------------------------------------------------- *)
  479.   (* Neue Exitprozedur, die den Speicher der Objekte frei- *)
  480.   (* gibt und die ein verbogenen Zeiger wieder aufstellt.  *)
  481.   (* ----------------------------------------------------- *)
  482. {$F+} PROCEDURE MouKeyExit; {$F-}
  483.   VAR Regs : Registers;
  484.   BEGIN
  485.     SetIntVec($09, OldInt09);
  486.     Regs.AX := $00;               { kein Maushandler mehr installiert }
  487.     Intr($33, Regs);
  488.     IF Mouse <> NIL THEN DISPOSE(Mouse, Done);
  489.     IF EvHand <> NIL THEN DISPOSE(EvHand, Done);
  490.     EXITPROC := OldExitProc;
  491.   END;
  492.  
  493.   (* ----------------------------------------------------- *)
  494.   (* Wird von dem Interruptersatz für Int 09hex aus dem    *)
  495.   (* Assemblermodul heraus aufgerufen und ruft EvHand^.    *)
  496.   (* KeybHandler auf.                                      *)
  497.   (* ----------------------------------------------------- *)
  498.   PROCEDURE CallKeybHandler(Key : BYTE);
  499.   BEGIN
  500.     IF Installed THEN
  501.       EvHand^.KeybHandler(Key);
  502.   END;
  503.  
  504.   (* ----------------------------------------------------- *)
  505.   (* Wird von dem installierten Maushandler aus dem        *)
  506.   (* Assemblermodul aufgerufen und ruft den Maushandler von*)
  507.   (* EvHand  auf.                                          *)
  508.   (* ----------------------------------------------------- *)
  509.   PROCEDURE CallMouHandler(NF, NB, NX, NY : INTEGER);
  510.   BEGIN
  511.     IF Installed THEN BEGIN
  512.       NewButtons := NB; NewFlags := NF;
  513.       NewX := NX; NewY := NY;
  514.       EvHand^.MouseHandler;
  515.     END;
  516.   END;
  517.  
  518.   (* ----------------------------------------------------- *)
  519.   (*       Die vier öffentlich-nicht-objektorientierten    *)
  520.   (*                       Prozeduren.                     *)
  521.   (* ----------------------------------------------------- *)
  522.   PROCEDURE DeInstall;
  523.   BEGIN
  524.     DISPOSE(EvHand, Done);
  525.     EvHand := NIL; Installed := FALSE;
  526.   END;
  527.  
  528.   PROCEDURE DeInstallMouse;
  529.   BEGIN
  530.     IF NOT Installed THEN BEGIN
  531.       DISPOSE(Mouse, Done);
  532.       Mouse := NIL;
  533.     END;
  534.   END;
  535.  
  536.   PROCEDURE ReInstallMouse(NewMouse : MouseObjPtr);
  537.   BEGIN
  538.     IF (Mouse = NIL) AND(NewMouse <> NIL) THEN
  539.       Mouse := NewMouse;
  540.   END;
  541.  
  542.   PROCEDURE ReInstall(NewHandler : EventHandlerObjPtr);
  543.   BEGIN
  544.     IF (EvHand = NIL) AND
  545.     (NewHandler <> NIL) AND
  546.     (Mouse <> NIL) THEN BEGIN
  547.       EvHand := NewHandler; Installed := TRUE;
  548.     END;
  549.   END;
  550.  
  551.   (* ----------------------------------------------------- *)
  552.   (* Initteil der Unit: Mouse und EvHand anlegen, ExitProc *)
  553.   (* umbiegen, Interruptadressen speichern und eigene      *)
  554.   (* Handler installieren.                                 *)
  555.   (* ----------------------------------------------------- *)
  556. BEGIN
  557.   Installed := FALSE;
  558.   Mouse := NEW(MouseObjPtr, Init);
  559.   EvHand := NEW(EventHandlerObjPtr, Init);
  560.   Installed := (Mouse <> NIL) AND(EvHand <> NIL);
  561.   IF Installed THEN BEGIN
  562.     OldExitProc := EXITPROC;
  563.     EXITPROC := @MouKeyExit;
  564.     GetIntVec($09, OldInt09);
  565.     SetIntVec($09, @NewKeybHandler);
  566.   END;
  567. END.
  568. (* ----------------------------------------------------- *)
  569. (*                 Ende von MouKey.Pas                   *)
  570. (* ----------------------------------------------------- *)
  571.