PseudoCursorsImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Michael Plass, November 2, 1982 10:48 am
Last Edited by: Beach, May 24, 1983 9:12 am
Doug Wyatt, April 15, 1985 5:43:13 pm PST
DIRECTORY
ImagerBackdoor USING [DrawBits],
Process USING [Detach, InitializeCondition, MsecToTicks, Ticks],
PseudoCursors USING [PseudoCursor],
TerminalDefs USING [Cursor],
ViewerClasses USING [PaintProc, Viewer, ViewerClass, ViewerClassRec],
ViewerOps USING [CreateViewer, PaintViewer, RegisterViewerClass];
PseudoCursorsImpl: CEDAR MONITOR
IMPORTS ImagerBackdoor, Process, ViewerOps
EXPORTS PseudoCursors
= BEGIN
PseudoCursor: TYPE = PseudoCursors.PseudoCursor;
DataRec: TYPE = RECORD [
bits: REF TerminalDefs.Cursor,
newData: BOOLFALSE,
paint: PROCESSNIL,
timeout: CONDITION
];
waitTime: Process.Ticks ← Process.MsecToTicks[100];
Create: PUBLIC PROC [parent: ViewerClasses.Viewer, x, y: INTEGER ← 0]
RETURNS
[PseudoCursor] = {
data: REF DataRec ← NEW[DataRec];
data.bits ← NEW[TerminalDefs.Cursor];
TRUSTED { Process.InitializeCondition[@data.timeout, waitTime] };
RETURN[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 TerminalDefs.Cursor] = {
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]] };
};
PaintProcess: ENTRY PROC [pseudoCursor: PseudoCursor] = {
ENABLE UNWIND => {};
d: REF DataRec ← NARROW[pseudoCursor.data];
WHILE d.newData DO
d.newData ← FALSE;
ViewerOps.PaintViewer[pseudoCursor, client, FALSE, $Update];
WAIT d.timeout;
ENDLOOP;
d.paint ← NIL;
};
PseudoCursorPaint: ViewerClasses.PaintProc = {
d: REF DataRec ~ NARROW[self.data];
ImagerBackdoor.DrawBits[context: context, base: LOOPHOLE[d.bits], wordsPerLine: 1,
sMin: 0, fMin: 0, sSize: 16, fSize: 16, tx: 0, ty: 16];
};
psuedoCursor: ViewerClasses.ViewerClass ← NEW[ViewerClasses.ViewerClassRec ← [
paint: PseudoCursorPaint,
tipTable: NIL
]];
ViewerOps.RegisterViewerClass[$PsuedoCursor, psuedoCursor]; -- plug in to Viewers
END.