SVInputMonitorImpl.mesa
Author: Eric Bier on December 9, 1982 11:33 pm
Copyright © 1984 by Xerox Corporation. All rights reserved.
Last edited by Bier on January 28, 1987 2:30:21 pm PST
Contents: A flexible setup, suggested by Scott McGregor, for processing mouse input as fast as you can (but no faster). I will use it to synchronize my mouse point processing with the mousepoint. If the processing algorithms become faster, this procedure will still do the right thing.
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: PROCESSNIL;
cameraCoords: Point2d;
clickAtom: ATOM;
vtData: ViewerToolData ← NIL;
awData: ArtworkToolData ← NIL;
globalWorkToDo: BOOLFALSE;
Restart: PUBLIC ENTRY PROC [] = {
Sometimes the Painter process is aborted because of a bug in one of the dispatched procedures. This procedure allows the user to get things going again.
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.