(*---------------------------------------------------------------------------
  :Program.    MoveMouse2
  :Author.     Thomas Igracki
  :E-Mail.     T.IGRACKI@BAMP.ZER
  :Version.    1.0
  :Date.       04-Jan-92
  :Copyright.  PD
  :Language.   Oberon
  :Translator. Amiga Oberon 2.13d
  :Contents.   Damit läßt sich der Mauszeiger auf dem akt. Screen positionieren
  :Usage.      MoveMouse2 [r=rel] <x> <y>, r=rel -> relativ zur akt. Position
---------------------------------------------------------------------------*)
(* $StackChk- $RangeChk- $CaseChk- $OvflChk- $ReturnChk- $TypeChk- $NilChk- *)
MODULE MoveMouse2;
IMPORT
       s: SYSTEM,
       e: Exec,
       d: Dos,
       I: Intuition,
      in: Input,
      ie: InputEvent;
TYPE
   ArgsStruct = STRUCT END; LONGPTR = POINTER TO LONGINT;
VAR 
   DevIO        : e.IOStdReqPtr;
   DevPort      : e.MsgPortPtr;
   DeviceOpen   : BOOLEAN;
   Event        : ie.InputEventAdr;
   PPixel       : ie.IEPointerPixel;
   dos          : d.DosLibraryPtr;
   RDArgs       : d.RDArgsPtr;
   args         : STRUCT (du:ArgsStruct) rel: LONGINT; x,y: LONGPTR END;

PROCEDURE ReadArgs*{dos,-798}(template{1}  : ARRAY OF CHAR;
                              array{2}     : ArgsStruct;
                              args{3}      : d.RDArgsPtr): d.RDArgsPtr;

BEGIN
     dos := d.dos; RDArgs := ReadArgs ('r=rel/S,x/N/A,y/N/A',args,NIL);
     IF RDArgs = NIL THEN d.PrintF ('Usage: MoveMouse2 [r=rel] <x> <y>\n'); HALT(20) END;

     DevPort := e.CreateMsgPort();
     IF DevPort = NIL THEN HALT(20) END;

     DevIO   := e.CreateIORequest (DevPort,s.SIZE(DevIO^));
     IF DevIO = NIL THEN HALT(20) END;

     IF e.OpenDevice ('input.device',0,DevIO,LONGSET{}) # 0 THEN HALT(20) END;
     DeviceOpen := TRUE;

     (* Set new Mouse XY *)
     DevIO.command := in.writeEvent;
     DevIO.length  := s.SIZE(Event);

     Event.class    := ie.newpointerpos;
     Event.subClass := ie.pixel;
     IF args.rel = I.LTRUE THEN Event.qualifier:= {ie.relativeMouse} END;
     PPixel.screen     := I.int.activeScreen;
     PPixel.position.x := SHORT(args.x^);
     PPixel.position.y := SHORT(args.y^);
     Event.addr        := s.ADR(PPixel);

     DevIO.data := s.ADR(Event); e.OldDoIO (DevIO);

CLOSE
     IF DeviceOpen    THEN e.CloseDevice (DevIO) END;
     IF DevPort # NIL THEN e.DeleteMsgPort (DevPort) END;
     IF DevIO   # NIL THEN e.DeleteIORequest (DevIO) END;
     IF RDArgs  # NIL THEN d.FreeArgs (RDArgs) END;
END MoveMouse2.
