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