ViewerProcesses.mesa; written by S. McGregor
Edited by McGregor on May 23, 1983 12:55 pm
Last Edited by: Maxwell, January 21, 1983 8:56 am
DIRECTORY
Buttons USING [ButtonProc, Create],
CedarInitOps USING [Sleep],
CedarSnapshot USING [CheckpointProc, Register, RollbackProc],
ClassIncreek USING [ActionBody, GetAction, Increek, IncreekError, NewStdIncreek, SetAtLatest],
Cursors USING [CursorType, GetCursor, SetCursor],
Interminal USING [KeyState],
Process USING [Abort, Detach, Pause, priorityForeground, Seconds, SecondsToTicks, SetPriority],
UserProfile USING [Number],
UserTerminal USING [keyboard],
ViewerOps USING [EnumerateViewers, EnumProc, PaintViewer, SaveAllEdits];
ViewerProcesses: 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];
oldCursor: Cursors.CursorType ← Cursors.GetCursor[];
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[oldCursor];
ViewerOps.EnumerateViewers[PaintCaption]; -- ok if this doesn't finish
END;
ENDLOOP;
END;
idleProcess: PROCESSNIL;
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.