home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / OB3.2D2.DMS / in.adf / Module / Mouse.mod < prev    next >
Encoding:
Text File  |  1994-08-05  |  3.1 KB  |  117 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                                                                         *)
  3. (*  Amiga Oberon Library Module: Mouse                Date: 02-Nov-92      *)
  4. (*                                                                         *)
  5. (*   © 1991 by Fridtjof Siebert                                            *)
  6. (*                                                                         *)
  7. (*-------------------------------------------------------------------------*)
  8.  
  9. MODULE Mouse;
  10.  
  11. IMPORT es  := ExecSupport,
  12.        e   := Exec,
  13.        ie  := InputEvent,
  14.        in  := Input,
  15.        ol  := OberonLib,
  16.        sys := SYSTEM;
  17.  
  18. (*------  which Mousebutton is selected:  ------*)
  19.  
  20. VAR
  21.   leftButton  - : BOOLEAN;
  22.   rightButton - : BOOLEAN;
  23.   midButton   - : BOOLEAN;
  24.  
  25. (*------  internal stuff:  ------*)
  26.  
  27.   IDevPort: e.MsgPortPtr;
  28.   IReqBlock: e.IOStdReqPtr;
  29.   HandlerStuff: e.Interrupt;
  30.   HandlerActive,InputOpen: BOOLEAN;
  31.   Me: e.TaskPtr;
  32.   MySig: LONGINT;
  33.   waitLeft,waitRight: BOOLEAN;
  34.  
  35.  
  36. (*------  Wait for Left Button:  ------*)
  37.  
  38.  
  39. PROCEDURE WaitLMB*;
  40. BEGIN
  41.   waitLeft := TRUE;
  42.   REPEAT UNTIL MySig IN e.Wait(LONGSET{MySig});
  43. END WaitLMB;
  44.  
  45.  
  46. (*------  Wait for Right Button:  ------*)
  47.  
  48.  
  49. PROCEDURE WaitRMB*;
  50. BEGIN
  51.   waitRight := TRUE;
  52.   REPEAT UNTIL MySig IN e.Wait(LONGSET{MySig});
  53. END WaitRMB;
  54.  
  55.  
  56. (*-------------------------------------------------------------------------*)
  57.  
  58.  
  59. PROCEDURE * Handler(); (* $StackChk- $SaveRegs+ *)
  60.  
  61. VAR Ev,ev: ie.InputEventPtr;
  62.  
  63. BEGIN
  64.   sys.SETREG(13,sys.REG(9));   (* Varbase *)
  65.   Ev := sys.REG(8);
  66.   ev := Ev;
  67.   WHILE ev#NIL DO
  68.     IF ev.class=ie.rawmouse THEN
  69.       midButton   := ie.  midButton IN ev.qualifier;
  70.       leftButton  := ie. leftButton IN ev.qualifier;
  71.       rightButton := ie.rightButton IN ev.qualifier;
  72.       IF waitLeft  & leftButton  THEN waitLeft  := FALSE; e.Signal(Me,LONGSET{MySig}) END;
  73.       IF waitRight & rightButton THEN waitRight := FALSE; e.Signal(Me,LONGSET{MySig}) END;
  74.     END;
  75.     ev := ev.nextEvent;
  76.   END;
  77.   sys.SETREG(0,Ev);
  78. END Handler; (* $StackChk= *)
  79.  
  80.  
  81. BEGIN
  82.  
  83.   MySig := -1;
  84.   Me := sys.VAL(e.TaskPtr,ol.Me);
  85.  
  86. (*------  Open everything we need:  ------*)
  87.  
  88.   MySig     := e.AllocSignal(-1);        IF MySig<0       THEN HALT(20) END;
  89.   IDevPort  := es.CreatePort("",0);      IF IDevPort=NIL  THEN HALT(20) END;
  90.   IReqBlock := es.CreateStdIO(IDevPort); IF IReqBlock=NIL THEN HALT(20) END;
  91.   IF e.OpenDevice("input.device",0,IReqBlock,LONGSET{})#0 THEN HALT(20) END;
  92.   InputOpen := TRUE;
  93.  
  94.   HandlerStuff.data     := sys.REG(13);  (* Varbase *)
  95.   HandlerStuff.node.pri := 51;
  96.   HandlerStuff.code     := Handler;
  97.   IReqBlock.command := in.addHandler;
  98.   IReqBlock.data    := sys.ADR(HandlerStuff);
  99.   IF e.DoIO(IReqBlock)=0 THEN END;
  100.  
  101.   HandlerActive := TRUE;
  102.  
  103. CLOSE
  104.  
  105.   IF HandlerActive         THEN
  106.     IReqBlock.command := in.remHandler;
  107.     IReqBlock.data := sys.ADR(HandlerStuff);
  108.     IF e.DoIO(IReqBlock)=0 THEN END;
  109.   END;
  110.   IF InputOpen     THEN e.CloseDevice (IReqBlock) END;
  111.   IF IDevPort#NIL  THEN es.DeletePort (IDevPort)  END;
  112.   IF IReqBlock#NIL THEN es.DeleteStdIO(IReqBlock) END;
  113.   IF MySig>=0      THEN e.FreeSignal  (MySig)     END;
  114.  
  115. END Mouse.
  116.  
  117.