DIRECTORY Buttons USING [ButtonProc, Create], CedarInitOps USING [Seconds, 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, PaintViewer, SaveAllEdits]; ViewerProcessesImpl: CEDAR MONITOR IMPORTS Buttons, CedarSnapshot, CedarInitOps, ClassIncreek, Cursors, Process, UserProfile, UserTerminal, ViewerOps = BEGIN 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; powerOff: CedarInitOps.Seconds; idleTime _ 60 * UserProfile.Number[key: "AutoIdle.Timeout", default: 20]; powerOff _ 60 * UserProfile.Number[key: "AutoIdle.PowerOff", default: 0]; 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[powerOff: powerOff]; -- 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]; TRUSTED {Process.Detach[FORK EmergencySaveAllEdits[]]}; TRUSTED {CedarSnapshot.Register[IdleOff, IdleOn]; IdleOn[rollback]}; END. ΐViewerProcessesImpl.mesa; written by S. McGregor Edited by McGregor on July 13, 1983 4:16 pm Last Edited by: Maxwell, May 24, 1983 8:06 am Last Edited by: Pausch, June 29, 1983 3:10 pm Κ'– "cedar" style˜JšΟc1™1Jš+™+J™-J™-J˜šΟk ˜ Jšœžœ˜#Jšœ žœ˜$Jšœžœ*˜=Jšœ žœL˜^Jšœžœ˜&Jšœ žœ ˜JšœžœR˜_Jšœžœžœ˜Jšœ žœ ˜Jšœ žœ ˜Jšœžœ ˜Jšœ žœ9˜HJ˜—Jšœžœž˜"J˜Jšžœm˜tJ˜Jšž˜J˜šΟnœžœžœž˜+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šœI˜IJšœI˜IJšžœ žœžœ˜J˜'šžœ ˜ J˜"J˜0šœ3œ˜HJšœžœ˜%—šžœ žœž˜Jšœ4˜;Jšžœ˜—Jšžœ˜—Jšžœ žœ˜Jšžœ˜J˜—šœ%žœ˜+Jšœžœ ˜Jšžœ˜—J˜šœ(žœž˜5J˜Jšžœ ˜Jšœžœ˜Jšžœ˜J˜—Jšœžœ˜>J˜Jšœ@žœ˜FJ˜Jšžœžœ˜7J˜Jšžœ>˜EJšžœ˜J˜J˜—…— R9