DIRECTORY Buttons USING [ButtonProc, Create], CedarInitOps USING [Sleep], CedarSnapshot USING [CheckpointProc, Register, RollbackProc], ClassIncreek USING [ActionBody, GetAction, Increek, IncreekError, NewStdIncreek, SetAtLatest], Cursors USING [CursorType, SetCursor], Interminal USING [KeyState], Process USING [Abort, Detach, Pause, priorityForeground, Seconds, SecondsToTicks, SetPriority], Rope USING [ROPE], UserProfile USING [Number], UserTerminal USING [keyboard], ViewerClasses USING [Viewer], ViewerOps USING [EnumerateViewers, EnumProc, FindViewer, PaintViewer, SaveAllEdits], VirtualDesktops USING [VirtualDesktop]; ViewerProcessesImpl: CEDAR MONITOR IMPORTS Buttons, CedarSnapshot, CedarInitOps, ClassIncreek, Cursors, Process, UserProfile, UserTerminal, ViewerOps EXPORTS VirtualDesktops = BEGIN EnumerateViewers: PUBLIC PROC [enum: ViewerOps.EnumProc] = BEGIN ViewerOps.EnumerateViewers[enum]; END; FindViewer: PUBLIC PROC [name: Rope.ROPE] RETURNS [viewer: ViewerClasses.Viewer, desktop: VirtualDesktops.VirtualDesktop] = BEGIN RETURN[ViewerOps.FindViewer[name], 0]; END; EmergencySaveAllEdits: PROC = TRUSTED BEGIN keys: LONG POINTER TO Interminal.KeyState = LOOPHOLE[UserTerminal.keyboard]; PaintCaption: ViewerOps.EnumProc = TRUSTED BEGIN ViewerOps.PaintViewer[v, caption]; END; Process.SetPriority[Process.priorityForeground]; DO -- forever Process.Pause[Process.SecondsToTicks[1]]; IF --keys.bits[Lock]=down AND-- keys.bits[LeftShift]=down AND keys.bits[RightShift]=down AND keys.bits[Spare3]=down THEN BEGIN Cursors.SetCursor[activate]; ViewerOps.SaveAllEdits[]; Cursors.SetCursor[textPointer]; ViewerOps.EnumerateViewers[PaintCaption]; -- ok if this doesn't finish END; ENDLOOP; END; idleProcess: PROCESS _ NIL; AutoIdle: PROC = TRUSTED BEGIN ENABLE ANY => GOTO Punt; -- punt if bad number or ABORTED increek: ClassIncreek.Increek; action: ClassIncreek.ActionBody; idleTime: Process.Seconds; idleTime _ 60 * UserProfile.Number["AutoIdleTimeout", 20]; IF idleTime<=0 THEN RETURN; increek _ ClassIncreek.NewStdIncreek[]; DO -- forever ClassIncreek.SetAtLatest[increek]; Process.Pause[Process.SecondsToTicks[idleTime]]; action _ ClassIncreek.GetAction[increek, dontWait, ----, clicksAndMotion ! ClassIncreek.IncreekError => LOOP]; WITH a: action SELECT FROM timedOut => CedarInitOps.Sleep[]; -- idle ENDCASE; ENDLOOP; EXITS Punt => NULL; END; IdleOn: CedarSnapshot.RollbackProc = BEGIN idleProcess _ FORK AutoIdle[]; END; IdleOff: CedarSnapshot.CheckpointProc = TRUSTED BEGIN Process.Abort[idleProcess]; JOIN idleProcess; idleProcess _ NIL; END; IdleProc: Buttons.ButtonProc = TRUSTED {CedarInitOps.Sleep[]}; [] _ Buttons.Create[info: [name: "Idle"], proc: IdleProc, fork: TRUE, documentation: "Hide desktop pending user login"]; TRUSTED {Process.Detach[FORK EmergencySaveAllEdits[]]}; TRUSTED {CedarSnapshot.Register[IdleOff, IdleOn]; IdleOn[rollback]}; END. ’ViewerProcessesImpl.mesa; written by S. McGregor Edited by McGregor on May 24, 1983 4:40 pm Last Edited by: Maxwell, May 24, 1983 8:06 am Κ†– "Mesa" style˜JšΟc1™1Jš*™*J™-J™šΟk ˜ Jšœžœ˜#Jšœ žœ ˜Jšœžœ*˜=Jšœ žœL˜^Jšœžœ˜&Jšœ žœ ˜JšœžœR˜_Jšœžœžœ˜Jšœ žœ ˜Jšœ žœ ˜Jšœžœ ˜Jšœ žœE˜TJšœžœ˜'J˜—Jšœžœž˜"J˜Jšžœk˜rJšžœ˜J˜Jšž˜J˜šΟnœžœžœž˜@Jšœ!˜!Jšžœ˜J˜—šŸ œžœžœ žœ˜)JšžœKž˜WJšžœ ˜&Jšžœ˜—J˜šŸœžœžœž˜+Jš œžœžœžœžœ˜Lšœ#žœž˜0Jšœ"˜"Jšžœ˜—Jšœ0˜0šžœ ˜ J˜)š žœœžœžœžœž˜~Jšœ˜Jšœ˜Jšœ˜Jšœ*˜FJšžœ˜—Jšžœ˜—Jšžœ˜—J˜Jšœ žœžœ˜J˜šŸœžœžœž˜JšžœžœžœΠck˜9J˜J˜ J˜J˜:Jšžœ žœžœ˜J˜'šžœ ˜ J˜"J˜0šœ3œ˜HJšœžœ˜%—šžœ žœž˜Jšœ"˜)Jšžœ˜—Jšžœ˜—Jšžœ žœ˜Jšžœ˜J˜—šœ%žœ˜+Jšœžœ ˜Jšžœ˜—J˜šœ(žœž˜5J˜Jšžœ ˜Jšœžœ˜Jšžœ˜J˜—Jšœžœ˜>J˜šœ@žœ˜EJ˜2—J˜Jšžœžœ˜7J˜Jšžœ>˜EJšžœ˜J˜J˜—…— Tl