<> <> <> <> <> <<>> DIRECTORY Imager USING [Context], ImagerOps USING [Bitmap, BitmapRep, ImagerFromGraphics, MaskBitmap], Process USING [Detach, InitializeCondition, MsecToTicks, Ticks], PseudoCursors USING [PseudoCursor], Terminal USING [BWCursorBitmap], ViewerClasses USING [PaintProc, Viewer, ViewerClass, ViewerClassRec], ViewerOps USING [CreateViewer, PaintViewer, RegisterViewerClass]; PseudoCursorsImpl: CEDAR MONITOR IMPORTS ImagerOps, Process, ViewerOps EXPORTS PseudoCursors = BEGIN PseudoCursor: TYPE = PseudoCursors.PseudoCursor; DataRec: TYPE = RECORD [ bits: REF Terminal.BWCursorBitmap, bitMap: ImagerOps.Bitmap, 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[Terminal.BWCursorBitmap]; TRUSTED { data.bitMap _ NEW[ImagerOps.BitmapRep _ [ref: data.bits, base: LOOPHOLE[data.bits], wordsPerLine: 1, w: 16, h: 16, x: 0, y: 0, ox: 0, oy: 0]] }; 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 Terminal.BWCursorBitmap] = BEGIN ENABLE UNWIND => {}; d: REF DataRec _ NARROW[pseudoCursor.data]; IF bits=NIL THEN d.bits^ _ ALL[0] ELSE 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 imager: Imager.Context ~ ImagerOps.ImagerFromGraphics[context]; data: REF DataRec ~ NARROW[self.data]; ImagerOps.MaskBitmap[imager, 0, 16, data.bitMap]; END; psuedoCursor: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec _ [ paint: PseudoCursorPaint, tipTable: NIL ]]; 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.