<> <> <> DIRECTORY CedarProcess, ClassIncreek, ColorDisplay, ColorTrixBasics, ColorTrixMap, ColorTrixMisc, Draw2d, Imager, ImagerBackdoor, Process, Real, Rope, TerminalDefs, TextNode, TiogaAccess, TiogaImager; ColorTrixMiscImpl: CEDAR MONITOR IMPORTS CedarProcess, ClassIncreek, ColorDisplay, ColorTrixBasics, ColorTrixMap, Draw2d, Imager, ImagerBackdoor, Process, Real, TiogaAccess, TiogaImager EXPORTS ColorTrixMisc ~ BEGIN OPEN ColorTrixMisc; <> colorDisplayWatching: BOOL _ FALSE; colorDisplayChanged: BOOL _ FALSE; registry: LIST OF ClientRecord _ NIL; RegisterClient: PUBLIC PROC [clientRecord: ClientRecord, start: BOOL _ TRUE] ~ { FOR list: LIST OF ClientRecord _ registry, list.rest WHILE list # NIL DO IF list.first = clientRecord THEN EXIT; ENDLOOP; registry _ CONS[clientRecord, registry]; IF start THEN StartColorDisplayWatcher[]; }; UnRegisterClient: PUBLIC PROC [clientRecord: ClientRecord] ~ { previous: LIST OF ClientRecord _ NIL; FOR list: LIST OF ClientRecord _ registry, list.rest WHILE list # NIL DO IF list.first = clientRecord THEN { IF list = registry THEN registry _ list.rest ELSE previous.rest _ list.rest; IF registry = NIL THEN StopColorDisplayWatcher[]; EXIT; }; previous _ list; ENDLOOP; }; UnRegisterAllClients: PUBLIC PROC ~ { registry _ NIL; StopColorDisplayWatcher[]; }; StartColorDisplayWatcher: PUBLIC PROC ~ { TRUSTED { IF NOT colorDisplayWatching THEN Process.Detach[FORK DoColorDisplayWatcher[]]; }; }; StopColorDisplayWatcher: PUBLIC PROC ~ { colorDisplayWatching _ FALSE; }; NotifyClientsOfColorDisplayStateChange: PROC [pm: PixelMapMisc, cmap: Cmap] ~ { FOR list: LIST OF ClientRecord _ registry, list.rest WHILE list # NIL DO IF list.first.changeProc # NIL THEN list.first.changeProc[pm, cmap, list.first.data]; ENDLOOP; }; NotifyClientsOfColorDisplayMouseAction: PROC [mouse: MouseInfo] ~ { FOR list: LIST OF ClientRecord _ registry, list.rest WHILE list # NIL DO IF list.first.mouseProc # NIL THEN list.first.mouseProc[mouse, list.first.data]; ENDLOOP; }; DoColorDisplayWatcher: PROC ~ TRUSTED { mouseInfo: MouseInfo; report: BOOL _ FALSE; key: TerminalDefs.KeyName; action: ClassIncreek.ActionBody; increek: ClassIncreek.Increek _ ClassIncreek.NewStdIncreek[]; viewPosition: ClassIncreek.ViewPosition _ ClassIncreek.GetPositionFrom[increek]; cdReg: ColorDisplay.CDRegistration _ ColorDisplay.RegisterCDNotifyProc[CDNotify, NIL]; CedarProcess.SetPriority[background]; colorDisplayWatching _ TRUE; mouseInfo.pm _ ColorTrixBasics.GetColorDisplayPmMisc[]; mouseInfo.cmap _ ColorTrixMap.Read[]; WHILE colorDisplayWatching DO IF colorDisplayChanged THEN { IF NOT ColorDisplay.GetColorDisplayStatus[].on THEN EXIT; mouseInfo.pm _ ColorTrixBasics.GetColorDisplayPmMisc[]; NotifyClientsOfColorDisplayStateChange[mouseInfo.pm, ColorTrixMap.Read[]]; colorDisplayChanged _ FALSE; }; action _ ClassIncreek.GetAction[self: increek, acceptance: clicksAndMotion]; IF viewPosition.mousePosition.color THEN { WITH ac: action SELECT FROM keyDown => IF ac.value IN [Red..Yellow] THEN {key _ ac.value; report _ TRUE}; keyUp => IF ac.value IN [Red..Yellow] THEN {key _ ac.value; report _ FALSE}; ENDCASE; IF report THEN { mouseInfo.state _ held; WITH ac: action SELECT FROM keyDown, deltaMouse => { mouseInfo.state _ down; mouseInfo.x _ viewPosition.mousePosition.mouseX; mouseInfo.y _ mouseInfo.pm.h-viewPosition.mousePosition.mouseY; }; ENDCASE; mouseInfo.button _ SELECT key FROM Red=> left, Yellow=> middle, ENDCASE=> right; NotifyClientsOfColorDisplayMouseAction[mouseInfo]; }; }; ENDLOOP; ColorDisplay.UnregisterCDNotifyProc[cdReg]; }; CDNotify: ColorDisplay.CDNotifyProc ~ {IF old # new THEN colorDisplayChanged _ TRUE}; <> Color: TYPE ~ Imager.Color; Context: TYPE ~ Imager.Context; ROPE: TYPE ~ Rope.ROPE; PrintTiogaSelection: PUBLIC PROC [ x, y: NAT, color: Color, context: Context _ NIL, screenStyle: BOOL _ FALSE] RETURNS [error: ROPE] ~ { c: Context ~ IF context = NIL THEN ColorTrixBasics.InitCd[smooth, TRUE, FALSE, FALSE] ELSE context; bounds: Imager.Rectangle _ ImagerBackdoor.GetBounds[c]; formattedNode: TiogaImager.FormattedNodes; reader: TiogaAccess.Reader ~ TiogaAccess.FromSelection[]; location: TextNode.Location ~ [NARROW[TiogaAccess.GetNodeRefs[reader].current], 0]; IF location.node = NIL THEN RETURN["Bad Text"]; IF color = NIL THEN color _ ImagerBackdoor.GetColor[context]; formattedNode _ TiogaImager.FormatNodes[location, [bounds.w, bounds.h], screenStyle]; Imager.SetColor[c, color]; TiogaImager.Render[formattedNode.box, c, [x, bounds.h-y]]; }; PrintRope: PUBLIC PROC [rope: ROPE, x, y: NAT, color: Color, context: Context _ NIL] ~ { IF context = NIL THEN context _ ColorTrixBasics.InitCd[smooth, TRUE, FALSE, FALSE]; IF color # NIL THEN Imager.SetColor[context, color]; Draw2d.Label[context, [x, Real.RoundI[ImagerBackdoor.GetBounds[context].h]-y], rope]; }; END.