DIRECTORY ColorDisplay, InterminalExtraExtra USING [GetColorDisplaySide, SetColorDisplaySide], MonitorToolDefsExtras USING [Start640Monitor, Start1024Monitor], Process USING [Detach, InitializeCondition, Pause, Ticks], Rope USING [Equal, ROPE], Terminal USING [BitmapState, ChannelsVisible, ColorMode, Current, GetColorBitmapState, GetColorMode, GetVisibility, SetColorBitmapState, Virtual], UserProfile USING [Number, Token], ViewerClasses USING [Viewer], ViewerOps USING [ChangeColumn, CloseViewer, ComputeColumn, EnumerateViewers, EnumProc, OpenIcon], WindowManager USING [colorDisplayOn, ScreenPos, StartColorViewers, StopColorViewers]; ColorDisplayImpl: CEDAR MONITOR IMPORTS InterminalExtraExtra, MonitorToolDefsExtras, Process, Rope, Terminal, UserProfile, ViewerOps, WindowManager EXPORTS ColorDisplay ~ { OPEN 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] ~ { SELECT TRUE FROM ~WindowManager.colorDisplayOn => onLeft _ onLeftLast; InterminalExtraExtra.GetColorDisplaySide[] = left => onLeft _ TRUE; ENDCASE => onLeft _ FALSE; onLeftLast _ onLeft; }; DefaultOn: PUBLIC PROC RETURNS [BOOLEAN] ~ { RETURN[WindowManager.colorDisplayOn]; }; DefaultMonitorType: PUBLIC PROC RETURNS [Rope.ROPE] ~ { RETURN[monitorTypeLast]; }; SetColorDisplayStatus: PUBLIC ENTRY PROC [on: BOOLEAN _ DefaultOn[], onLeft: BOOLEAN _ DefaultOnLeft[], bpp: CARDINAL _ DefaultBpp[], monitorType: Rope.ROPE _ DefaultMonitorType[]] ~ { NOTIFY forCDChanges; --Let the informant know... IF (on=WindowManager.colorDisplayOn AND bpp=Bpp[] AND monitorType=monitorTypeLast) THEN { --Only side of display possibly changing... IF on THEN InterminalExtraExtra.SetColorDisplaySide[IF onLeft THEN left ELSE right]; RETURN; }; { colorViewerList, colorIconList: LIST OF ViewerClasses.Viewer _ NIL; ListColorViewers: PROC ~ TRUSTED { --Constructs a list of the color viewers EnumColorViewers: ViewerOps.EnumProc ~ TRUSTED { IF v.column=color THEN IF v.iconic THEN colorIconList _ CONS[v,colorIconList] ELSE { ViewerOps.CloseViewer[v, FALSE]; colorViewerList _ CONS[v,colorViewerList]; }; }; ViewerOps.EnumerateViewers[enum: EnumColorViewers]; ViewerOps.ComputeColumn[static]; }; ReopenColorViewers: PROC ~ TRUSTED { --Reopen the listed color viewers FOR each: LIST OF ViewerClasses.Viewer _ colorViewerList, each.rest UNTIL each=NIL DO ViewerOps.ChangeColumn[each.first, color]; ViewerOps.OpenIcon[icon: each.first, paint: FALSE]; ENDLOOP; ViewerOps.ComputeColumn[color]; FOR each: LIST OF ViewerClasses.Viewer _ colorIconList, each.rest UNTIL each=NIL DO ViewerOps.ChangeColumn[each.first, 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] => TRUSTED {MonitorToolDefsExtras.Start640Monitor[bitsPerPixel: bpp, pos: side]}; Rope.Equal[s1: monitorType, s2: "1024x768", case: FALSE] => TRUSTED {MonitorToolDefsExtras.Start1024Monitor[bitsPerPixel: bpp, pos: side]}; ENDCASE => WindowManager.StartColorViewers[screenPos: side, bitsPerPixel: bpp]; ReopenColorViewers[]; }; }; }; GetColorDisplayStatus: PUBLIC ENTRY PROC RETURNS [on, onLeft: BOOLEAN, bpp: CARDINAL, monitorType: Rope.ROPE] ~ { ENABLE UNWIND => NULL; [on, onLeft, bpp, monitorType] _ GetColorDisplayStatusInternal[]; }; GetCDState: INTERNAL PROC RETURNS [state: CDState] ~ INLINE { [state.on, state.onLeft, state.bpp, state.monitorType] _ GetColorDisplayStatusInternal[]; }; GetColorDisplayStatusInternal: INTERNAL 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]; }; procList: LIST OF CDNotifyProc _ NIL; RegisterCDNotifyProc: PUBLIC ENTRY PROC [proc: CDNotifyProc] ~ { ENABLE UNWIND => NULL; procList _ CONS[proc, procList]; }; forCDChanges: CONDITION; WatchForChanges: ENTRY PROC ~ { ENABLE UNWIND => NULL; old, new: CDState _ GetCDState[]; DO WHILE old = (new _ GetCDState[]) DO WAIT forCDChanges; ENDLOOP; FOR each: LIST OF CDNotifyProc _ procList, each.rest UNTIL each=NIL DO TRUSTED {Process.Detach[FORK each.first[old, new]];} ENDLOOP; old _ new; ENDLOOP; }; SleepColorDisplay: PUBLIC ENTRY PROC [ticks: Process.Ticks] ~ { OPEN Terminal; ENABLE UNWIND => NULL; vt: Virtual _ Current[]; state: BitmapState _ GetColorBitmapState[vt]; mode: ColorMode _ GetColorMode[vt]; visible: ChannelsVisible _ GetVisibility[vt]; IF state#displayed THEN RETURN; [] _ SetColorBitmapState[vt, allocated, mode, none]; Process.Pause[ticks]; [] _ SetColorBitmapState[vt, state, mode, visible]; }; Init: PROC[] RETURNS[] ~ { [,onLeftLast, bppLast, monitorTypeLast] _ GetColorDisplayProfile[]; TRUSTED { Process.InitializeCondition[@forCDChanges, 300]; Process.Detach[FORK WatchForChanges[]]; }; }; Init[]; }. μColorDisplayImpl.mesa Created from old ColorDisplay by Mik Lamming and Ken Pier Last Edited by: Nickell, April 1, 1985 5:01:29 am PST Last Edited by: Beach, August 17, 1984 5:24:14 pm PDT Last Edited by: Pier, November 19, 1984 3:10:48 pm PST bppLast and sideLast are examined only when the color display is off. This lets the ColorDisplay package know where to default them to when the color display is turned on again. NOTE: Every call to the ColorDisplay package will cause these values to be updated with the actual state of the machine, if it is on. Here, we need to play with everything... Reset the icons that WOULD have been opened on the color display back there Read the user profile to establish the initial back settings... Κ:˜™J™9J™5J™5J™6—šΟk ˜ Jšœ ˜ Jšœœ,˜FJšœœ%˜@Icodešœœ-˜:Jšœœ œ˜Kšœ œ„˜’Jšœ œ˜"Jšœœ ˜Jšœ œR˜aJšœœB˜U—J˜šœœœ˜ Kšœl˜sJšœ ˜Jšœ˜šœ˜J˜—J™ΊJšœ œœ˜Jšœ œœœ˜"Jšœœœ ˜.J˜J˜š Οn œžœœœœœΟc$˜]šœœ˜&Jšœ ˜J˜/Jšœœœœ!˜FJ˜—Jšœ˜JšœŸ$˜8J˜J˜—š žœœœœ œ˜@šœœ˜Kšœ5˜5Kšœ>œ˜CKšœ œ˜—J˜˜J˜——š ž œœœœœ˜,Jšœ˜%J˜J˜—š žœœœœœ˜7Jšœ˜J˜J˜—šžœœœ˜(Jšœœ˜Jšœœ˜"Jšœœ˜Jšœœ˜.Jšœ˜KšœŸ˜1š œ"œ œœŸ+˜…Kš œœ*œœœ˜TKšœ˜Kšœ˜—šœ˜J™(Kšœ œœœ˜CšžœœœŸ(˜Mšžœœ˜0šœ˜šœ œœœ˜=Kšœœ˜ Kšœœ˜*Kšœ˜——J˜—J˜3J˜ J˜—šžœœœŸ!˜Gš œœœ3œœ˜UK˜*Jšœ,œ˜3Kš˜—J˜J™J™Kš œœœ1œœ˜SK˜*Kš˜—J˜—J™Jšœ œœœ˜?J˜J˜Jšœ Ÿ˜>J˜J˜!šœœ˜ šœœ˜K•StartOfExpansion[]šœ1œœG˜‰K–[]šœ2œœH˜‹JšœH˜O—J˜J˜—Kšœ˜—Jšœ˜J˜—šžœ œœœœœœ˜qKšœœœ˜KšœA˜AKšœ˜K˜—š ž œœœœœ˜=KšœY˜YK˜K˜—šžœœœœœœœ˜uJšœ"˜"Jšœ˜Jšœ ˜ Jšœ˜J˜J˜—šžœœœœœœœ˜lš ž œœœ œœ˜3Jšœœ œœ ˜-—JšœœŸ˜+J˜Jšœ"˜"šœ?˜IJšœ˜Jšœ˜—JšœSœ˜ZJšœF˜FJšœ˜J˜—Kšœ œœœ˜%šžœœœœ˜@Kšœœœ˜Kšœ œ˜ K˜K˜—Kšœ œ˜šžœ œ˜Kšœœœ˜K˜!š˜šœ˜#Kšœ˜Kš˜—š œœœ$œœ˜FKšœœ˜4Kš˜—K˜ Kš˜—K˜K˜—šžœœœœ˜?Kšœ ˜Kšœœœ˜K˜K˜-K˜#K˜-K˜Kšœœœ˜K˜4K˜K˜3K˜K˜—šžœœœ˜J™?J˜Cšœ˜ Kšœ0˜0Jšœœ˜'Kšœ˜—J˜J˜—˜J˜—Jšœ˜——…—z!