DIRECTORY BasicTime, Buttons, EndOps, Idle, Process, Rope, RuntimeError, UserProfile, ViewerClasses, ViewerPrivate; EndOpsImpl: CEDAR MONITOR IMPORTS BasicTime, Buttons, Idle, Process, RuntimeError, UserProfile EXPORTS EndOps, ViewerPrivate = BEGIN ProcList: TYPE ~ LIST OF PROC; registerHead: ProcList ¬ NIL; registerTail: ProcList ¬ NIL; Register: PUBLIC ENTRY PROC [proc: PROC] = { prev: ProcList ~ registerTail; registerTail ¬ LIST[proc]; IF prev=NIL THEN registerHead ¬ registerTail ELSE prev.rest ¬ registerTail; }; ProcessEndOpsRegistry: PUBLIC PROC = { FOR list: ProcList ¬ registerHead, list.rest UNTIL list = NIL DO list.first[ ! RuntimeError.UNCAUGHT => CONTINUE]; ENDLOOP; }; autoIdleTimeout: INT--seconds-- ¬ 20*60; neverEnableAutoIdle: BOOL ¬ FALSE; sampleTimer: CONDITION; checkpointing: INT ¬ 0; lastInput: BasicTime.GMT ¬ BasicTime.Now[]; NoteAutoIdleChange: ENTRY UserProfile.ProfileChangedProc = TRUSTED { ENABLE UNWIND => NULL; minutes: INT ¬ UserProfile.Number["Viewers.AutoIdleTimeout", 20]; IF neverEnableAutoIdle OR NOT minutes IN (0 .. 40) THEN minutes ¬ 0; autoIdleTimeout ¬ minutes*60; RETURN}; < NULL; now: BasicTime.GMT; DO ENABLE ABORTED => LOOP; WAIT sampleTimer; now ¬ BasicTime.Now[]; IF TerminalActivity.hadInput THEN { TerminalActivity.hadInput ¬ FALSE; lastInput ¬ now; } ELSE { IF autoIdleTimeout>0 AND BasicTime.Period[from: lastInput, to: now] >= autoIdleTimeout AND NOT (checkpointing>0 OR Idle.IsIdle[]) THEN Process.Detach[FORK IdleMother[NIL]]; }; ENDLOOP; }; >> < NULL; checkpointing ¬ checkpointing + 1; }; OnRollback: ENTRY PROC [clientData: REF ANY] --Booting.RollbackProc-- ~ { ENABLE UNWIND => NULL; IF (checkpointing ¬ checkpointing - 1) = 0 THEN lastInput ¬ BasicTime.Now[]; }; OnBoot: PROC [clientData: REF ANY] RETURNS [rejection: Rope.ROPE ¬ NIL] --Booting.CheckpointProc-- ~ { dirty: INT ¬ 0; CheckDirty: ViewerOps.EnumProc = { IF v.newVersion OR v.newFile THEN dirty ¬ dirty+1; }; ViewerOps.EnumerateViewers[CheckDirty]; IF dirty#0 THEN IF NOT MessageWindow.Confirm["Confirm ignoring unsaved viewers"] THEN rejection ¬ "There are unsaved viewers."; };>> IdleMother: Buttons.ButtonProc = { IF NOT Idle.IsIdle[] THEN { Idle.Sleep[]; }; }; CreateIdleButton: PUBLIC PROC [] = { [] ¬ Buttons.Create[ info: [name: "Idle"], proc: IdleMother, fork: TRUE, documentation: "Hide desktop pending user login"]; }; Init: PROC = TRUSTED { Process.SetTimeout[@sampleTimer, Process.SecondsToTicks[30]]; }; Init[]; UserProfile.CallWhenProfileChanges[NoteAutoIdleChange]; END. ζ EndOpsImpl.mesa Copyright Σ 1985, 1986, 1988, 1991 by Xerox Corporation. All rights reserved. Russ Atkinson (RRA) April 18, 1986 3:52:53 pm PST Doug Wyatt, September 21, 1987 3:15:00 pm PDT Last tweaked by Mike Spreitzer on June 4, 1987 2:44:49 pm PDT Willie-Sue, May 11, 1988 3:04:42 pm PDT Pier, November 18, 1988 1:48:03 pm PST Bier, December 8, 1988 12:18:18 pm PST EndOps related stuff Auto-Idle stuff (formerly in ViewerProcessesImpl) AutoIdle terminates when not running in this process. To make AutoIdle ignore the profile, set this to TRUE [reason: UserProfile.ProfileChangeReason] KAP for PCedar November 17, 1988 Booting.RegisterProcs[c: OnCheckpoint, r: OnRollback, b: OnBoot]; TRUSTED {Process.Detach[FORK AutoIdle[]]}; Κ+•NewlineDelimiter –(cedarcode) style™codešœ™Kšœ ΟeœC™NK™1K™-K™=K™'K™&K™&K™šΟk ˜ Idefaultšœi˜i——K˜šΠbl œžœž˜Kšžœ=˜DKšžœ˜Kšœž˜K˜—šœ™K˜Kš œ žœžœžœžœ˜Kšœžœ˜Kšœžœ˜—K˜š Οnœžœžœžœžœ˜,Kšœ˜Kšœžœ˜Kšžœžœžœžœ˜KKšœ˜K˜—š œžœžœ˜&šžœ*žœžœž˜@Kšœžœžœ˜1Kšžœ˜Kšœ˜—K˜—šœ1™1K˜—šœžΟc œ ˜(Kšœ5™5—šœžœžœ˜"Kšœ1ž™5—Kšœ ž ˜Kšœžœ˜Kšœžœ˜+K˜•StartOfExpansion- -- [reason: UserProfile.ProfileChangeReason]š œžœ"žœ˜DKšœ)™)Kšžœžœžœ˜Kšœ žœ5˜AKš žœžœžœ žœ žœ ˜DKšœ˜Kšžœ˜—K˜š  œžœžœžœ˜"Kšžœžœžœ˜Kšœžœ˜šž˜Kšžœžœžœ˜Kšžœ ˜Kšœ˜šžœžœ˜#Kšœžœ˜"K˜K˜—šžœ˜K–[from: GMT, to: GMT]šžœžœ?žœžœžœžœžœ žœ˜¬K˜—Kšžœ˜—Kšœ˜Kš ˜K˜—šœ  œžœžœžœžœžœžœžœ‘œ˜tKšžœžœžœ˜Kšœ"˜"K˜K˜—š   œžœžœžœžœ‘œ˜IKšžœžœžœ˜Kšžœ)žœ˜LK˜K˜—š œžœžœžœžœžœžœ‘œ˜fKšœžœ˜š  œ˜"Kšžœžœ žœ˜2Kšœ˜—K˜'šžœ ž˜šžœžœ;ž˜EKšœ)˜)——K˜K˜—š  œ˜"šžœžœžœ˜Kšœ ˜ K˜—Kšœ˜K˜—š œžœžœ˜$šœ˜Kšœ.žœ˜3K˜2—K˜K˜—š œžœžœ˜Kšœ=˜=K˜K˜—šœ˜K˜Kšžœ™ KšœA™AKšžœžœ™*Kšœ7˜7—K˜Kšžœ˜—…— š«