<> <> <> <> <> DIRECTORY ColorDisplay, InterminalExtraExtra USING [ColorDisplayOnLeft, SwitchSideOfColorDisplay], List USING [Car, Cdr, Cons], MonitorToolDefsExtras USING [Start640Monitor, Start1024Monitor], 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 InterminalExtraExtra, List, MonitorToolDefsExtras, Rope, Terminal, UserProfile, ViewerOps, WindowManager EXPORTS ColorDisplay ~ { <> bppLast: PUBLIC CARDINAL _ 8; onLeftLast: PUBLIC BOOLEAN _ TRUE; monitorTypeLast: PUBLIC Rope.ROPE _ "640x480"; DefaultBpp, Bpp: PUBLIC PROC RETURNS [bpp: CARDINAL] ~ { --Has side effect of remembering bpp IF WindowManager.colorDisplayOn THEN { OPEN Terminal; colorMode: ColorMode _ GetColorMode[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 InterminalExtraExtra.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) => InterminalExtraExtra.SwitchSideOfColorDisplay[]; <> 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; onLeftLast _ onLeft; bppLast _ bpp; monitorTypeLast _ monitorType; --Back up the given parameters ListColorViewers[]; WindowManager.StopColorViewers[]; IF on THEN { SELECT TRUE FROM Rope.Equal[s1: monitorType, s2: "640x480", case: FALSE] => MonitorToolDefsExtras.Start640Monitor[bitsPerPixel: bpp, pos: side]; Rope.Equal[s1: monitorType, s2: "1024x768", case: FALSE] => MonitorToolDefsExtras.Start1024Monitor[bitsPerPixel: bpp, 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[]; }.