<> <> <> <> <> <> <> <> <<>> DIRECTORY ColorDisplay, InterminalExtras USING [ColorDisplayOnLeft, SwitchSideOfColorDisplay], List USING [Car, Cdr, Cons], MonitorToolDefs USING [StartMonitor], Rope USING [Equal, ROPE], Terminal USING [ColorMode, Current, GetColorMode], UserProfile USING [Number, Token], ViewerClasses USING [Viewer], ViewerOps USING [ChangeColumn, CloseViewer, ComputeColumn, EnumerateViewers, EnumProc, OpenIcon], WindowManager USING [colorDisplayOn, ScreenPos, StartColorViewers, StopColorViewers]; ColorDisplayImpl: CEDAR PROGRAM IMPORTS InterminalExtras, List, MonitorToolDefs, Rope, Terminal, UserProfile, ViewerOps, WindowManager EXPORTS ColorDisplay ~ BEGIN <> bppLast: PUBLIC CARDINAL _ 8; onLeftLast: PUBLIC BOOLEAN _ TRUE; monitorTypeLast: PUBLIC Rope.ROPE _ "640x480"; DefaultBpp, Bpp: PUBLIC PROC RETURNS [bpp: CARDINAL] ~ { <> IF WindowManager.colorDisplayOn THEN { colorMode: Terminal.ColorMode _ Terminal.GetColorMode[Terminal.Current[]]; bpp _ (IF colorMode.full THEN 24 ELSE colorMode.bitsPerPixelChannelA); } ELSE bpp _ bppLast; bppLast _ bpp; --Remember the setting of the screen }; DefaultOnLeft, OnLeft: PUBLIC PROC RETURNS [onLeft: BOOLEAN] ~ { onLeft _ IF WindowManager.colorDisplayOn THEN InterminalExtras.ColorDisplayOnLeft[] ELSE onLeftLast; onLeftLast _ onLeft; }; DefaultOn: PUBLIC PROC RETURNS [BOOLEAN] ~ { RETURN[WindowManager.colorDisplayOn]; }; DefaultMonitorType: PUBLIC PROC RETURNS [Rope.ROPE] ~ { RETURN[monitorTypeLast]; }; SetColorDisplayStatus: PUBLIC PROC [on: BOOLEAN _ DefaultOn[], onLeft: BOOLEAN _ DefaultOnLeft[], bpp: CARDINAL _ DefaultBpp[], monitorType: Rope.ROPE _ DefaultMonitorType[]] ~ { SELECT TRUE FROM <> (on=WindowManager.colorDisplayOn AND bpp=Bpp[] AND monitorType=monitorTypeLast AND onLeft=OnLeft[]) => RETURN; <> (on=WindowManager.colorDisplayOn AND bpp=Bpp[] AND monitorType=monitorTypeLast AND on) => { InterminalExtras.SwitchSideOfColorDisplay[]; onLeftLast _ OnLeft[]; }; <> ENDCASE => TRUSTED { colorViewerList, colorIconList: LIST OF REF ANY _ NIL; --Really only viewers, tho ListColorViewers: PROC ~ TRUSTED { --Constructs a list of the color viewers EnumColorViewers: ViewerOps.EnumProc ~ TRUSTED { IF v.column=color THEN IF v.iconic THEN colorIconList _ List.Cons[v,colorIconList] ELSE colorViewerList _ List.Cons[v,colorViewerList]; }; ViewerOps.EnumerateViewers[enum: EnumColorViewers]; }; ReopenColorViewers: PROC ~ TRUSTED { --Reopen the listed color viewers reopenList: LIST OF REF ANY _ colorViewerList; <> WHILE reopenList#NIL DO v: ViewerClasses.Viewer _ NARROW[List.Car[reopenList]]; reopenList _ NARROW[List.Cdr[reopenList]]; ViewerOps.CloseViewer[v]; ViewerOps.ChangeColumn[v, color]; ViewerOps.OpenIcon[icon: v, paint: FALSE]; ENDLOOP; ViewerOps.ComputeColumn[color]; <> reopenList _ colorIconList; WHILE reopenList#NIL DO v: ViewerClasses.Viewer _ NARROW[List.Car[reopenList]]; reopenList _ NARROW[List.Cdr[reopenList]]; ViewerOps.ChangeColumn[v, color]; ENDLOOP; }; side: WindowManager.ScreenPos _ IF onLeft THEN left ELSE right; monitorTypeLast _ monitorType; --Back up the given parameters onLeftLast _ onLeft; bppLast _ bpp; <<>> ListColorViewers[]; WindowManager.StopColorViewers[]; IF on THEN { SELECT TRUE FROM Rope.Equal[s1: monitorType, s2: "640x480", case: FALSE] => MonitorToolDefs.StartMonitor[screenWidth: 640, screenHeight: 480, refreshRate: 30, bitsPerPixel: bpp, hBlankTime: 9.7, vBlankTime: 1250, pos: side]; Rope.Equal[s1: monitorType, s2: "1024x768", case: FALSE] => MonitorToolDefs.StartMonitor[screenWidth: 1024, screenHeight: 768, refreshRate: 30, bitsPerPixel: bpp, hBlankTime: 6, vBlankTime: 850, pos: side]; ENDCASE => WindowManager.StartColorViewers[screenPos: side, bitsPerPixel: bpp]; ReopenColorViewers[]; }; }; }; GetColorDisplayStatus: PUBLIC PROC RETURNS [on, onLeft: BOOLEAN, bpp: CARDINAL, monitorType: Rope.ROPE] ~ { on _ WindowManager.colorDisplayOn; onLeft _ OnLeft[]; bpp _ Bpp[]; monitorType _ monitorTypeLast; }; GetColorDisplayProfile: PUBLIC PROC RETURNS [on, onLeft: BOOLEAN, bpp: CARDINAL, monitorType: Rope.ROPE] ~ { RightOrLeft: PROC RETURNS[rl: Rope.ROPE] ~ INLINE { rl _ IF onLeftLast THEN "left" ELSE "right"}; tBpp: INTEGER; --Temporary bits per pixel on _ WindowManager.colorDisplayOn; SELECT tBpp _ UserProfile.Number["ColorDisplay.BitsPerPoint", Bpp[]] FROM 1,2,4,8,24 => bpp _ tBpp; ENDCASE => bpp _ Bpp[]; onLeft _ Rope.Equal[UserProfile.Token["ColorDisplay.Side", RightOrLeft[]], "left", FALSE]; monitorType _ UserProfile.Token["ColorDisplay.Type", monitorTypeLast]; }; Init: PROC[] RETURNS[] ~ { <> [,onLeftLast, bppLast, monitorTypeLast] _ GetColorDisplayProfile[]; }; Init[]; END.