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: BOOL ← FALSE,
paint: PROCESS ← NIL,
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.