ðYSyntax10.Scn.FntSyntax10i.Scn.Fntöÿÿÿ€°­StampElemsAlloc4 Apr 96@vVÕ)dTÉSyntax10m.Scn.FntƒÑ´MODULE XEInstaller; (** SHML 5 Dec 91,  *) (** Exchange TextFrames.Handler in visible viewers with XE.Handler *) (* Created by Stefan H._M. Ludwig, Institute for Computer Systems, ETH Zurich, ludwig@inf.ethz.ch, 5 Dec 91 Changes: 3 Apr 96: SHML - uses module Host. Fully portable. *) IMPORT Host, Input, Display, Viewers, TextFrames, MV := MenuViewers, Oberon; VAR exchanger: Oberon.Task; tfHandle, xeHandle: Display.Handler; PROCEDURE GetXEHandler; VAR save, par: Oberon.ParList; res: INTEGER; BEGIN save := Oberon.Par; NEW(par); NEW(par.frame); par.frame.X := 0; par.frame.Y := 0; par.pos := -210566; (* magic *) Oberon.Call("XE.GetHandler", par, FALSE, res); IF res = 0 THEN xeHandle := Oberon.Par.frame.handle ELSE xeHandle := NIL END; Oberon.Par := save END GetXEHandler; PROCEDURE Change(x, y: INTEGER); (* change handler for textframes in viewer x, y *) VAR v: Viewers.Viewer; BEGIN v := Viewers.This(x, y); IF (v # NIL) & (v IS MV.Viewer) THEN (* v # NIL necessary for startup *) IF (v.dsc IS TextFrames.Frame) & (v.dsc.handle = tfHandle) THEN v.dsc.handle := xeHandle END; IF (v.dsc.next IS TextFrames.Frame) & (v.dsc.next.handle = tfHandle) THEN v.dsc.next.handle := xeHandle END END END Change; PROCEDURE Exchange; (* Inspect viewer at mouse and caret position and exchange TextFrames with XE handler *) BEGIN Change(Oberon.Mouse.X, Oberon.Mouse.Y); IF Oberon.FocusViewer # NIL THEN Change(Oberon.FocusViewer.X, Oberon.FocusViewer.Y) END; Oberon.CurTask.time := Oberon.Time()+Host.TimeUnit DIV 2 (* delay for 500 ms *) END Exchange; PROCEDURE Start*; BEGIN Oberon.Remove(exchanger); GetXEHandler; IF xeHandle # NIL THEN Oberon.Install(exchanger) END END Start; PROCEDURE Stop*; BEGIN Oberon.Remove(exchanger) END Stop; BEGIN NEW(exchanger); exchanger.safe := FALSE; exchanger.handle := Exchange; tfHandle := TextFrames.Handle END XEInstaller. XEInstaller.Start XEInstaller.Stop