<> <> <> <> <> <> <> <> 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[]; }.