<> <> <> <> <> DIRECTORY Menus, Process, SV2d, SVArtworkUser, SVInputMonitor, SVMouseEvent, SVInterfaceTypes; SVInputMonitorImpl: CEDAR MONITOR IMPORTS Process, SVArtworkUser, SVMouseEvent EXPORTS SVInputMonitor = BEGIN ArtworkToolData: TYPE = SVInterfaceTypes.ArtworkToolData; MouseButton: TYPE = Menus.MouseButton; Point2d: TYPE = SV2d.Point2d; ViewerToolData: TYPE = SVInterfaceTypes.ViewerToolData; globalProcess: PROCESS _ NIL; cameraCoords: Point2d; clickAtom: ATOM; vtData: ViewerToolData _ NIL; awData: ArtworkToolData _ NIL; globalWorkToDo: BOOL _ FALSE; Restart: PUBLIC ENTRY PROC [] = { <> globalWorkToDo _ FALSE; TRUSTED {Process.Detach[globalProcess _ FORK Painter]}; }; NewMotion: PUBLIC ENTRY PROC [pt: Point2d, atom: ATOM, viewerToolData: ViewerToolData] = { globalWorkToDo _ TRUE; cameraCoords _ pt; vtData _ viewerToolData; clickAtom _ atom; IF globalProcess = NIL THEN TRUSTED {Process.Detach[globalProcess _ FORK Painter]}; }; NewArtworkCommand: PUBLIC ENTRY PROC [atom: ATOM, artworkToolData: ArtworkToolData] = { globalWorkToDo _ TRUE; clickAtom _ atom; awData _ artworkToolData; IF globalProcess = NIL THEN TRUSTED {Process.Detach[globalProcess _ FORK Painter]}; }; Painter: PROC = { WHILE WorkToDo[] DO Dispatch[cameraCoords, clickAtom, vtData, awData]; ENDLOOP; }; WorkToDo: PUBLIC ENTRY PROC RETURNS [x: BOOL] = { x _ globalWorkToDo; globalWorkToDo _ FALSE; IF NOT x THEN globalProcess _ NIL; -- no mouse action. Let process die. }; Dispatch: PROC [controlPoint: Point2d, atom: ATOM, viewerToolData: ViewerToolData, artworkToolData: ArtworkToolData] = { SELECT atom FROM $StartDrag => SVMouseEvent.StartDrag[viewerToolData, controlPoint]; $SetDrag => SVMouseEvent.SetDrag[viewerToolData, controlPoint]; $EndDrag => SVMouseEvent.EndDrag[viewerToolData, controlPoint]; $StartCameraDrag => SVMouseEvent.StartCameraDrag[viewerToolData, controlPoint]; $SetCameraDrag => SVMouseEvent.SetCameraDrag[viewerToolData, controlPoint]; $EndCameraDrag => SVMouseEvent.EndCameraDrag[viewerToolData, controlPoint]; $FrameUpLeft => SVMouseEvent.FrameUpLeft[viewerToolData, controlPoint]; $FrameDownRightMove => SVMouseEvent.FrameDownRightMove[viewerToolData, controlPoint]; $FrameDownRightEnd => SVMouseEvent.FrameDownRightEnd[viewerToolData, controlPoint]; $DeleteFrame => SVMouseEvent.DeleteFrame[viewerToolData]; $StartSkitter => SVMouseEvent.StartSkitter[viewerToolData, controlPoint, first]; $DuringSkitter => SVMouseEvent.DuringSkitter[viewerToolData, controlPoint, first]; $EndSkitter => SVMouseEvent.EndSkitter[viewerToolData, controlPoint, first]; $StartBackSkitter => SVMouseEvent.StartSkitter[viewerToolData, controlPoint, lastOfFirst]; $DuringBackSkitter => SVMouseEvent.DuringSkitter[viewerToolData, controlPoint, lastOfFirst]; $EndBackSkitter => SVMouseEvent.EndSkitter[viewerToolData, controlPoint, lastOfFirst]; $StartTopLevelSkitter => SVMouseEvent.StartSkitter[viewerToolData, controlPoint, lastOfLevel1]; $DuringTopLevelSkitter => SVMouseEvent.DuringSkitter[viewerToolData, controlPoint, lastOfLevel1]; $EndTopLevelSkitter => SVMouseEvent.EndSkitter[viewerToolData, controlPoint, lastOfLevel1]; $StartCoordSkitter => SVMouseEvent.StartCoordSkitter[viewerToolData, controlPoint]; $DuringCoordSkitter => SVMouseEvent.DuringCoordSkitter[viewerToolData, controlPoint]; $EndCoordSkitter => SVMouseEvent.EndCoordSkitter[viewerToolData, controlPoint]; $StartTightRope => SVMouseEvent.StartTightRope[viewerToolData, controlPoint]; $DuringTightRope => SVMouseEvent.DuringTightRope[viewerToolData, controlPoint]; $EndTightRope => SVMouseEvent.EndTightRope[viewerToolData, controlPoint]; $StartWallWalk => SVMouseEvent.StartWallWalk[viewerToolData, controlPoint]; $DuringWallWalk => SVMouseEvent.DuringWallWalk[viewerToolData, controlPoint]; $EndWallWalk => SVMouseEvent.EndWallWalk[viewerToolData, controlPoint]; $Paint => SVMouseEvent.Paint[viewerToolData, controlPoint]; $OpenAISFile => SVArtworkUser.OpenFile[artworkToolData]; $CloseAISFile => SVArtworkUser.CloseFile[artworkToolData]; $ExtendSkitter => SVMouseEvent.ExtendSkitter[viewerToolData, controlPoint, first]; $ExtendCoordSkitter => SVMouseEvent.ExtendCoordSkitter[viewerToolData, controlPoint]; ENDCASE; }; END.