DIRECTORY Basics USING [BITSHIFT, LongMult, bitsPerWord], CD, CDColors, CDVPrivate, CDVScale, RuntimeError, PrincOps, PrincOpsUtils, Terminal, ViewerClasses; CDVCursorImpl: CEDAR MONITOR IMPORTS Basics, CDVPrivate, RuntimeError, PrincOpsUtils, Terminal EXPORTS CDVPrivate = BEGIN VRef: TYPE = CDVPrivate.VRef; CursorRec: TYPE = RECORD [mode: REF, doit: CDVPrivate.CursorModeProc]; CursorList: TYPE = LIST OF CursorRec; cursorList: CursorList _ LIST[CursorRec[mode: NIL, doit: UseDefaultCursor]]; virtual: Terminal.Virtual = Terminal.Current[]; blackBrick: REF CDColors.Brick = NEW[CDColors.Brick_ALL[LAST[CARDINAL]]]; ImplementACursor: PUBLIC ENTRY PROC[mode: ATOM, proc: CDVPrivate.CursorModeProc] = BEGIN FOR list: CursorList _ cursorList, list.rest DO IF list.first.mode=mode THEN {list.first.doit _ proc; EXIT} ELSE IF list.rest=NIL THEN {list.rest _ LIST[CursorRec[mode: mode, doit: proc]]; EXIT} ENDLOOP END; SetCursorMode: PUBLIC PROC[me: VRef, mode: REF] = BEGIN FOR list: CursorList _ cursorList, list.rest WHILE list#NIL DO IF list.first.mode=mode THEN { list.first.doit[me, mode ! RuntimeError.UNCAUGHT => CONTINUE]; RETURN } ENDLOOP; cursorList.first.doit[me, NIL ! RuntimeError.UNCAUGHT => CONTINUE]; END; DefaultCursor: PUBLIC PROC[me: VRef] = BEGIN END; UseDefaultCursor: CDVPrivate.CursorModeProc = { me.designRec.outlineProcLC _ DefaultCursor }; InvertArea: PUBLIC PROC[me: VRef, x1, y1, x2, y2: INT] = TRUSTED BEGIN ENABLE RuntimeError.UNCAUGHT => { IF CDVPrivate.catchAnyWhichDeadlock THEN GOTO oops ELSE REJECT; }; xBit: CARDINAL; xc1: CARDINAL _ MIN[MAX[x1, 0], LONG[me.viewer.cw-2]]; yc1: CARDINAL _ MIN[MAX[y1, 1], LONG[me.viewer.ch-1]]; xc2: CARDINAL _ MIN[MAX[x2, 0], LONG[me.viewer.cw-2]]; yc2: CARDINAL _ MIN[MAX[y2, 1], LONG[me.viewer.ch-1]]; IF xc1>xc2 THEN {t: CARDINAL=xc1; xc1_xc2; xc2_t}; IF yc1>yc2 THEN {t: CARDINAL=yc1; yc1_yc2; yc2_t}; me.xBBptr.width _ Basics.BITSHIFT[(xc2+1-xc1), me.logbpp]; me.xBBptr.height _ (yc2+1-yc1); xBit _ Basics.BITSHIFT[(xc1+me.vx), me.logbpp]; yc1 _ me.vy-yc2; me.xBBptr.dst _ [ me.screen + Basics.LongMult[yc1, me.scWidthWords] + LONG[(xBit/Basics.bitsPerWord)],, xBit MOD Basics.bitsPerWord ]; me.xBBptr.flags.dstFunc _ xor; me.xBBptr.src _ [LOOPHOLE[blackBrick, LONG POINTER],,0]; me.xBBptr.srcDesc _ PrincOps.SrcDesc[gray[PrincOps.GrayParm[ yOffset: 0, widthMinusOne: 0, --words heightMinusOne: 0 --lines ]]]; IF me.display=bw THEN PrincOpsUtils.BITBLT[me.xBBptr] ELSE { Blit: PROC [] = TRUSTED { PrincOpsUtils.BITBLT[me.xBBptr]; }; Terminal.ModifyColorFrame[vt: virtual, action: Blit, xmin: xc1+me.vx, ymin: yc1 , xmax: xc2+me.vx+1, ymax: yc1+me.xBBptr.height ]; }; EXITS oops => NULL; END; END. ΐCDVCursorImpl.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. by Christian Jacobi, September 6, 1984 9:29:18 am PDT last edited by Christian Jacobi, February 11, 1986 9:37:47 am PST --never NIL; used by ImplementACursor --invert the order: efficiency hack: the first installed cursor is found the fastest --cursorList is never NIL --error catch; cursorList is never NIL --probably this will be overwritten by a client ΚŒ˜codešœ™Kšœ Οmœ1™šžœžœ˜Kšœ(žœžœ˜>Kšž˜K˜—Kšžœ˜—Kšœ&™&Kšœžœžœžœ˜CKšžœ˜—K˜š  œžœžœ ˜'Kšž˜Kšœ/™/Kšžœ˜—K˜šΟbœ˜/Kšœ*˜*Kšœ˜—K˜š  œžœžœžœ˜9Kšžœžœ˜šžœžœ˜!Kš žœ"žœžœžœžœ˜@K˜—Kšœžœ˜Kš œžœžœžœ žœ˜6Kš œžœžœžœ žœ˜6Kš œžœžœžœ žœ˜6Kš œžœžœžœ žœ˜6Kšžœ žœžœ˜2Kšžœ žœžœ˜2Kšœžœ˜:Kšœ˜Kšœžœ˜/Kšœ˜šœ˜˜ Kšœžœ˜'Kšœžœ˜#—Kšœžœ˜K˜—Kšœ ˜ Kšœžœ žœžœ˜8šœ<˜