ColorDisplayCommand.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Created from old ColorDisplay by Mik Lamming and Ken Pier
Last Edited by: Nickell, June 13, 1985 11:14:46 pm PDT
Last Edited by: Beach, August 17, 1984 5:41:30 pm PDT
Rick Beach, December 9, 1985 11:05:03 am PST
Tim Diebert: October 24, 1985 4:35:15 pm PDT
Tim Diebert May 17, 1985 3:54:28 pm PDT
DIRECTORY
Ascii USING [Lower],
Buttons USING [Button, ButtonProc, Create, SetDisplayStyle],
ColorDisplay USING [CDNotifyProc, CDRegistration, GetColorDisplayProfile, GetColorDisplayStatus, RegisterCDNotifyProc, SetColorDisplayStatus, SleepColorDisplay, UnregisterCDNotifyProc],
Commander USING [CommandProc, Register],
Containers USING [Container, Create],
IO USING [card, EndOfStream, GetTokenRope, IDProc, PutF, RIS, rope, STREAM],
Rope USING [Equal, Fetch, Length, ROPE, Translate, TranslatorType],
ViewerOps USING [OpenIcon, SetOpenHeight];
ColorDisplayCommand: CEDAR PROGRAM
IMPORTS Ascii, Buttons, ColorDisplay, Commander, Containers, IO, Rope, ViewerOps
~ {
FiddleWithDisplay: Commander.CommandProc ~ {
MyLower:Rope.TranslatorType = BEGIN RETURN[Ascii.Lower[old]]; END;
myOn, myGray: BOOLEAN;
myBpp: CARDINAL;
myOnLeft: BOOLEAN;
myMonType: Rope.ROPE;
noParams: BOOLEANTRUE;
s: IO.STREAMIO.RIS[Rope.Translate[base:cmd.commandLine, translator:MyLower]];
[myOn, myOnLeft, myGray, myBpp, myMonType] ← ColorDisplay.GetColorDisplayStatus[];
DO
f:Rope.ROPEIO.GetTokenRope[s, IO.IDProc ! IO.EndOfStream => EXIT].token;
noParams ← FALSE;
SELECT Rope.Fetch[f, 0] FROM
'0 => myOn ← FALSE;
'1 =>
IF Rope.Equal[f, "1024x768"] THEN { myMonType ← "1024x768"; myOn ← TRUE }
ELSE IF Rope.Length[f]=1 THEN {myBpp ← 1; myOn ← TRUE; }
ELSE {
IO.PutF[cmd.err, "Option %g that begins with a 1 has to be 1024x768 or 1 exactly.\n", IO.rope[f]];
RETURN;
};
'2 =>
IF Rope.Equal[f, "24"] THEN { myOn ← TRUE; myBpp ← 24 }
ELSE IF Rope.Length[f]=1 THEN { myBpp ← 2; myOn ← TRUE }
ELSE {
IO.PutF[cmd.err, "Can't do %g bpp\n", IO.rope[f]];
RETURN;
};
'4 => { myBpp ← 4; myOn ← TRUE };
'6 => {
IF Rope.Equal[f, "640x480"] THEN { myMonType ← "640x480"; myOn ← TRUE }
ELSE {
IO.PutF[cmd.err, "%g is an invalid key\n", IO.rope[f]];
RETURN;
};
};
'8 => { myBpp ← 8; myOn ← TRUE };
'l => { myOnLeft ← TRUE; myOn ← TRUE };
'r => { myOnLeft ← FALSE; myOn ← TRUE };
'd => {
IF Rope.Equal[f, "default"] THEN [myOn, myOnLeft, myBpp, myMonType] ← ColorDisplay.GetColorDisplayProfile[]
ELSE {myGray ← FALSE; myOn ← TRUE };
};
'o =>
IF Rope.Equal[f, "on"] THEN myOn ← TRUE
ELSE IF Rope.Equal[f, "off"] THEN myOn ← FALSE
ELSE {
IO.PutF[cmd.err, "%g is an invalid key\n", IO.rope[f]];
RETURN;
};
'g => { myGray ← TRUE; myOn ← TRUE };
'? => IO.PutF[cmd.err, "%g, %g bpp, %g, %g, %g\n",
IO.rope[IF myOn THEN "on" ELSE "off"],
IO.card[myBpp],
IO.rope[IF myOnLeft THEN "left" ELSE "right"],
IO.rope[myMonType],
IO.rope[(IF myGray THEN "Gray" ELSE "Dither")]];
ENDCASE => {
IO.PutF[cmd.err, "%g is an invalid key\n", IO.rope[f]];
RETURN[];
};
ENDLOOP;
IF noParams THEN myOn ← ~myOn;
ColorDisplay.SetColorDisplayStatus[myOn, myOnLeft, myGray, myBpp, myMonType];
};
ButtonSet: TYPE ~ RECORD [
on, off, left, right, lowres, highres, c1, c2, c4, c8, c24, gray, dither: Buttons.Button ← NIL,
reg: ColorDisplay.CDRegistration ← NIL,
cdt: Containers.Container ← NIL
];
CreateColorDisplayTool: PROC ~ {
bs: REF ButtonSet ~ NEW[ButtonSet];
prev: Buttons.Button;
hMargin: INT ~ -1;
hSeparator: INT ~ 10;
vMargin: INT ~ 5;
vHeight: INT ~ 10;
thisX, thisY: INT;
CreateCDTButton: PROC [name: Rope.ROPE, proc: Buttons.ButtonProc, extraOffset: INT ← 0] RETURNS [button: Buttons.Button] ~ {
button ← prev ← Buttons.Create[
info: [
name: name,
wx: thisX,
wy: thisY,
parent: bs.cdt,
border: TRUE
],
proc: proc
];
thisX ← thisX + prev.ww + hMargin + extraOffset;
};
bs.cdt ← Containers.Create[
info: [
name: "ColorDisplayTool",
column: right,
scrollable: FALSE
]
];
thisX ← hMargin+hSeparator; thisY ← vMargin;
The various buttons
bs.on ← CreateCDTButton["On", CDTOn];  --On Button
bs.off ← CreateCDTButton["Off", CDTOff, hSeparator]; --Off Button
bs.c1 ← CreateCDTButton["1 ", CDT1];   --1 Button
bs.c2 ← CreateCDTButton["2 ", CDT2];   --2 Button
bs.c4 ← CreateCDTButton["4 ", CDT4];   --4 Button
bs.c8 ← CreateCDTButton["8 ", CDT8];   --8 Button
bs.c24 ← CreateCDTButton["24 ", CDT24, hSeparator]; --24 Button
bs.left ← CreateCDTButton["Left", CDTLeft];  --Left Button
bs.right ← CreateCDTButton["Right", CDTRight, hSeparator]; --Right Button
bs.lowres ← CreateCDTButton["640x480", CDTLowRes]; --640x480 Button
bs.highres ← CreateCDTButton["1024x768", CDTHighRes, hSeparator]; --1024x768 Button
bs.gray ← CreateCDTButton["Gray", CDTGray];
bs.dither ← CreateCDTButton["Dither", CDTDither, hSeparator];
bs.reg ← ColorDisplay.RegisterCDNotifyProc[MonitorButtons, bs];
Set the height of the viewer as a whole
ViewerOps.SetOpenHeight[bs.cdt, thisY + vHeight + 2*vMargin];
ViewerOps.OpenIcon[icon: bs.cdt, bottom: FALSE];
};
shouldBeLit: ARRAY BOOLEAN OF ATOM ~ [$BlackOnWhite, $WhiteOnBlack];
MonitorButtons: ColorDisplay.CDNotifyProc ~ {
Repaint: PROC [button: Buttons.Button, condition: BOOLEAN] ~ INLINE {
OPEN Buttons;
Buttons.SetDisplayStyle[button, shouldBeLit[condition]];
};
This proc toggles the color of the buttons to show currect state of display
bs: REF ButtonSet ~ NARROW[clientData];
IF bs.cdt=NIL OR bs.cdt.destroyed THEN { --No point blowing ourselves to smithereens.
ColorDisplay.UnregisterCDNotifyProc[bs.reg];
RETURN;
};
Repaint[bs.on, new.on];
Repaint[bs.off, ~new.on];
Repaint[bs.c1, new.bpp=1];
Repaint[bs.c2, new.bpp=2];
Repaint[bs.c4, new.bpp=4];
Repaint[bs.c8, new.bpp=8];
Repaint[bs.c24, new.bpp=24];
Repaint[bs.left, new.onLeft];
Repaint[bs.right, ~new.onLeft];
Repaint[bs.lowres, new.monitorType.Equal["640x480"]];
Repaint[bs.highres, ~new.monitorType.Equal["640x480"]];
Repaint[bs.gray, new.gray];
Repaint[bs.dither, ~new.gray];
};
CDTOn: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[on: TRUE]};
CDTOff: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[on: FALSE]};
CDTLeft: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[onLeft: TRUE]};
CDTRight: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[onLeft: FALSE]};
CDTLowRes: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[monitorType: "640x480"]};
CDTHighRes: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[monitorType: "1024x768"]};
CDT1: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[on: TRUE, bpp: 1]};
CDT2: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[on: TRUE, bpp: 2]};
CDT4: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[on: TRUE, bpp: 4]};
CDT8: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[on: TRUE, bpp: 8]};
CDT24: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[on: TRUE, bpp: 24]};
CDTGray: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[gray: TRUE]};
CDTDither: Buttons.ButtonProc ~ {ColorDisplay.SetColorDisplayStatus[gray: FALSE]};
BugColor: Buttons.ButtonProc ~ {
SELECT mouseButton FROM
red => ColorDisplay.SetColorDisplayStatus[on: ~ColorDisplay.GetColorDisplayStatus[].on];
yellow => TRUSTED {ColorDisplay.SleepColorDisplay[300]};
blue => CreateColorDisplayTool[];
ENDCASE;
};
Init: PROC[] RETURNS[] = BEGIN
Register the program with the commander and read user profile
Commander.Register[key:"ColorDisplay", proc:FiddleWithDisplay, doc:"Configure color monitor"];
Establish the 'color' button up at the top
[] ← Buttons.Create[
info: [name: "Color"],
proc: BugColor,
fork: FALSE
];
END;
Init[];
}.