<> <> <> <> DIRECTORY Imager, IO, Rope, ViewerClasses; SlackProcess: CEDAR DEFINITIONS = BEGIN <> <<>> <> <> <> <> <> <> <<>> <> <<>> Point: TYPE = Imager.VEC; BitVector: TYPE = REF BitVectorObj; BitVectorObj: TYPE = RECORD [bits: PACKED SEQUENCE len: NAT OF BOOL]; <> <<>> EventProc: TYPE = PROC [event: LIST OF REF ANY, clientData: REF ANY]; MouseEventProc: TYPE = PROC [event: LIST OF REF ANY, point: Point, clientData: REF ANY]; OptimizeProc: TYPE = PROC [summary: QueueSummary] RETURNS [skipActions: NAT]; <> LoggingProc: TYPE = PROC [point: Point, action: LIST OF REF ANY, mouseEvent: BOOL, clientData: REF ANY]; AbortProc: TYPE = PROC [data: REF ANY]; <> <<>> ClientDatas: TYPE = REF ClientDatasData; ClientDatasData: TYPE = RECORD[SEQUENCE len: NAT OF REF ANY]; OptimizeHints: TYPE = REF OptimizeHintsData; OptimizeHintsData: TYPE = RECORD[SEQUENCE len: NAT OF REF ANY]; Actions: TYPE = REF ActionsData; ActionsData: TYPE = RECORD[SEQUENCE len: NAT OF LIST OF REF ANY]; Points: TYPE = REF PointsData; PointsData: TYPE = RECORD[SEQUENCE len: NAT OF Point]; QueueSummary: TYPE = REF QueueSummaryObj; QueueSummaryObj: TYPE = RECORD [ count: NAT _ 0, -- how many events are currently in the queue clientDatas: ClientDatas, -- the clientData registered with each event optimizeHints: OptimizeHints, -- the REF ANY hint registered with each event actions: Actions, -- the LIST OF REF ANY action with each event points: Points -- the mouse point at which the action occurs (if the -- action was queued by QueueInputActionWithPoint) ]; SlackHandle: TYPE = REF SlackData; <> <> SlackData: TYPE = MONITORED RECORD [ slackProcess: PROCESS, queue: Queue, summary: QueueSummary, optimizeProc: OptimizeProc, log: Log, abort: Abort ]; -- eventually should be opaque Queue: TYPE = REF QueueData; <> QueueData: TYPE = RECORD [ notFull: CONDITION, head: NAT _ 0, tail: NAT _ 0, size: NAT _ 0, clientDatas: ClientDatas _ NIL, optimizeHints: OptimizeHints _ NIL, actions: Actions _ NIL, points: Points _ NIL, mouseProcs: MouseProcs _ NIL, eventProcs: EventProcs _ NIL ]; MouseProcs: TYPE = REF MouseProcsData; MouseProcsData: TYPE = RECORD[SEQUENCE len: NAT OF MouseEventProc]; EventProcs: TYPE = REF EventProcsData; EventProcsData: TYPE = RECORD[SEQUENCE len: NAT OF EventProc]; Log: TYPE = REF LogData; <> LogData: TYPE = RECORD[ head: NAT _ 0, size: NAT _ 0, loggerEnabled: BOOL _ FALSE, logger: LoggingProc _ NIL, received: Received, -- received an action versus performed an action. bashed: Bashed, -- bashed an action versus performed an action. events: Events, points: Points ]; Received: TYPE = REF ReceivedData; ReceivedData: TYPE = RECORD[SEQUENCE len: NAT OF BOOL]; Bashed: TYPE = REF BashedData; BashedData: TYPE = RECORD[SEQUENCE len: NAT OF BOOL]; Events: TYPE = REF EventsData; EventsData: TYPE = RECORD[SEQUENCE len: NAT OF REF ANY]; Abort: TYPE = REF AbortData; AbortData: TYPE = RECORD [ enabled: BOOL _ FALSE, proc: AbortProc, viewer: ViewerClasses.Viewer, data: REF ]; <<... END PRIVATE STUFF>> <> Create: PROC [queueSize: NAT _ 50, logSize: NAT _ 50, optimizeProc: OptimizeProc, loggingProc: LoggingProc _ NIL, abortProc: AbortProc _ NIL, abortData: REF ANY _ NIL, abortViewer: ViewerClasses.Viewer _ NIL] RETURNS[handle: SlackHandle]; <> <<>> <> QueueInputAction: PROC [handle: SlackHandle, callBack: EventProc, inputAction: LIST OF REF ANY, clientData: REF ANY, optimizeHint: REF ANY]; <> <> <> QueueInputActionWithPoint: PROC [handle: SlackHandle, callBack: MouseEventProc, inputAction: LIST OF REF ANY, point: Point, clientData: REF ANY, optimizeHint: REF ANY]; <> <<>> <> Restart: PROC [handle: SlackHandle]; <> <> FlushQueue: PROC [handle: SlackHandle]; <> <<>> <> LogRawMouse: PROC [handle: SlackHandle, point: Point]; <> OutputLog: PROC [handle: SlackHandle, stream: IO.STREAM]; <> <> <> EnableSessionLogging: PROC [handle: SlackHandle] RETURNS [alreadyEnabled: BOOL _ FALSE]; DisableSessionLogging: PROC [handle: SlackHandle] RETURNS [alreadyDisabled: BOOL _ FALSE]; RegisterLogger: PROC [handle: SlackHandle, loggingProc: LoggingProc] RETURNS [alreadyRegistered: BOOL _ FALSE]; <> <> EnableAborts: PROC [handle: SlackHandle] RETURNS [alreadyEnabled: BOOL _ FALSE]; DisableAborts: PROC [handle: SlackHandle] RETURNS [alreadyDisabled: BOOL _ FALSE]; RegisterAbortProc: PROC [handle: SlackHandle, abortProc: AbortProc _ NIL, abortData: REF ANY _ NIL, abortViewer: ViewerClasses.Viewer _ NIL] RETURNS [alreadyRegistered: BOOL _ FALSE]; <> END.