ColorTrixMiscImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Bloomenthal, February 12, 1987 11:54:05 pm PST
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;
Color Trix Mouse Watching
colorDisplayWatching: BOOLFALSE;
colorDisplayChanged: BOOLFALSE;
registry:     LIST OF ClientRecord ← NIL;
RegisterClient: PUBLIC PROC [clientRecord: ClientRecord, start: BOOLTRUE] ~ {
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: BOOLFALSE;
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 Trix Text
Color:  TYPE ~ Imager.Color;
Context: TYPE ~ Imager.Context;
ROPE:  TYPE ~ Rope.ROPE;
PrintTiogaSelection: PUBLIC PROC [
x, y: NAT, color: Color, context: Context ← NIL, screenStyle: BOOLFALSE]
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.