ð§Syntax10.Scn.FntSyntax10i.Scn.Fnt;®y¦š­ÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt11 BEGIN ownSelection := FALSE END ClearSelection; ÿÿÿÿ€8ÀÔ"ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt¼¼ VAR M: Oberon.CopyOverMsg; BEGIN IF scrap.len > 0 THEN M.text := scrap; M.beg := 0; M.end := scrap.len; Oberon.FocusViewer.handle(Oberon.FocusViewer, M) END END CopyOverSelection; ÿÿÿÿ€8ÀÔýþÿÿ€8ÀÔ#Syntax10.Scn.Fntáá BEGIN ownSelection := TRUE; X11.SetSelectionOwner(X11.display, X11.XAPRIMARY, X11.primary, X11.lastEventTime); IF X11.GetSelectionOwner(X11.display, X11.XAPRIMARY) # X11.primary THEN ClearSelection END END TakeSelection; ÿÿÿÿ€8ÀÔUÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt‰‰ BEGIN X11.ConvertSelection(X11.display, X11.XAPRIMARY, X11.XASTRING, myProperty, X11.primary, X11.lastEventTime) END RequestSelection; ÿÿÿÿ€8ÀÔBœüÿÿ€8ÀÔ#Syntax10.Scn.FntBB VAR ev: X11.SelectionEvent; R: Texts.Reader; i: LONGINT; ch: CHAR; BEGIN ev.type := X11.SelectionNotify; ev.requestor := event.requestor; ev.selection := event.selection; ev.target := event.target; ev.time := event.time; IF (event.selection = X11.XAPRIMARY) & (event.target = X11.XASTRING) THEN ev.property := event.property; NEW(selectionData, scrap.len + 1); Texts.OpenReader(R, scrap, 0); Texts.Read(R, ch); i := 0; WHILE ~R.eot DO IF ch = CR THEN ch := LF END ; selectionData[i] := ch; INC(i); Texts.Read(R, ch) END ; selectionData[i] := 0X; X11.ChangeProperty(X11.display, ev.requestor, ev.property, ev.target, 8, X11.PropModeReplace, SYSTEM.ADR(selectionData[0]), i) ELSE ev.property := X11.None END ; X11.SendEvent(X11.display, ev.requestor, X11.False, 0, SYSTEM.ADR(ev)) END SendSelection; ÿÿÿÿ€8ÀÔ>5ýÿÿ€8ÀÔ#Syntax10.Scn.Fnt©© VAR type: X11.Atom; format, len, after, prop, adr: LONGINT; ch: CHAR; BEGIN Texts.Delete(scrap, 0, scrap.len); IF (event.selection = X11.XAPRIMARY) & (event.property = myProperty) THEN X11.GetWindowProperty(X11.display, event.requestor, event.property, 0, 8192, X11.False, event.target, type, format, len, after, prop); adr := prop; IF len > 0 THEN WHILE len > 0 DO SYSTEM.GET(adr, ch); INC(adr); DEC(len); IF ch = LF THEN ch := CR END ; IF ch # 0X THEN Texts.Write(W, ch) END END ; Texts.Append(scrap, W.buf); X11.Free(prop); X11.DeleteProperty(X11.display, event.requestor, event.property) END ; CopyOverSelection END END ReceiveSelection; ÿÿÿÿ€8ÀÔ Syntax10b.Scn.Fnt Šÿÿÿ€8ÀÔCSyntax10.Scn.FntSyntax10i.Scn.Fnt4 BEGIN HALT(99) (* not implemented *) END Capture; ÿÿÿÿ€8ÀÔ ßþÿÿ€8ÀÔ#Syntax10.Scn.Fntÿÿ VAR t: Texts.Text; beg, end, time: LONGINT; BEGIN Texts.Delete(scrap, 0, scrap.len); Oberon.GetSelection(t, beg, end, time); IF time >= 0 THEN Texts.Save(t, beg, end, B); Texts.Delete(t, beg, end); Texts.Append(scrap, B) END ; TakeSelection END Cut; ÿÿÿÿ€8ÀÔ ùþÿÿ€8ÀÔ#Syntax10.Scn.Fntåå VAR t: Texts.Text; beg, end, time: LONGINT; BEGIN Texts.Delete(scrap, 0, scrap.len); Oberon.GetSelection(t, beg, end, time); IF time >= 0 THEN Texts.Save(t, beg, end, B); Texts.Append(scrap, B) END ; TakeSelection END Copy; ÿÿÿÿ€8ÀÔ Šÿÿÿ€8ÀÔ#Syntax10.Scn.FntTT BEGIN IF ownSelection THEN CopyOverSelection ELSE RequestSelection END END Paste; ÿÿÿÿ€8ÀÔÿÿÿÿ€8ÀÔZÿÿÿÿ€8ÀÔ¾MODULE Clipboard; (* Copyright (c) ETH Z…rich, 1989-95 / jg, nw, jt 7.5.90 *) IMPORT SYSTEM, Files, Viewers, Fonts, Texts, MenuViewers, TextFrames, Oberon, Display, X11; CONST TAB = 9X; CR = 0DX; LF = 0AX; BitmapId = 39X; TYPE FileDesc = RECORD (*image of diskette dir entry*) name: ARRAY 22 OF CHAR; time, date: INTEGER; head: INTEGER; size: LONGINT END; File = POINTER TO FileHandle; (*diskette file*) FileHandle = RECORD prev, next: File; file: FileDesc END; VAR S: Texts.Scanner; T: Texts.Text; W: Texts.Writer; dir: File; trailer: FileDesc; i: INTEGER; (* cut and paste: *) scrap: Texts.Text; B: Texts.Buffer; selectionData: POINTER TO ARRAY OF CHAR; ownSelection: BOOLEAN; myProperty: X11.Atom; PROCEDURE ClearSelection;  PROCEDURE CopyOverSelection;  PROCEDURE TakeSelection;  PROCEDURE RequestSelection;  PROCEDURE SendSelection (VAR event: X11.SelectionRequestEvent);  PROCEDURE ReceiveSelection (VAR event: X11.SelectionEvent);  PROCEDURE Capture* (x, y, w, h: LONGINT);  PROCEDURE Cut*;  PROCEDURE Copy*;  PROCEDURE Paste*;  BEGIN Texts.OpenWriter(W); NEW(B); Texts.OpenBuf(B); NEW(scrap); scrap.notify := TextFrames.NotifyDisplay; Texts.Open(scrap, ""); X11.SendSelection := SendSelection; X11.ReceiveSelection := ReceiveSelection; X11.ClearSelection := ClearSelection; ClearSelection; myProperty := X11.InternAtom(X11.display, SYSTEM.ADR("OberonProperty"), X11.False) END Clipboard.