DIRECTORY ClassIncreek USING [Increek], Cursors USING [CursorType, SetCursor], Graphics USING [black, Context, DrawBox, NewContext, SetColor, SetCP, white], GraphicsOps USING [DrawText], ImplErrors, InputFocus, MessageWindow USING [Append, Blink, messageWindow], Process USING [GetPriority, MsecToTicks, Pause, Priority, priorityForeground, SetPriority], Rope USING [ROPE], TIPUser USING [DiscardTypeAhead], UserProfile USING [Boolean, CallWhenProfileChanges, ProfileChangedProc], UserTerminal USING [BlinkDisplay, keyboard], ViewerClasses USING [Viewer], ViewerOps USING [EnumerateViewers, EnumProc, PaintViewer, SaveAllEdits, XYWH2Box], ViewersSnapshot USING [RollBack], WindowManager USING [RestoreCursor]; ImplErrorsImpl: CEDAR MONITOR IMPORTS Cursors, Graphics, GraphicsOps, InputFocus, MessageWindow, Process, TIPUser, UserProfile, UserTerminal, ViewerOps, ViewersSnapshot, WindowManager EXPORTS ImplErrors SHARES InputFocus, MessageWindow, TIPUser = BEGIN OPEN ImplErrors; Error: PUBLIC SIGNAL [severity: Severity _ fatal, msg: Rope.ROPE _ NIL] = CODE; UserErrorQuery: PUBLIC ENTRY PROC RETURNS [continue: BOOL] = TRUSTED BEGIN OPEN Graphics, MessageWindow.messageWindow; ENABLE UNWIND => NULL; oldPriority: Process.Priority = Process.GetPriority[]; context: Context; mouseBitsRec: TYPE = MACHINE DEPENDENT RECORD [ -- mouse buttons are inverted fill: [0..8192), red: BOOL, blue: BOOL, yellow: BOOL]; mouse: LONG POINTER TO mouseBitsRec = LOOPHOLE[UserTerminal.keyboard]; IF ~worldSwapDebug THEN RETURN[FALSE]; Process.SetPriority[Process.priorityForeground]; TIPUser.DiscardTypeAhead[InputFocus.focusTIP]; context _ NewContext[]; SetColor[context, white]; DrawBox[context, ViewerOps.XYWH2Box[cx, cy, cw, ch]]; SetColor[context, black]; SetCP[context, cx+2, cy+2]; THROUGH [0..3) DO UserTerminal.BlinkDisplay[]; Process.Pause[Process.MsecToTicks[100]]; ENDLOOP; GraphicsOps.DrawText[context, " Uncaught Signal! Red: Proceed, Yellow: Save edits then rollback, Blue: Reject."]; WHILE ~mouse.red OR ~mouse.yellow OR ~mouse.blue DO ENDLOOP; -- spin until buttons go up Cursors.SetCursor[questionMark]; DO IF ~mouse.red THEN { continue _ TRUE; MessageWindow.Append["Pressing on in spite of crash! Maybe you should boot.", TRUE]; EXIT} ELSE IF ~mouse.yellow THEN { continue _ TRUE; Cursors.SetCursor[hourGlass]; ViewerOps.SaveAllEdits[! ANY => CONTINUE]; Cursors.SetCursor[retry]; ViewersSnapshot.RollBack[! ANY => CONTINUE]; -- usually no return MessageWindow.Append["Rollback failed! Maybe you should boot.", TRUE]; ViewerOps.EnumerateViewers[Paint]; -- update headers of saved viewers EXIT} ELSE IF ~mouse.blue THEN {continue _ FALSE; EXIT}; ENDLOOP; InputFocus.EnableInput[]; Process.SetPriority[oldPriority]; IF NOT continue THEN RETURN; WindowManager.RestoreCursor[]; MessageWindow.Blink[]; END; Paint: ViewerOps.EnumProc = BEGIN IF v.column#static THEN ViewerOps.PaintViewer[v, caption ! ANY => CONTINUE]; RETURN[TRUE]; END; worldSwapDebug: BOOL; Init: UserProfile.ProfileChangedProc = CHECKED {worldSwapDebug _ UserProfile.Boolean["WorldSwapDebug", FALSE]}; UserProfile.CallWhenProfileChanges[Init]; END. όImplErrorsImpl.mesa; Last Edited by McGregor, November 8, 1982 1:33 pm Last Edited by: Maxwell, January 3, 1983 12:56 pm try to flush current TIP notification to client only use low-level interfaces to avoid monitors and potentially broken code Κ±– "Mesa" style˜JšΟc™Jš1™1J™1J˜šΟk ˜ Jšœ žœ ˜Jšœžœ˜&Jšœ žœ?˜MJšœ žœ ˜J˜ J˜ Jšœžœ ˜3šœžœ@˜MJ˜ —Jšœžœžœ˜Jšœžœ˜!Jšœ žœ7˜HJšœ žœ˜,Jšœžœ ˜Jšœ žœC˜RJšœžœ ˜!Jšœžœ˜$J˜—šœž ˜šžœM˜TJšœD˜D—Jšžœ ˜Jšžœ%˜+J˜—Jšžœžœ ˜J˜Jš œžœžœ(žœžœžœ˜OJ˜š Οnœžœžœžœžœ žœ˜