<> <> <> <> DIRECTORY Menus, Process, SV2d, SVInputMonitor, SVViewerTool, SVViewerInput; SVInputMonitorImpl: MONITOR IMPORTS Process, SVViewerInput EXPORTS SVInputMonitor = BEGIN MouseButton: TYPE = Menus.MouseButton; Point2d: TYPE = SV2d.Point2d; ViewerToolData: TYPE = SVViewerTool.ViewerToolData; globalProcess: PROCESS _ NIL; cameraCoords: Point2d; clickAtom: ATOM; vtData: ViewerToolData _ NIL; globalNew: BOOL _ FALSE; NewMotion: PUBLIC ENTRY PROC [pt: Point2d, atom: ATOM, viewerToolData: ViewerToolData] = { globalNew _ TRUE; cameraCoords _ pt; vtData _ viewerToolData; clickAtom _ atom; IF globalProcess = NIL THEN Process.Detach[globalProcess _ FORK Painter]; }; Painter: PROC = { WHILE New[] DO Dispatch[cameraCoords, clickAtom, vtData]; ENDLOOP; }; New: PUBLIC ENTRY PROC RETURNS [x: BOOL] = { x _ globalNew; globalNew _ FALSE; IF NOT x THEN globalProcess _ NIL; -- no mouse action. Let process die. }; Dispatch: PROC [controlPoint: Point2d, atom: ATOM, viewerToolData: ViewerToolData] = { SELECT atom FROM $SetPrimarySelection => SVViewerInput.SetPrimarySelection[viewerToolData, controlPoint]; $SetSecondarySelection => SVViewerInput.SetSecondarySelection[viewerToolData, controlPoint]; ENDCASE; }; END.