home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 22 / events / moukey.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-01-04  |  19.4 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.