<> <> <> <> 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.