<> <> <> <> <> DIRECTORY Menus, Process, SV2d, SVArtworkUser, SVInputMonitor, SVStretch, SVInterfaceTypes, SVViewerInput; SVInputMonitorImpl: MONITOR IMPORTS Process, SVArtworkUser, SVStretch, SVViewerInput 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; 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 Process.Detach[globalProcess _ FORK Painter]; }; NewArtworkCommand: PUBLIC ENTRY PROC [atom: ATOM, artworkToolData: ArtworkToolData] = { globalWorkToDo _ TRUE; clickAtom _ atom; awData _ artworkToolData; IF globalProcess = NIL THEN 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 => SVStretch.StartDrag[viewerToolData, controlPoint]; $SetDrag => SVStretch.SetDrag[viewerToolData, controlPoint]; $EndDrag => SVStretch.EndDrag[viewerToolData, controlPoint]; $StartCameraDrag => SVStretch.StartCameraDrag[viewerToolData, controlPoint]; $SetCameraDrag => SVStretch.SetCameraDrag[viewerToolData, controlPoint]; $EndCameraDrag => SVStretch.EndCameraDrag[viewerToolData, controlPoint]; $FrameUpLeft => SVViewerInput.FrameUpLeft[viewerToolData, controlPoint]; $FrameDownRightMove => SVViewerInput.FrameDownRightMove[viewerToolData, controlPoint]; $FrameDownRightEnd => SVViewerInput.FrameDownRightEnd[viewerToolData, controlPoint]; $DeleteFrame => SVViewerInput.DeleteFrame[viewerToolData]; $StartSkitter => SVViewerInput.StartSkitter[viewerToolData, controlPoint, first]; $DuringSkitter => SVViewerInput.DuringSkitter[viewerToolData, controlPoint, first]; $EndSkitter => SVViewerInput.EndSkitter[viewerToolData, controlPoint, first]; $StartBackSkitter => SVViewerInput.StartSkitter[viewerToolData, controlPoint, lastOfFirst]; $DuringBackSkitter => SVViewerInput.DuringSkitter[viewerToolData, controlPoint, lastOfFirst]; $EndBackSkitter => SVViewerInput.EndSkitter[viewerToolData, controlPoint, lastOfFirst]; $StartTopLevelSkitter => SVViewerInput.StartSkitter[viewerToolData, controlPoint, lastOfLevel1]; $DuringTopLevelSkitter => SVViewerInput.DuringSkitter[viewerToolData, controlPoint, lastOfLevel1]; $EndTopLevelSkitter => SVViewerInput.EndSkitter[viewerToolData, controlPoint, lastOfLevel1]; $StartCoordSkitter => SVViewerInput.StartCoordSkitter[viewerToolData, controlPoint]; $DuringCoordSkitter => SVViewerInput.DuringCoordSkitter[viewerToolData, controlPoint]; $EndCoordSkitter => SVViewerInput.EndCoordSkitter[viewerToolData, controlPoint]; $StartTightRope => SVViewerInput.StartTightRope[viewerToolData, controlPoint]; $DuringTightRope => SVViewerInput.DuringTightRope[viewerToolData, controlPoint]; $EndTightRope => SVViewerInput.EndTightRope[viewerToolData, controlPoint]; $StartWallWalk => SVViewerInput.StartWallWalk[viewerToolData, controlPoint]; $DuringWallWalk => SVViewerInput.DuringWallWalk[viewerToolData, controlPoint]; $EndWallWalk => SVViewerInput.EndWallWalk[viewerToolData, controlPoint]; $Paint => SVViewerInput.Paint[viewerToolData, controlPoint]; $OpenAISFile => SVArtworkUser.OpenFile[artworkToolData]; $CloseAISFile => SVArtworkUser.CloseFile[artworkToolData]; $ExtendSkitter => SVViewerInput.ExtendSkitter[viewerToolData, controlPoint, first]; $ExtendCoordSkitter => SVViewerInput.ExtendCoordSkitter[viewerToolData, controlPoint]; ENDCASE; }; END.