DIRECTORY Carets, Imager USING [Context, Create, MaskBits, SetColor], Process USING [Detach, MsecToTicks, SetTimeout], ViewerClasses USING [Viewer], ViewerOps USING [UserToScreenCoords]; CaretsImpl: CEDAR MONITOR IMPORTS Imager, Process, ViewerOps EXPORTS Carets = BEGIN OPEN Carets; StartCaret: PUBLIC ENTRY PROC [viewer: ViewerClasses.Viewer, x, y: INTEGER, id: CaretId] = BEGIN ENABLE UNWIND => NULL; IF viewer = NIL THEN RETURN; InvertCaret[id, TRUE]; -- kill off old visible caret IF x =-10000 AND y =-10000 THEN SELECT id FROM -- special reset for ViewerBLTImpl to move viewers primary => {x _ pViewerX; y _ pViewerY}; secondary => {x _ sViewerX; y _ sViewerY}; ENDCASE; x _ MIN[x, viewer.cw]; IF id=primary THEN { pViewerX _ x; pViewerY _ y; [pCaretX, pCaretY] _ViewerOps.UserToScreenCoords[pCaretViewer _ viewer, x, y]} ELSE { sViewerX _ x; sViewerY _ y; [sCaretX, sCaretY] _ ViewerOps.UserToScreenCoords[sCaretViewer _ viewer, x, y]}; END; StopCaret: PUBLIC ENTRY PROC [id: CaretId] = BEGIN ENABLE UNWIND => NULL; InvertCaret[id, TRUE]; END; caretHoldCount: INTEGER _ 0; -- number of requests pending to suspend caret SuspendCarets: PUBLIC ENTRY PROC = BEGIN ENABLE UNWIND => NULL; IF pDark AND pCaretViewer#NIL THEN InvertCaret[primary]; IF sDark AND sCaretViewer#NIL THEN InvertCaret[secondary]; caretHoldCount _ caretHoldCount+1; END; ResumeCarets: PUBLIC ENTRY PROC = BEGIN ENABLE UNWIND => NULL; caretHoldCount _ MAX[0, caretHoldCount-1]; END; InvertCaret: INTERNAL PROC [id: CaretId, kill: BOOL _ FALSE] = BEGIN context: Imager.Context _ screen; IF pCaretY IN [-caretH..16000) THEN { IF id=primary THEN BEGIN IF (~kill OR pDark) AND pCaretViewer#NIL THEN BEGIN IF pCaretViewer.column=color THEN BEGIN IF colorScreen=NIL THEN InitColorCaret; context _ colorScreen; END; TRUSTED {Imager.MaskBits[context, @pCaret, 1, [pCaretX-caretXOffset,pCaretY-caretH,caretW,caretH], [pCaretX-caretXOffset,pCaretY-caretH,caretW,caretH]]}; pDark _ ~pDark; END; IF kill THEN pCaretViewer _ NIL; END ELSE BEGIN IF (~kill OR sDark) AND sCaretViewer#NIL THEN BEGIN IF sCaretViewer.column=color THEN BEGIN IF colorScreen=NIL THEN InitColorCaret; context _ colorScreen; END; TRUSTED {Imager.MaskBits[context, @sCaret, 1, [sCaretX-caretXOffset,sCaretY-caretH,caretW,caretH], [sCaretX-caretXOffset,sCaretY-caretH,caretW,caretH]]}; sDark _ ~sDark; END; IF kill THEN sCaretViewer _ NIL; END; }; END; CaretProcess: ENTRY PROC = BEGIN ENABLE UNWIND => NULL; TRUSTED {Process.SetTimeout[@timeOut, Process.MsecToTicks[500]]}; DO WAIT timeOut; IF caretHoldCount#0 THEN LOOP; -- suspended IF pCaretViewer#NIL THEN InvertCaret[primary]; IF sCaretViewer#NIL THEN InvertCaret[secondary]; ENDLOOP; END; InitColorCaret: PROC = BEGIN colorScreen _ Imager.Create[$ColorDisplay]; [] _ Imager.SetColor[colorScreen, $XOR]; END; timeOut: CONDITION; caretH: INTEGER = 6; caretW: INTEGER = 16; caretXOffset: CARDINAL = 8; CaretArray : TYPE = ARRAY [0..caretH) OF UNSPECIFIED; pCaretX, pCaretY, sCaretX, sCaretY: INTEGER; pViewerX, pViewerY, sViewerX, sViewerY: INTEGER; pDark, sDark: BOOLEAN _ FALSE; pCaretViewer, sCaretViewer: PUBLIC ViewerClasses.Viewer; screen: Imager.Context _ Imager.Create[$LFDisplay]; colorScreen: Imager.Context; pCaret: CaretArray _ [ 000400B, 001600B, 003700B, 003300B, 006140B, 004040B ]; sCaret: CaretArray _ [ 000400B, 001200B, 002100B, 002100B, 004040B, 004040B ]; [] _ Imager.SetColor[screen, $XOR]; TRUSTED {Process.Detach[FORK CaretProcess]}; -- start the blinker END. þCaretsImpl.mesa; Written by S. McGregor Edited by McGregor on August 4, 1983 12:53 pm Last Edited by: Maxwell, May 19, 1983 1:24 pm Michael Plass, August 16, 1983 9:12 am Screw the NOTIFY; CaretProcess will eventually wake up and notice new caret Êb– "cedar" style˜JšÏc'™'Jš-™-J™-J™&J˜šÏk ˜ J˜Jšœžœ'˜3Jšœžœ#˜0Jšœžœ ˜Jšœ žœ˜%J˜—Jšœ ž ˜J˜Jšžœ˜"Jšžœ ˜J˜Jšžœžœ˜J˜š Ïn œžœžœžœ&žœž˜`Jšžœžœžœ˜Jšžœ žœžœžœ˜Jšœžœ˜4J˜š žœ žœ žœžœžœ2˜aJšœ(˜(Jšœ*˜*Jšžœ˜J˜—Jšœžœ˜šžœ žœ˜Jšœ˜JšœO˜O—šžœ˜Jšœ˜JšœP˜PJ˜—JšK™KJšžœ˜J˜—š Ÿ œžœžœžœž˜2Jšžœžœžœ˜Jšœžœ˜Jšžœ˜J˜—Jšœžœ.˜KJ˜š Ÿ œžœžœžœž˜(Jšžœžœžœ˜Jšžœžœžœžœ˜8Jšžœžœžœžœ˜:J˜"Jšžœ˜J˜—š Ÿ œžœžœžœž˜'Jšžœžœžœ˜Jšœžœ˜*Jšžœ˜J˜—š Ÿ œžœžœžœžœž˜DJ˜!šžœ žœžœ˜%šžœ žœž˜š žœžœžœžœžœž˜3šžœžœž˜'Jšžœ žœžœ˜'J˜Jšžœ˜—Jšžœ’˜™J˜Jšžœ˜—Jšžœžœžœ˜ Jšž˜—šžœž˜ š žœžœžœžœžœž˜3šžœžœž˜'Jšžœ žœžœ˜'J˜Jšžœ˜—Jšžœ’˜™J˜Jšžœ˜—Jšžœžœžœ˜ Jšžœ˜—J˜—Jšžœ˜J˜—šŸ œžœžœž˜ Jšžœžœžœ˜Jšžœ:˜Ašžœžœ ˜Jšžœžœžœ ˜+Jšžœžœžœ˜.Jšžœžœžœ˜0Jšžœ˜—Jšžœ˜J˜—šŸœžœž˜J˜+J˜(Jšžœ˜J˜—Jšœ ž œ˜J˜Jšœžœ˜Jšœžœ˜Jšœžœ˜J˜Jš œ žœžœ žœž œ˜5J˜Jšœ$žœ˜,Jšœ(žœ˜0Jšœžœžœ˜Jšœžœ˜8J˜J˜3J˜J˜šœ˜J˜J˜J˜J˜J˜J˜J˜J˜—šœ˜J˜J˜J˜J˜J˜J˜J˜J˜—J˜#J˜Jšžœžœ˜AJ˜Jšžœ˜J˜J˜—…— ®