DIRECTORY Commander, MultiCursors, Process, Rope, ViewerClasses, ViewerOps; SaveCommand: CEDAR PROGRAM IMPORTS Commander, MultiCursors, Process, ViewerOps ~ BEGIN VerboseSaveAllEdits: PUBLIC PROC = { Save: ViewerOps.EnumProc = { MultiCursors.InvertACursor[NIL]; -- main cursor becomes a filled box IF (v.newVersion OR v.newFile) AND v.class.save # NIL THEN [] _ ViewerOps.SaveViewer[v ! ANY => CONTINUE]; v.newVersion ¬ v.newFile ¬ FALSE; IF v.icon=dirtyDocument THEN v.icon ¬ document; IF v.link#NIL THEN FOR t: ViewerOps.Viewer ¬ v.link, t.link UNTIL t=v DO t.newVersion ¬ t.newFile ¬ FALSE; ENDLOOP; MultiCursors.InvertACursor[NIL]; -- main cursor becomes a hollow box, again RETURN[TRUE]; }; PaintCaption: ViewerOps.EnumProc = { ViewerOps.PaintViewer[v, caption] }; inner: PROC = { MultiCursors.SetACursor[activate, NIL]; -- main cursor becomes a hollow box ViewerOps.EnumerateViewers[Save]; MultiCursors.SetACursor[textPointer, NIL]; -- to show the saves are done ViewerOps.EnumerateViewers[PaintCaption]; -- ok if this doesn't finish }; inner[]; }; SaveCommand: Commander.CommandProc ~ { Process.Detach[FORK VerboseSaveAllEdits[]]; }; Commander.Register["SaveSafely", SaveCommand, "safely saves all viewers"]; END. ˜ SaveCommand.mesa Copyright Σ 1991, 1992 by Xerox Corporation. All rights reserved. Weiser, May 25, 1992 7:53 pm PDT poor man's crash recovery Κη•NewlineDelimiter –(cedarcode) style™šΟn œ™Icodešœ Οeœ7™BK™ K™K™—šΟk œB˜KK˜—K˜š œŸœŸ˜KšŸœ,˜3—K˜KšœŸ˜˜šœŸœŸœ˜$Kšœ™šœ˜KšœŸœΟc#˜Dš ŸœŸœ ŸœŸœŸ˜:KšœœŸœŸœ˜/—KšœŸœ˜!KšŸœŸœ˜/š ŸœŸœŸœŸœ&ŸœŸ˜HKšœŸœ˜!KšŸœ˜—KšœŸœ *˜KKšŸœŸœ˜ Kšœ˜—Kš œ=˜IšœŸœ˜Kšœ"Ÿœ #˜KKšœ!˜!Kšœ%Ÿœ ˜HKšœ* ˜FK˜—Kšœ˜Kšœ˜K˜—K˜š œ˜&KšœŸœ˜+—K˜K˜KšœJ˜J—K˜KšŸœ˜—…—ΞM