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. ΄ColorTrixMiscImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Bloomenthal, February 12, 1987 11:54:05 pm PST Color Trix Mouse Watching Color Trix Text Κί˜šœ™Jšœ Οmœ1™Lšœ žœžœžœ˜%š žœžœžœ$žœžœž˜Hšžœžœ˜#šžœ˜Jšžœ˜Jšžœ˜—Jšžœ žœžœ˜1Jšžœ˜J˜—J˜Jšžœ˜—šœ˜J˜——š œžœžœ˜%Jšœ žœ˜Jšœ˜Jšœ˜J˜—š œžœžœ˜)šžœ˜ Jšžœžœžœžœ˜NJšœ˜—šœ˜J˜——š œžœžœ˜(Jšœžœ˜Jšœ˜J˜—š &œžœ#˜Oš žœžœžœ$žœžœž˜HJšžœžœ2˜UJšžœ˜—J˜J˜—š &œžœ˜Cš žœžœžœ$žœžœž˜HJšžœžœ.˜PJšžœ˜—J˜J˜—š œžœžœ˜'J˜Jšœžœžœ˜Jšœ˜J˜ Jšœ=˜=J˜PJšœQžœ˜VJ˜Jšœ%˜%Jšœžœ˜J˜7Jšœ%˜%J˜šžœž˜šžœžœ˜Jšžœžœ)žœžœ˜9Jšœ7˜7JšœJ˜JJšœžœ˜J˜—J˜Lšžœ"žœ˜*šžœ žœž˜Jš œ žœ žœžœžœ˜MJš œ žœ žœžœžœ˜LJšžœ˜—šžœžœ˜J˜šžœ žœž˜šœ˜Jšœ˜Jšœ0˜0Jšœ?˜?J˜—Jšžœ˜—Jšœžœžœžœ ˜PJšœ2˜2J˜—J˜—Jšžœ˜J˜—J˜+J˜J˜—Jš œžœ žœžœ˜U—šΟl™Jšœžœ˜Jšœžœ˜Jšžœžœžœ˜J˜š œžœžœ˜"Jš œžœ#žœžœžœ˜KJšžœ žœ˜šœ žœ ž˜Jš žœžœžœžœžœ ˜E—J˜7Jšœ*˜*J˜9Jšœžœ.˜SJšžœžœžœžœ ˜/Jšžœ žœžœ*˜=JšœU˜UJ˜Jšœ:˜:J˜J˜—š   œžœžœžœžœ#žœ˜XJš žœ žœžœ*žœžœžœ˜SJšžœ žœžœ!˜4J˜UJ˜J˜——šžœ˜J˜——…—δw