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: BOOLEAN _ TRUE; s: IO.STREAM _ IO.RIS[Rope.Translate[base:cmd.commandLine, translator:MyLower]]; [myOn, myOnLeft, myGray, myBpp, myMonType] _ ColorDisplay.GetColorDisplayStatus[]; DO f:Rope.ROPE _ IO.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; 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]; 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]]; }; 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 Commander.Register[key:"ColorDisplay", proc:FiddleWithDisplay, doc:"Configure color monitor"]; [] _ Buttons.Create[ info: [name: "Color"], proc: BugColor, fork: FALSE ]; END; Init[]; }. xColorDisplayCommand.mesa Copyright c 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 The various buttons Set the height of the viewer as a whole This proc toggles the color of the buttons to show currect state of display Register the program with the commander and read user profile Establish the 'color' button up at the top Κ„˜šœ™Icodešœ Οmœ1™