-- Copyright (C) 1982, 1984 by Xerox Corporation. All rights reserved.
-- WindowImplD.mesa - last edited by
-- Daniels, 18-Jul-84 16:41:19
-- Bruce, 15-Oct-82 20:50:46
DIRECTORY
BitBlt USING [BBptr],
Display USING [Brick, Gray],
RecOps USING [Convert, RecList],
SpecialDisplay USING [
Handle, LineStyle, LineStyleObject, Special, SpecialContext],
SpecialWindow USING [],
UserTerminal USING [BitmapIsDisconnected, GetBitBltTable],
Window USING [Box, ValidateTree],
WindowOps USING [
bbPtr, Handle, InvalidateTree, lock, Object, WhitenRecList];
WindowImplD: MONITOR LOCKS WindowOps.lock
IMPORTS Display, RecOps, UserTerminal, Window, WindowOps
EXPORTS SpecialDisplay, SpecialWindow, Window, WindowOps =
BEGIN
Handle: TYPE = LONG POINTER TO Object;
Object: PUBLIC TYPE = WindowOps.Object;
lock: PUBLIC MONITORLOCK;
rootWindow: PUBLIC Handle ← NIL;
defaultContext: PUBLIC SpecialDisplay.Special ← @mySpecial;
mySpecial: SpecialDisplay.SpecialContext ← [
bmAddress: NIL, wpl: TRASH, bpl: TRASH, alloc: NIL, free: NIL];
solid: PUBLIC SpecialDisplay.LineStyle ← @mySolid;
mySolid: SpecialDisplay.LineStyleObject ← [
widths: [NAT.LAST, 0, 0, 0, 0, 0], thickness: 1];
bitmapAddress: PUBLIC LONG ORDERED POINTER ← NIL;
bitmapHeight: PUBLIC CARDINAL;
rootGray: ARRAY [0..4) OF CARDINAL;
Recalculate: PUBLIC PROC [Handle] = {}; -- boo hiss!!
DefineRoot: PUBLIC PROC [
window: Handle, gray: ARRAY [0..4) OF CARDINAL, bitmapExists: BOOLEAN] = {
haveBitmap: BOOLEAN ← bitmapExists;
LockedDefine: ENTRY PROC = {
ENABLE UNWIND => NULL;
IF bitmapExists THEN {
bbt: BitBlt.BBptr ← WindowOps.bbPtr;
bbt↑ ← UserTerminal.GetBitBltTable[
! UserTerminal.BitmapIsDisconnected => {
bitmapExists ← FALSE; CONTINUE}]};
IF bitmapExists THEN {
recList: RecOps.RecList;
mySpecial.bmAddress ← bitmapAddress ← LOOPHOLE[WindowOps.bbPtr.dst.word];
mySpecial.bpl ← CARDINAL[WindowOps.bbPtr.dstBpl];
mySpecial.wpl ← mySpecial.bpl/16;
bitmapHeight ← WindowOps.bbPtr.height;
rootWindow ← window;
rootWindow.beingDisplayed ← FALSE;
rootWindow.clearingRequired ← FALSE;
rootWindow.inTree ← TRUE;
rootWindow.parent ← NIL;
rootWindow.place ← [0, 0];
rootWindow.display ← DisplayRootWindow;
rootWindow.invalid ← NIL;
rootWindow.badPhosphor ← NIL;
rootGray ← gray;
WindowOps.WhitenRecList[recList ← RecOps.Convert[rootWindow]];
WindowOps.InvalidateTree[rootWindow, rootWindow.child, recList]}
ELSE {
rootWindow ← window;
rootWindow.parent ← NIL;
rootWindow.display ← NIL;
rootWindow.inTree ← FALSE}};
LockedDefine[];
IF bitmapExists THEN Window.ValidateTree[rootWindow]};
DisplayRootWindow: PROC [window: Handle] = {
gray: Display.Brick = DESCRIPTOR[rootGray];
Display.Gray[window, window.box, gray]};
END.