;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 123.227
;;; Reason:
;;;  Fix Aborting out of **MORE** processing in an Editor Stream window.
;;; Written 8-Apr-88 14:40:57 by pld at site Gigamos Cambridge
;;; while running on Jack Flanders from band 1
;;; with Experimental System 123.226, Experimental Local-File 73.4, Experimental FILE-Server 22.2, Experimental Unix-Interface 11.0, Experimental KERMIT 34.3, Experimental ZMail 71.0, Experimental Lambda-Diag 15.0, Experimental Tape 22.0, microcode 1755, SDU Boot Tape 3.14, SDU ROM 8.



; From modified file DJ: L.ZWEI; SCREEN.LISP#482 at 8-Apr-88 14:41:05
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; SCREEN  "

(DEFMETHOD (ZWEI :MORE-EXCEPTION) ()
  (IF *INSIDE-EDITOR-STREAM*
      (OR (ZEROP (TV:SHEET-MORE-FLAG))
	  (TV:SHEET-MORE-HANDLER))
    ;; If not in editor stream, ignore **MORE**s.
    (SETF (TV:SHEET-MORE-FLAG) 0)))

;;; These are sent by ZTOP streams to inform us of changes of ZTOP's state.
;;; That information is displayed and communicated in other ways,
;;; so we ignore these messages, whose intended recipient is the EDITOR-STREAM-WINDOW.

))

; From modified file DJ: L.ZWEI; STREAM.LISP#178 at 8-Apr-88 14:41:16
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; STREAM  "


(DEFMETHOD (EDITOR-STREAM-MIXIN :TYO) (CH)
  (LET ((*WINDOW* *STREAM-SHEET*))
    (STREAM-IMMEDIATE-OUTPUT
      (TV:SHEET-TYO *STREAM-SHEET* CH))
    (INSERT-MOVING *STREAM-BP* CH)))

))

; From modified file DJ: L.ZWEI; STREAM.LISP#178 at 8-Apr-88 14:41:24
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; STREAM  "


(defwrapper (EDITOR-STREAM-MIXIN :STRING-OUT) ((STR &OPTIONAL (START 0) END) . body)
  `(LET ((*WINDOW* *STREAM-SHEET*))
     (STREAM-IMMEDIATE-OUTPUT . ,body)
     (INSERT-MOVING *STREAM-BP* (IF (AND (ZEROP START) (NULL END)) STR
				  (NSUBSTRING STR START END)))))

))

; From modified file DJ: L.ZWEI; STREAM.LISP#178 at 8-Apr-88 14:41:31
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; STREAM  "


(DEFMETHOD (EDITOR-STREAM-MIXIN :LINE-OUT) (STR &OPTIONAL (START 0) END)
  (LET ((*WINDOW* *STREAM-SHEET*))
    (STREAM-IMMEDIATE-OUTPUT
      (TV:SHEET-STRING-OUT *STREAM-SHEET* STR START END)
      (TV:SHEET-CRLF *STREAM-SHEET*))
    (INSERT-MOVING *STREAM-BP* (IF (AND (ZEROP START) (NULL END)) STR
				 (NSUBSTRING STR START END)))
    (INSERT-MOVING *STREAM-BP* #/RETURN)))

))

; From modified file DJ: L.ZWEI; STREAM.LISP#178 at 8-Apr-88 14:41:41
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; STREAM  "

(DEFMETHOD (EDITOR-STREAM-MIXIN :STREAM-RUBOUT-HANDLER)
	   (&AUX (RUBOUT-HANDLER NIL) CHAR)
  ;; If there is a saved-up activation character, return it from :ANY-TYI now.
  ;; This happens at the end of a rescan of the input.
  (IF *SRE-ACTIVATION-CHARACTER*
      (PROG1 *SRE-ACTIVATION-CHARACTER*
	     (SETQ *SRE-ACTIVATION-CHARACTER* NIL))
    ;; We could just call the editor, but we must pass certain characters (editing-commands)
    ;; that the program doing the read is handling, and we also want to
    ;; save some time for alphabetic characters.
    (IF *SRE-INPUT-POINT*
	(MUST-REDISPLAY *STREAM-SHEET* DIS-BPS)
      (SETQ CHAR (FUNCALL-SELF ':ANY-TYI)))
    ;; Just type out and insert self-inserting printing characters
    ;; but not if they are the caller's editing-commands or activations or commands,
    ;; or if they have been redefined in the editor itself.
    (let ((editing-command (cdr (assq ':editing-command rubout-handler-options)))
	  (command-handler (cdr (assq ':command rubout-handler-options)))
	  (activation-handler (cdr (assq ':activation rubout-handler-options)))
	  (do-not-echo (cdr (assq ':do-not-echo rubout-handler-options)))
	  (pass-through (cdr (assq ':pass-though rubout-handler-options))))
      (IF (AND (NUMBERP CHAR)
	       (NOT (OR (MEMQ CHAR editing-command)
			(SI:ASSQ-CAREFUL CHAR editing-command)))
	       (NOT (AND command-handler
			 (APPLY (car command-handler)
				CHAR (cdr command-handler))))
	       (NOT (AND activation-handler
			 (APPLY (car activation-handler)
				CHAR (cdr activation-handler))))
	       (NOT (MEMQ CHAR DO-NOT-ECHO))
	       (OR (AND (graphic-char-p CHAR)
			(EQ 'COM-ORDINARILY-SELF-INSERT
			    (COMMAND-LOOKUP CHAR *STREAM-COMTAB*)))
		   (AND (< CHAR 400)
			(MEMQ CHAR pass-through))))
	  (LET ((*WINDOW* *STREAM-SHEET*))
	    (STREAM-IMMEDIATE-OUTPUT
	      (TV:SHEET-TYO *STREAM-SHEET* CHAR))
	    (INSERT-MOVING *STREAM-BP* CHAR)
	    CHAR)
	;; Otherwise, run the editor till COM-ACTIVATE throws to us,
	;; then throw to RUBOUT-HANDLER to restart the read using the buffer contents.
	;; Move editor point to where we are reading.
	(MOVE-BP *STREAM-BP*
		 (OR *SRE-INPUT-POINT* (INTERVAL-LAST-BP (WINDOW-INTERVAL *STREAM-SHEET*))))
	(SETQ *SRE-INPUT-POINT* NIL)
	;; Update buffer display and window data so editor gets consistent data.
	(STREAM-REDISPLAY T)
	;; Unread this character so editor will execute it.
	(WHEN CHAR (TV:IO-BUFFER-UNGET (SEND *STREAM-SHEET* ':IO-BUFFER) CHAR))
	;; Edit.
	(SET-IN-CLOSURE EDITOR-CLOSURE '*EDITOR-STREAM-ACTIVATION-NEEDED* NIL)
	;; PASS-ON characters throw here
	;; to return from the :ANY-TYI method.
	(*CATCH 'RETURN-FROM-ANY-TYI
	  (LET ((*STREAM-IBEAM-SHOULD-BLINK* NIL)
		(*INSIDE-EDITOR-STREAM* NIL))
	    (SI:%BIND (LOCF (TV:SHEET-MORE-VPOS *STREAM-SHEET*)) NIL)
	    (UNLESS (BP-= *STREAM-BP* (INTERVAL-LAST-BP (WINDOW-INTERVAL *STREAM-SHEET*)))
	      (SEND SELF ':ENTER-EDITOR)
	      (SETQ *STREAM-IBEAM-SHOULD-BLINK* T)
	      (LET ((IBEAM-BLINKER
		      (CDR (ASSQ 'STREAM-BLINK-IBEAM
				 (WINDOW-SPECIAL-BLINKER-LIST *STREAM-SHEET*)))))
		(WHEN IBEAM-BLINKER
		  (STREAM-BLINK-IBEAM IBEAM-BLINKER *STREAM-SHEET* *STREAM-BP* NIL))))
	    (UNWIND-PROTECT
		(FUNCALL *STREAM-SHEET* ':EDIT EDITOR-CLOSURE)
	      (FUNCALL *STREAM-SHEET* ':EXIT-EDITOR)
	      ;; Put blinker into ordinary stream mode instead of editor mode.
	      (MULTIPLE-VALUE-BIND (X Y) (TV:BLINKER-READ-CURSORPOS *STREAM-BLINKER*)
		(TV:SHEET-SET-CURSORPOS *STREAM-SHEET* X Y))
	      (FUNCALL *STREAM-BLINKER* ':SET-FOLLOW-P T)	;Make the blinker follow again
	      (TV:BLINKER-SET-VISIBILITY *STREAM-BLINKER*
					 (IF (EQ *STREAM-SHEET* TV:SELECTED-WINDOW)
					     ':BLINK ':ON)))
	    ;; Tell the :RUBOUT-HANDLER method to restart the read.
	    (*THROW 'RUBOUT-HANDLER T)))))))

;;; Call editor redisplay from the editing stream.

))

; From modified file DJ: L.ZWEI; STREAM.LISP#178 at 8-Apr-88 14:41:52
#8R ZWEI#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; STREAM  "


(DEFMETHOD (EDITOR-STREAM-MIXIN :INCREMENT-CURSORPOS) (DX DY &OPTIONAL (UNITS ':PIXEL))
  (when (plusp (tv:sheet-more-flag *stream-sheet*))
    (send *stream-sheet* :more-exception))
  (SELECTQ UNITS
    (:PIXEL)
    (:CHARACTER
      (AND DX (SETQ DX (* DX (TV:SHEET-CHAR-WIDTH (WINDOW-SHEET *STREAM-SHEET*)))))
      (AND DY (SETQ DY (* DY (TV:SHEET-LINE-HEIGHT (WINDOW-SHEET *STREAM-SHEET*))))))
    (OTHERWISE
      (FERROR NIL "~S is not a known unit." UNITS)))
  (LET ((STARTING-INDENTATION
	  (FIND-BP-IN-WINDOW-COORDS *STREAM-BP* *STREAM-SHEET*))
	(*WINDOW* *STREAM-SHEET*))
    (STREAM-IMMEDIATE-OUTPUT 
      (TV:PREPARE-SHEET (*STREAM-SHEET*)
	(TV:SHEET-INCREMENT-BITPOS *STREAM-SHEET* DX DY)))
    (WHEN (AND DY (NOT (ZEROP DY)))
      (SETQ STARTING-INDENTATION 0)
      (INSERT-CHARS *STREAM-BP* #/RETURN
		    (TRUNCATE DY (TV:SHEET-LINE-HEIGHT *STREAM-SHEET*))))
    (INDENT-TO *STREAM-BP* (+ STARTING-INDENTATION (OR DX 0)))))

))
