XlPerDepthImpl.mesa
Copyright Ó 1992 by Xerox Corporation. All rights reserved.
Created by Christian Jacobi, October 7, 1992 8:39:37 pm PDT
Christian Jacobi, October 8, 1992 8:52 am PDT
A little X window utility to manage per screen depth data.
This is useful for widgets which want to share certain information as well as for cases where real per screen depth data is needed.
DIRECTORY PropList, Xl, XlPerDepth;
XlPerDepthImpl: CEDAR MONITOR
IMPORTS PropList, Xl
EXPORTS XlPerDepth ~
BEGIN OPEN XlPerDepth;
Comments on impl-types in XlPerDepth:
HandleRep.last is never NIL.
HandleRep.implData is property list simply so we have a monitoring scheme for NIL ScreenDepths.
dummy: REF PrivateRec ~ NEW[PrivateRec ¬ [sd: NEW[Xl.ScreenDepthRec], sdData: NIL]];
cDiedFilter: Xl.EventFilter ~ Xl.CreateEventFilter[finalEvent];
sharedTQ: Xl.TQ ¬ Xl.CreateTQ[];
ConnectionDied: Xl.EventProcType = {
--Remove properties to break circular refs disabling finalization
WITH event SELECT FROM
fe: Xl.FinalEvent => IF ~fe.refCountTransition THEN {
h: Handle ~ NARROW[clientData];
FOR i: NAT IN [0..Xl.ScreenDepthCount[event.connection]) DO
sd: Xl.ScreenDepth ¬ Xl.NthScreenDepth[event.connection, i];
[] ¬ PropList.RemProp[sd.properties, h];
IF h.last.sd=sd THEN h.last ¬ dummy;
ENDLOOP
};
ENDCASE => {};
};
Init: PropList.InitializeProcType = {
h: Handle ~ NARROW[key];
sd: Xl.ScreenDepth ~ NARROW[data];
sdData: REF ~ h.init[sd, h.initData];
pr: REF PrivateRec ~ NEW[PrivateRec ¬ [sd: sd, sdData: sdData]];
Xl.AddDispatch[sd.screen.connection, Xl.nullWindow, NEW[Xl.MatchRep ¬ [proc: ConnectionDied, handles: cDiedFilter, tq: sharedTQ, data: h]]];
RETURN [pr]
};
GetData: PUBLIC PROC [h: Handle, sd: Xl.ScreenDepth] RETURNS [REF] = {
pr: REF READONLY PrivateRec ¬ h.last;
IF pr.sd=sd
THEN RETURN [pr.sdData]
ELSE {
propList: PropList.List ~ IF sd=NIL OR ~Xl.Alive[sd.screen.connection]
THEN PropList.NarrowPropList[h.implData]
ELSE sd.properties;
TRUSTED {
pr ¬ NARROW[PropList.GetPropOrInit[propList, h, Init, LOOPHOLE[sd]].val];
};
h.last ¬ pr;
RETURN [pr.sdData]
};
};
InstallHandle: PUBLIC PROC [init: InitProc, initData: REF ¬ NIL] RETURNS [Handle] = {
RETURN [NEW[HandleRep ¬ [last: dummy, initData: initData, init: init, implData: PropList.NewPropList[]]]]
};
END.