<> <> <> DIRECTORY Graphics, GraphicsOps, Process, PseudoCursors, UserTerminal, ViewerOps, ViewerClasses; PseudoCursorsImpl: CEDAR MONITOR IMPORTS Graphics, GraphicsOps, Process, ViewerOps EXPORTS PseudoCursors = BEGIN PseudoCursor: TYPE = PseudoCursors.PseudoCursor; DataRec: TYPE = RECORD [ bits: REF UserTerminal.CursorArray, bitMap: GraphicsOps.BitmapRef, newData: BOOLEAN _ FALSE, paint: PROCESS _ NIL, timeout: CONDITION ]; waitTime: Process.Ticks _ Process.MsecToTicks[100]; Create: PUBLIC PROC [parent: ViewerClasses.Viewer, x, y: INTEGER _ 0] RETURNS [pseudoCursor: PseudoCursor] = TRUSTED { data: REF DataRec _ NEW[DataRec]; data.bits _ NEW[UserTerminal.CursorArray]; data.bitMap _ NEW[GraphicsOps.BitmapRep _ [base: data.bits, raster: 1, width: 16, height: 16]]; Process.InitializeCondition[@data.timeout, waitTime]; pseudoCursor _ ViewerOps.CreateViewer[flavor: $PsuedoCursor, info: [parent: parent, wx: x, wy: y, ww: 16, wh: 16, data: data, border: FALSE], paint: FALSE]; }; Set: PUBLIC ENTRY PROC [pseudoCursor: PseudoCursor, bits: REF UserTerminal.CursorArray] = BEGIN ENABLE UNWIND => {}; d: REF DataRec _ NARROW[pseudoCursor.data]; IF bits=NIL THEN {bits _ NEW[UserTerminal.CursorArray _ ALL[0]]}; d.bits^ _ bits^; d.newData _ TRUE; IF d.paint = NIL THEN TRUSTED{Process.Detach[d.paint _ FORK PaintProcess[pseudoCursor]]}; END; PaintProcess: ENTRY PROCEDURE [pseudoCursor: PseudoCursor] = BEGIN ENABLE UNWIND => {}; d: REF DataRec _ NARROW[pseudoCursor.data]; WHILE d.newData DO d.newData _ FALSE; TRUSTED{ViewerOps.PaintViewer[pseudoCursor, client, FALSE, $Update]}; WAIT d.timeout; ENDLOOP; d.paint _ NIL; END; PseudoCursorPaint: ViewerClasses.PaintProc = BEGIN Graphics.SetCP[context, 0, 16]; GraphicsOps.DrawBitmap[context, NARROW[self.data, REF DataRec].bitMap, 16, 16]; END; psuedoCursor: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec _ [ paint: PseudoCursorPaint, tipTable: NIL ]]; TRUSTED{ViewerOps.RegisterViewerClass[$PsuedoCursor, psuedoCursor]}; -- plug in to Viewers END. Michael Plass, September 15, 1982 12:15 pm: Increased waitTime from 50ms to 100 ms. Michael Plass, November 2, 1982 10:48 am. CEDARized.