Support for multiple screens.
authorMark Friedman <edu/mit/csail/zurich/markf>
Fri, 31 Aug 1990 20:18:01 +0000 (20:18 +0000)
committerMark Friedman <edu/mit/csail/zurich/markf>
Fri, 31 Aug 1990 20:18:01 +0000 (20:18 +0000)
14 files changed:
v7/src/edwin/bufcom.scm
v7/src/edwin/curren.scm
v7/src/edwin/decls.scm
v7/src/edwin/editor.scm
v7/src/edwin/edtfrm.scm
v7/src/edwin/edtstr.scm
v7/src/edwin/edwin.ldr
v7/src/edwin/edwin.pkg
v7/src/edwin/filcom.scm
v7/src/edwin/input.scm
v7/src/edwin/prompt.scm
v7/src/edwin/scrcom.scm [new file with mode: 0644]
v7/src/edwin/xcom.scm
v7/src/edwin/xterm.scm

index 7ba1a416efb83c0ab300988597bd4fac2e5c24ce..bf4a21a52bfa4c1b4ec39ca40f14ddeee6ad1f76 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufcom.scm,v 1.83 1989/08/09 13:16:45 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufcom.scm,v 1.84 1990/08/31 20:11:47 markf Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -73,6 +73,21 @@ specifying a non-existent buffer will cause it to be created."
   (prompt-for-select-buffer "Switch to buffer")
   (lambda (buffer)
     (select-buffer (find-buffer buffer))))
+
+(define-command switch-to-buffer-in-new-screen
+  "Select buffer in a new screen."
+  (prompt-for-select-buffer "Switch to buffer in a new screen.")
+  (lambda (buffer)
+    (create-new-frame (find-buffer buffer))))
+
+(define-command create-buffer-in-new-screen
+  "Create a new buffer with a given name, and select it in a new screen."
+  "sCreate buffer in a new screen"
+  (lambda (name)
+    (let ((buffer (new-buffer name)))
+      (set-buffer-major-mode! buffer (ref-variable editor-default-mode))
+      (create-new-frame buffer))))
+
 (define-command switch-to-buffer-other-window
   "Select buffer in another window."
   (prompt-for-select-buffer "Switch to buffer in other window")
index c68da1732e9c23092259d93471f017f5ba4e1f51..b3c1cf36a92c5d9319f97a592ecf888548c5e03c 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/curren.scm,v 1.86 1989/08/12 08:31:40 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/curren.scm,v 1.87 1990/08/31 20:11:51 markf Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
 
 (declare (usual-integrations))
 \f
+;;;; Editor frames
+
+(define (change-frame new-frame)
+  (set-editor-current-frame-window! current-editor new-frame))
+
+(define (create-new-frame #!optional buffer)
+  (without-interrupts
+   (lambda ()
+     (let* ((new-screen (make-editor-screen #f))
+           (new-frame
+            (make-editor-frame
+             new-screen
+             (if (default-object? buffer)
+                 (current-buffer)
+                 buffer)
+             (make-buffer " *Typein-0*"))))
+       (set-screen-window! new-screen new-frame)
+       (editor-add-screen! current-editor new-screen)
+       (editor-add-frame! current-editor new-frame)
+       (let ((hook (ref-variable select-buffer-hook)))
+        (if hook (hook buffer new-frame)))))))
+
+(define (delete-frame! frame)
+  (let ((screen (editor-frame-screen frame)))
+    (editor-delete-screen! current-editor screen)
+    (editor-delete-frame! current-editor frame)
+    (screen-discard! screen)))
+
+(define (delete-current-frame!) (delete-frame! (current-editor-frame)))
+\f
+;;;; Screens
+
+;; This version of change-screen was meant to be used in conjunction
+;; with the reader-continuation stuff in edtfrm.scm and input.scm. But
+;; since that stuff doesn't quite work I'm commenting out this
+;; version.
+#|
+(define (change-screen screen)
+  (let ((old-frame (current-editor-frame))
+       (my-frame (screen-window screen)))
+    (change-frame  my-frame)
+    (set-editor-input-port! (current-editor-input-port))
+    (without-interrupts
+     (lambda ()
+       (change-local-bindings!
+       (window-buffer (editor-frame-selected-window old-frame))
+       (window-buffer (editor-frame-selected-window my-frame))
+       (lambda () unspecific))))
+    (update-screens! #t)
+    (change-reading my-frame old-frame)))
+|#
+
+(define (change-screen screen)
+  (let ((old-frame (current-editor-frame))
+       (my-frame (screen-window screen)))
+    (set-reader-do-before-next-read!
+     (lambda ()
+       (change-frame  my-frame)
+       (set-editor-input-port! (current-editor-input-port))
+       (without-interrupts
+       (lambda ()
+         (change-local-bindings!
+          (window-buffer (editor-frame-selected-window old-frame))
+          (window-buffer (editor-frame-selected-window my-frame))
+          (lambda () unspecific))))
+       (update-screens! #t)))
+    (^G-signal)))
+
+(define (delete-screen! screen)
+  (let ((frame (screen-window screen)))
+    (editor-delete-frame! current-editor frame)
+    (editor-delete-screen! current-editor screen)
+    (screen-discard! screen)))
+
+(define (delete-current-screen!) (delete-screen! (current-screen)))
+\f
 ;;;; Windows
 
 (define-integrable (current-window)
          (loop (cdr windows) new-buffer))))
   (bufferset-kill-buffer! (current-bufferset) buffer))
 \f
+(define-variable select-buffer-hook
+  "If not false, a procedure to call when a buffer is selected.
+The procedure is passed the new buffer and the window in which 
+it is selected.
+The buffer is guaranteed to be selected at that time."
+  false)
+
 (define-integrable (select-buffer buffer)
   (set-window-buffer! (current-window) buffer true))
 
            buffer
            (lambda () (%set-window-buffer! window buffer)))
           (if record? (bufferset-select-buffer! (current-bufferset) buffer)))
-        (%set-window-buffer! window buffer)))))
+        (%set-window-buffer! window buffer))
+     (if (not (minibuffer? buffer))
+        (let ((hook (ref-variable select-buffer-hook)))
+          (if hook (hook buffer window)))))))
+
 (define (with-selected-buffer buffer thunk)
   (let ((old-buffer))
     (dynamic-wind (lambda ()
index 583f800af14394d8a100ed73b6bcbc1f965ac57f..416fdb3c58255413aa71fa24fdb6f16ceb181180 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/decls.scm,v 1.10 1989/08/29 21:39:43 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/decls.scm,v 1.11 1990/08/31 20:11:55 markf Exp $
 
 Copyright (c) 1989 Massachusetts Institute of Technology
 
@@ -155,6 +155,7 @@ MIT in each case. |#
              "regexp"
              "replaz"
              "schmod"
+             "scrcom"
              "sercom"
              "struct"
              "syntax"
index a85dcd49e38be5245b6081f99ee9db778da33f56..6a08904507fc54df4bf4958e7a86c105d3c525f0 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/editor.scm,v 1.193 1990/06/20 23:01:51 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/editor.scm,v 1.194 1990/08/31 20:12:00 markf Exp $
 ;;;
-;;;    Copyright (c) 1986, 1989, 1990 Massachusetts Institute of Technology
+;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
       (initialize-display-type!))
   (set! edwin-editor
        (let ((screen (apply make-editor-screen make-screen-args)))
-         (make-editor "Edwin" screen (make-editor-input-port screen))))
+         (make-editor "Edwin" screen)))
   (set! edwin-initialization
        (lambda ()
          (set! edwin-initialization false)
    (lambda ()
      (if edwin-editor
         (begin
-          (screen-discard! (editor-screen edwin-editor))
+          (for-each (lambda (screen)
+                      (screen-discard! screen))
+                    (editor-screens edwin-editor))
           (set! edwin-editor false)
           unspecific)))))
 
@@ -177,6 +179,13 @@ with the contents of the startup message."
 
 (define (within-editor?)
   (not (unassigned? current-editor)))
+
+;;; There is a problem with recursive edits and multiple screens.
+;;; When you switch screens the recursive edit aborts. The problem
+;;; is that a top level ^G in a recursive edit aborts the recursive
+;;; edit and a ^G is signalled when you switch screens. I think that
+;;; ^G should not abort a recursive edit.
+
 (define (enter-recursive-edit)
   (let ((value
         (call-with-current-continuation
index 57e53e1cb667ea42f254cf1840f6e2a03ed99b51..05b9fd37cb37050c4b4dd1b6d2060a8c72d97c64 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edtfrm.scm,v 1.79 1989/08/11 11:50:30 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edtfrm.scm,v 1.80 1990/08/31 20:12:04 markf Exp $
 ;;;
 ;;;    Copyright (c) 1985, 1989 Massachusetts Institute of Technology
 ;;;
    selected-window
    cursor-window
    select-time
-   properties))
+   properties
+   typein-bufferset
+   input-port
+   ;; The reader-continuation is intended to be used to switch
+   ;; between reader loops for different editor frames. However,
+   ;; its interactions with typein and typeout don't quite work, so
+   ;; I'm commenting out the code that deals with this.
+   ;reader-continuation
+   ))
 
 (define (make-editor-frame root-screen main-buffer typein-buffer)
   (let ((window (make-object editor-frame)))
@@ -68,6 +76,9 @@
       (set! redisplay-flags (list false))
       (set! inferiors '())
       (set! properties (make-1d-table))
+      (set! typein-bufferset (make-bufferset typein-buffer))
+      (set! input-port (make-editor-input-port root-screen))
+      (bufferset-guarantee-buffer! typein-bufferset typein-buffer)
       (let ((main-window (make-buffer-frame window main-buffer true))
            (typein-window (make-buffer-frame window typein-buffer false)))
        (set! screen root-screen)
        (set! select-time 2)
        (set-window-select-time! main-window 1)
        (=> (window-cursor main-window) :enable!))
-      (set-editor-frame-size! window x-size y-size))
+      (set-editor-frame-size! window x-size y-size)
+#|
+      (set! reader-continuation (lambda (who-cares)
+                                 who-cares ;ignore
+                                 (top-level-command-reader
+                                  (lambda ()
+                                    (initialize-typein!)
+                                    (initialize-typeout!)))))
+|#
+      )
     window))
+#|
+(define (set-editor-frame-reader-continuation! window cont)
+  (with-instance-variables editor-frame window (cont)
+    (set! reader-continuation cont)))
 
+(define (change-reader new-window old-window)
+  (with-instance-variables editor-frame new-window ()
+    (switch-reader
+     reader-continuation
+     (lambda (current-reader)
+       (set-editor-frame-reader-continuation!
+       old-window
+       current-reader)))))
+|#
 (define-method editor-frame (:update-root-display! window display-style)
   (with-instance-variables editor-frame window (display-style)
     (with-screen-in-update! screen
 (define-integrable (editor-frame-screen window)
   (with-instance-variables editor-frame window ()
     screen))
+
+(define-integrable (editor-frame-typein-bufferset window)
+  (with-instance-variables editor-frame window ()
+    typein-bufferset))
+
+(define-integrable (editor-frame-input-port window)
+  (with-instance-variables editor-frame window ()
+    input-port))
+
 (define (editor-frame-windows window)
   (cons (editor-frame-typein-window window)
        (let ((start (editor-frame-window0 window)))
index 4ca6fb499d6c4f596ee24fd2aa8062a6f6eafc95..f96218cac76b452df8a4cca1d3e98f8898fd47fc 100644 (file)
 \f
 (define-structure (editor (constructor %make-editor))
   (name false read-only true)
-  (screen false read-only true)
-  (input-port false read-only true)
-  (frame-window false read-only true)
+  (screens false)
+  (current-frame-window false)
   (bufferset false read-only true)
   (kill-ring false read-only true)
   (char-history false read-only true)
-  (button-event false))
+  (button-event false)
+  (frame-windows false))
 
-(define (make-editor name screen input-port)
+(define (make-editor name screen)
   (let ((initial-buffer (make-buffer initial-buffer-name initial-buffer-mode)))
     (let ((bufferset (make-bufferset initial-buffer)))
       (let ((frame
             (make-editor-frame screen
                                initial-buffer
-                               (bufferset-create-buffer bufferset
-                                                        " *Typein-0*"))))
+                               (make-buffer " *Typein-0*"))))
        (set-screen-window! screen frame)
        (%make-editor name
-                     screen
-                     input-port
+                     (list screen)
                      frame
                      bufferset
                      (make-ring 10)
                      (make-ring 100)
-                     false)))))
+                     false
+                     (list frame))))))
+
+(define (editor-add-screen! editor screen)
+  (if (not (memq screen (editor-screens editor)))
+      (set-editor-screens! editor
+                          (cons screen
+                                (editor-screens editor)))))
+
+(define (editor-delete-screen! editor screen)
+  (set-editor-screens! editor
+                      (delq screen
+                            (editor-screens editor))))
+
+(define (editor-add-frame! editor screen)
+  (if (not (memq screen (editor-frame-windows editor)))
+      (set-editor-frame-windows! editor
+                          (cons screen
+                                (editor-frame-windows editor)))))
+
+(define (editor-delete-frame! editor screen)
+  (set-editor-frame-windows! editor
+                      (delq screen
+                            (editor-frame-windows editor))))
 
 (define-integrable (current-screen)
-  (editor-screen current-editor))
+  (editor-frame-screen (current-editor-frame)))
 
 (define-integrable (all-screens)
-  (list (current-screen)))
+  (editor-screens current-editor))
 
 (define-integrable (current-editor-input-port)
-  (editor-input-port current-editor))
+  (editor-frame-input-port (current-editor-frame)))
 
 (define-integrable (current-editor-frame)
-  (editor-frame-window current-editor))
+  (editor-current-frame-window current-editor))
 
 (define-integrable (all-editor-frames)
-  (list (current-editor-frame)))
+  (editor-frame-windows current-editor))
 
 (define-integrable (all-windows)
-  #|(append-map editor-frame-windows (all-editor-frames))|#
-  (editor-frame-windows (current-editor-frame)))
+  (append-map editor-frame-windows (all-editor-frames)))
+
 (define-integrable (current-bufferset)
   (editor-bufferset current-editor))
 
index a3635af01696ad7e0d773270841f1717248c7ce6..64c618219a46a4d2ec5cc7958f1d054dea5d85b4 100644 (file)
@@ -1,5 +1,5 @@
 ;;; -*-Scheme-*-
-;;; $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.ldr,v 1.7 1989/08/12 08:31:57 cph Exp $
+;;; $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.ldr,v 1.8 1990/08/31 20:17:56 markf Exp $
 ;;; program to load package contents
 ;;; **** This program (unlike most .ldr files) is not generated by a program.
 
     (load "iserch" (->environment '(EDWIN INCREMENTAL-SEARCH)))
     (load "texcom" environment)
     (load "wincom" environment)
+    (load "scrcom" environment)
     (load "xcom" (->environment '(EDWIN X-COMMANDS)))
     (load "modefs" environment)
     (load "rename" environment)
index ddb41b6364b348530be4a32bb9e18301a9d036ac..71a27042f9c9a809eae41bba4517eac3455c990b 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.pkg,v 1.14 1989/08/14 10:23:37 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.pkg,v 1.15 1990/08/31 20:18:01 markf Exp $
 
 Copyright (c) 1989 Massachusetts Institute of Technology
 
@@ -85,6 +85,7 @@ MIT in each case. |#
         "motcom"                       ; motion commands
         "replaz"                       ; replace commands
         "schmod"                       ; scheme mode
+        "scrcom"                       ; screen commands
         "sercom"                       ; search commands
         "texcom"                       ; text commands
         "wincom"                       ; window commands
@@ -241,7 +242,8 @@ MIT in each case. |#
          button3-up
          button4-up
          button5-up
-         x-display-type)
+         x-display-type
+         x-display-type-name)
   (export (edwin x-commands)
          screen-xterm)
   (initialization (initialize-package!)))
@@ -276,12 +278,16 @@ MIT in each case. |#
          button-downify
          button-upify
          button?
+         change-reading
+         editor-frame-input-port
          editor-frame-select-cursor!
          editor-frame-select-window!
          editor-frame-selected-window
          editor-frame-typein-window
+         editor-frame-typein-bufferset
          editor-frame-window0
          editor-frame-windows
+         editor-frame-screen
          edwin-variable$cursor-centering-point
          edwin-variable$mode-line-inverse-video
          edwin-variable$scroll-step
@@ -315,6 +321,7 @@ MIT in each case. |#
          window-point-coordinates
          window-point-x
          window-point-y
+         window-root-window
          window-redraw!
          window-redraw-preserving-point!
          window-scroll-y-absolute!
@@ -407,6 +414,8 @@ MIT in each case. |#
          message-args->string
          reset-command-prompt!
          set-command-prompt!
+         set-editor-input-port!
+         set-reader-do-before-next-read!
          temporary-message
          with-editor-input-port))
 
index 0bfe104aed3e2f0dea4fb9927d4422637a6c6421..229c540d4fe221207575a5fe1516c89f0415c715 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/filcom.scm,v 1.139 1989/08/12 08:32:08 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/filcom.scm,v 1.140 1990/08/31 20:12:39 markf Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -52,6 +52,9 @@
 (define (find-file-other-window filename)
   (select-buffer-other-window (find-file-noselect filename true)))
 
+(define (find-file-in-new-screen filename)
+  (create-new-frame (find-file-noselect filename true)))
+
 (define (find-file-noselect filename warn?)
   (let ((pathname (pathname->absolute-pathname (->pathname filename))))
     (if (file-directory? pathname)
@@ -107,6 +110,11 @@ Like \\[kill-buffer] followed by \\[find-file]."
            (let ((buffer* (new-buffer "*dummy*")))
              (do-it)
              (kill-buffer buffer*)))))))
+
+(define-command find-file-in-new-screen
+  "Visit a file in a new screen."
+  "FFind file in new screen"
+  find-file-in-new-screen)
 \f
 (define-command revert-buffer
   "Replace the buffer text with the text of the visited file on disk.
index b8eb8d172cb866e388a37c3d718796a90d3a1a7c..10954dd484f70fd0d3b6d5cbe94e133573264e3f 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/input.scm,v 1.81 1989/08/12 08:32:19 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/input.scm,v 1.82 1990/08/31 20:12:44 markf Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -172,12 +172,21 @@ B 3BAB8C
        (if (not command-prompt-displayed?)
            (clear-message!)))))
 \f
+;; The reader-continuation is intended to be used to switch
+;; between reader loops for different editor frames. However,
+;; its interactions with typein and typeout don't quite work, so
+;; I'm commenting out the code that deals with this.
+;(define *reader-continuation* #f)
+
 (define editor-input-port)
 
 (define (with-editor-input-port new-port thunk)
   (fluid-let ((editor-input-port new-port))
     (thunk)))
 
+(define-integrable (set-editor-input-port! new-port)
+  (set! editor-input-port new-port))
+
 (define-integrable (keyboard-active? delay)
   (char-ready? editor-input-port delay))
 
@@ -231,4 +240,39 @@ B 3BAB8C
               (set! command-prompt-displayed? true)
               (set-message! command-prompt-string))
             (clear-message!))))
-  (remap-alias-char (read-char editor-input-port)))
\ No newline at end of file
+  (remap-alias-char
+   (let loop ()
+     (before-reading-maybe-do-something)
+     (let ((char
+#| see comment for *reader-continuation* 
+           (call-with-current-continuation
+            (lambda (continuation)
+              (fluid-let ((*reader-continuation* continuation))
+|#
+                (read-char editor-input-port)))
+#|
+            )))
+|#
+       (if (and char (not (eof-object? char)))
+          char
+          (loop))))))
+\f
+#| see comment for *reader-continuation*
+(define (switch-reader new-reader save-old-reader)
+  (if *reader-continuation*
+      (save-old-reader *reader-continuation*))
+  (if (within-typein-edit?)
+      (abort-current-command (lambda () (new-reader #f)))
+      (new-reader #f)))
+|#
+
+(define *reader-do-before-next-read* #f)
+
+(define (set-reader-do-before-next-read! to-do)
+  (set! *reader-do-before-next-read* to-do))
+
+(define (before-reading-maybe-do-something)
+  (if *reader-do-before-next-read*
+      (begin
+       (*reader-do-before-next-read*)
+       (set! *reader-do-before-next-read* #f))))
\ No newline at end of file
index e11ec3d06d87d27362545166bda6ad6e8def7e5d..b8ddb4b9369d11413605912c327ccc203c0fa27b 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/prompt.scm,v 1.136 1989/08/14 09:49:13 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/prompt.scm,v 1.137 1990/08/31 20:12:48 markf Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -89,7 +89,8 @@ recursive minibuffers."
                 (let ((window (typein-window)))
                   (select-window window)
                   (select-buffer
-                   (find-or-create-buffer
+                   (bufferset-find-or-create-buffer
+                    (editor-frame-typein-bufferset (current-editor-frame))
                     (string-append " *Typein-"
                                    (number->string typein-edit-depth)
                                    "*")))
@@ -516,11 +517,13 @@ a repetition of this command will exit."
         (lambda (new-string)
           (let ((end (string-length new-string)))
             (let ((index
-                   (substring-find-next-char-not-of-syntax
-                    new-string
-                    (string-length string)
-                    end
-                    #\w)))            (if index
+                   (and (string-prefix? string new-string)
+                        (substring-find-next-char-not-of-syntax
+                         new-string
+                         (string-length string)
+                         end
+                         #\w))))
+              (if index
                   (substring new-string 0 (1+ index))
                   new-string))))))
     (let ((if-unique
diff --git a/v7/src/edwin/scrcom.scm b/v7/src/edwin/scrcom.scm
new file mode 100644 (file)
index 0000000..0b9be7c
--- /dev/null
@@ -0,0 +1,61 @@
+;;; -*-Scheme-*-
+;;;
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/scrcom.scm,v 1.1 1990/08/31 20:12:53 markf Exp $
+;;;
+;;;    Copyright (c) 1987, 1989 Massachusetts Institute of Technology
+;;;
+;;;    This material was developed by the Scheme project at the
+;;;    Massachusetts Institute of Technology, Department of
+;;;    Electrical Engineering and Computer Science.  Permission to
+;;;    copy this software, to redistribute it, and to use it for any
+;;;    purpose is granted, subject to the following restrictions and
+;;;    understandings.
+;;;
+;;;    1. Any copy made of this software must include this copyright
+;;;    notice in full.
+;;;
+;;;    2. Users of this software agree to make their best efforts (a)
+;;;    to return to the MIT Scheme project any improvements or
+;;;    extensions that they make, so that these may be included in
+;;;    future releases; and (b) to inform MIT of noteworthy uses of
+;;;    this software.
+;;;
+;;;    3. All materials developed as a consequence of the use of this
+;;;    software shall duly acknowledge such use, in accordance with
+;;;    the usual standards of acknowledging credit in academic
+;;;    research.
+;;;
+;;;    4. MIT has made no warrantee or representation that the
+;;;    operation of this software will be error-free, and MIT is
+;;;    under no obligation to provide any services, by way of
+;;;    maintenance, update, or otherwise.
+;;;
+;;;    5. In conjunction with products arising from the use of this
+;;;    material, there shall be no use of the name of the
+;;;    Massachusetts Institute of Technology nor of any adaptation
+;;;    thereof in any advertising, promotional, or sales literature
+;;;    without prior written consent from MIT in each case.
+;;;
+;;; NOTE: Parts of this program (Edwin) were created by translation
+;;; from corresponding parts of GNU Emacs.  Users should be aware that
+;;; the GNU GENERAL PUBLIC LICENSE may apply to these parts.  A copy
+;;; of that license should have been included along with this file.
+;;;
+
+;;;; Screen Commands
+
+(declare (usual-integrations))
+\f
+(define-command delete-screen
+  "Delete the screen that point is in. If this is the last screen,
+then a message is diplayed and the screen is not deleted."
+  ()
+  (lambda ()
+    (if (> (length (all-screens)) 1)
+       (delete-current-screen!)
+       (message "Can't delete the last screen."))))
+
+(define-command create-new-screen
+  "Create a new screen with the current buffer in it."
+  ()
+  (lambda () (create-new-frame (current-buffer))))
\ No newline at end of file
index d84acb447735edb9f8107fa650b06f4573e21322..5898bac654b6329868df31134e2aabc95caa6969 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/xcom.scm,v 1.3 1989/08/12 08:32:52 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/xcom.scm,v 1.4 1990/08/31 20:13:00 markf Exp $
 ;;;
 ;;;    Copyright (c) 1989 Massachusetts Institute of Technology
 ;;;
@@ -69,7 +69,9 @@
   (x-window-set-internal-border-width 2)
   (xterm-x-size 1)
   (xterm-y-size 1)
-  (xterm-set-size 3))
+  (xterm-set-size 3)
+  (x-set-window-name 2)
+  (x-set-icon-name 2))
 
 (define (current-xterm)
   (screen-xterm (current-screen)))
@@ -243,6 +245,18 @@ When called interactively, completion is available on the input."
      "watch"
      "xterm"))
 \f
+(define-command x-set-window-name
+  "Set X window name to NAME."
+  "sSet X window name"
+  (lambda (name)
+    (x-set-window-name (current-xterm) name)))
+
+(define-command x-set-icon-name
+  "Set X window icon name to NAME."
+  "sSet X window icon name"
+  (lambda (name)
+    (x-set-icon-name (current-xterm) name)))
+\f
 ;;;; Mouse Commands
 
 (define-command x-mouse-select
@@ -316,4 +330,23 @@ Display cursor at that position for a second."
 (define-key 'fundamental button4-up 'x-mouse-ignore)
 (define-key 'fundamental button5-up 'x-mouse-ignore)
 
-(define-key 'fundamental button1-down 'x-mouse-set-point)
\ No newline at end of file
+(define-key 'fundamental button1-down 'x-mouse-set-point)
+
+;;; set X window name and X icon name to current buffer name
+(let ((old-hook (ref-variable select-buffer-hook))
+      (new-hook
+       (lambda (buffer window)
+        (if (eq? (editor-display-type) x-display-type-name)
+            (let ((xterm
+                   (screen-xterm
+                    (editor-frame-screen (window-root-window window))))
+                  (name (buffer-name buffer)))
+              (x-set-window-name xterm name)
+              (x-set-icon-name xterm name))))))
+  (set-variable!
+   select-buffer-hook
+   (if old-hook
+       (lambda (buffer window)
+        (old-hook buffer window)
+        (new-hook buffer window))
+       new-hook)))
\ No newline at end of file
index 665b6e782b766388c5db006a18ca0a9c3620b013..8adffea95d621a74b20bf6dea4160c0d7b63bbb1 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/xterm.scm,v 1.8 1989/08/12 08:32:56 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/xterm.scm,v 1.9 1990/08/31 20:13:06 markf Exp $
 ;;;
 ;;;    Copyright (c) 1989 Massachusetts Institute of Technology
 ;;;
   (xterm-read-chars 2)
   (xterm-button 1)
   (xterm-pointer-x 1)
-  (xterm-pointer-y 1))
+  (xterm-pointer-y 1)
+  (x-dequeue-global-event 0)
+  (x-window-pixel-coord->char-coord 2)
+  (x-set-window-name 2)
+  (x-set-icon-name 2))
 
 (define-structure (xterm-screen-state
                   (constructor make-xterm-screen-state (xterm))
   (highlight 0))
 
 (define (make-xterm-screen #!optional geometry)
-  (make-screen (make-xterm-screen-state
-               (xterm-open-window (or (get-x-display)
+  (let* ((xterm (xterm-open-window (or (get-x-display)
                                       (error "unable to open display"))
                                   (and (not (default-object? geometry))
                                        geometry)
                                   false))
-              xterm-screen/beep
-              xterm-screen/finish-update!
-              xterm-screen/flush!
-              xterm-screen/inverse-video!
-              xterm-screen/start-update!
-              xterm-screen/subscreen-clear!
-              xterm-screen/write-char!
-              xterm-screen/write-cursor!
-              xterm-screen/write-substring!
-              xterm-screen/write-substrings!
-              xterm-screen/x-size
-              xterm-screen/y-size
-              xterm-screen/wipe!
-              xterm-screen/enter!
-              xterm-screen/exit!
-              xterm-screen/discard!))
+        (screen (make-screen (make-xterm-screen-state xterm)
+                             xterm-screen/beep
+                             xterm-screen/finish-update!
+                             xterm-screen/flush!
+                             xterm-screen/inverse-video!
+                             xterm-screen/start-update!
+                             xterm-screen/subscreen-clear!
+                             xterm-screen/write-char!
+                             xterm-screen/write-cursor!
+                             xterm-screen/write-substring!
+                             xterm-screen/write-substrings!
+                             xterm-screen/x-size
+                             xterm-screen/y-size
+                             xterm-screen/wipe!
+                             xterm-screen/enter!
+                             xterm-screen/exit!
+                             xterm-screen/discard!)))
+    (add-to-xterm-screen-alist xterm screen)
+    screen))
 
 (define-integrable (screen-xterm screen)
   (xterm-screen-state/xterm (screen-state screen)))
 
 (define-integrable (screen-highlight screen)
   (xterm-screen-state/highlight (screen-state screen)))
+
+(define xterm-screen-alist '())
+
+(define (add-to-xterm-screen-alist xterm screen)
+  (set! xterm-screen-alist (cons (cons xterm screen) xterm-screen-alist)))
+
+(define (xterm->screen xterm)
+  (let ((entry (assv xterm xterm-screen-alist)))
+    (and entry (cdr entry))))
 \f
 (define-integrable (set-screen-highlight! screen highlight)
   (set-xterm-screen-state/highlight! (screen-state screen) highlight))
 
 (define (xterm-screen/start-update! screen)
-  (xterm-screen/process-events! screen))
+  screen                               ;ignored
+  unspecific)
 
 (define (xterm-screen/finish-update! screen)
   (x-window-flush (screen-xterm screen)))
   unspecific)
 
 (define (xterm-screen/enter! screen)
-  screen                               ; ignored
+  (if (not (eq? screen (current-screen)))
+      (change-screen screen))
   unspecific)
 
 (define (xterm-screen/exit! screen)
 \f
 (define (refill-buffer! state index)
   (let ((screen (xterm-input-port-state/screen state)))
-    (let loop ()
-      (let ((buffer (xterm-screen/read-chars screen false)))
-       (if (not buffer)
-           (loop)
-           (begin
-             (check-for-interrupts! state buffer index)
-             (string-ref buffer 0)))))))
+    (let ((buffer (xterm-screen/read-chars screen #f)))
+      (and buffer
+          (begin
+            (check-for-interrupts! state buffer index)
+            (string-ref buffer 0))))))
 
 (define (xterm-screen/read-chars screen interval)
   (let ((result (xterm-read-chars (screen-xterm screen) interval)))
     (if (and (not (screen-in-update? screen))
-            (xterm-screen/process-events! screen))
-       (update-screen! screen false))
+            (xterm-process-events!))
+       (update-screens! false))
     result))
 
 (define (check-for-interrupts! state buffer index)
                    (if (and old-mask pending-interrupt?)
                        (signal-interrupt!))))))
 \f
-(define (xterm-screen/process-events! screen)
-  (let ((xterm (screen-xterm screen))
-       (window (screen-window screen)))
-    (and window
-        (let ((handlers
-               (vector-ref xterm-event-flags->handlers
-                           (x-window-read-event-flags! xterm))))
-          (and (not (null? handlers))
-               (begin
-                 (for-each (lambda (handler) (handler xterm window)) handlers)
-                 true))))))
-
-(define-integrable xterm-event-flag:resized 0)
-(define-integrable xterm-event-flag:button-down 1)
-(define-integrable xterm-event-flag:button-up 2)
-(define-integrable xterm-number-of-event-flags 3)
+
+;;; The values of these flags must be equal to the corresponding 
+;;; event types in microcode/x11.h
+
+(define-integrable x-event-type:unknown 0)
+(define-integrable x-event-type:resized 1)
+(define-integrable x-event-type:button-down 2)
+(define-integrable x-event-type:button-up 3)           
+(define-integrable x-event-type:focus_in 4)    
+(define-integrable x-event-type:focus_out 5)           
+(define-integrable x-event-type:enter 6)               
+(define-integrable x-event-type:leave 7)               
+(define-integrable x-event-type:motion 8)              
+(define-integrable x-event-type:configure 9)                   
+(define-integrable x-event-type:map 10)                
+(define-integrable x-event-type:unmap 11)              
+(define-integrable x-event-type:expose 12)
+(define-integrable x-event-type:no_expose 13) 
+(define-integrable x-event-type:graphics_expose 14) 
+(define-integrable x-event-type:key_press 15) 
+
+(define-integrable xterm-number-of-event-types 16)
+
+(define-integrable event-type car)
+(define-integrable event-xterm cadr)
+(define-integrable event-extra cddr)
+
+(define (xterm-process-events!)
+  (let ((event (x-dequeue-global-event)))
+    (and event
+        (let loop ((event event))
+          (if (null? event)
+              true
+              (let ((event-type (event-type event))
+                    (screen (xterm->screen (event-xterm event)))
+                    (extra (event-extra event)))
+                (let ((handler (x-event-type->handler event-type)))
+                  (if handler (apply handler screen extra))
+                  (if (eq? event-type x-event-type:key_press)
+                      true
+                      (loop (x-dequeue-global-event))))))))))
+
+(define xterm-event-handlers
+  (make-vector xterm-number-of-event-types false))
+
+(define-integrable (x-event-type->handler event-type)
+  (vector-ref xterm-event-handlers event-type))
 
 (define (define-xterm-event-handler event handler)
   (vector-set! xterm-event-handlers event handler)
-  (set! xterm-event-flags->handlers
-       (binary-powerset-vector xterm-event-handlers))
   unspecific)
 
-(define (binary-powerset-vector items)
-  (let ((n-items (vector-length items)))
-    (let ((table-length (expt 2 n-items)))
-      (let ((table (make-vector table-length '())))
-       (let loop ((i 1))
-         (if (< i table-length)
-             (begin
-               (vector-set!
-                table
-                i
-                (let loop ((i i) (index 0))
-                  (if (zero? i)
-                      '()
-                      (let ((qr (integer-divide i 2)))
-                        (let ((rest
-                               (loop (integer-divide-quotient qr)
-                                     (1+ index))))
-                          (if (zero? (integer-divide-remainder qr))
-                              rest
-                              (cons (vector-ref items index) rest)))))))
-               (loop (1+ i)))))
-       table))))
+(define-xterm-event-handler x-event-type:configure
+  (lambda (screen)
+    (let ((xterm (screen-xterm screen)))
+      (send (screen-window screen) ':set-size!
+           (xterm-x-size xterm)
+           (xterm-y-size xterm)))))
+
+(define-xterm-event-handler x-event-type:button-down
+  (lambda (screen button x y)
+    (let ((character-coords
+         (x-window-pixel-coord->char-coord
+          (screen-xterm screen)
+          (cons x y))))
+      (send (screen-window screen) ':button-event!
+           (button-downify button)
+           (car character-coords)
+           (cdr character-coords)))))
+
+(define-xterm-event-handler x-event-type:button-up
+  (lambda (screen button x y)
+    (let ((character-coords
+         (x-window-pixel-coord->char-coord
+          (screen-xterm screen)
+          (cons x y))))
+      (send (screen-window screen) ':button-event!
+           (button-upify button)
+           (car character-coords)
+           (cdr character-coords)))))
+
+(define-xterm-event-handler x-event-type:focus_in
+  (lambda (screen)
+    (xterm-screen/enter! screen)))
 
-(define xterm-event-handlers
-  (make-vector xterm-number-of-event-flags false))
-
-(define xterm-event-flags->handlers)
-  
-(define-xterm-event-handler xterm-event-flag:resized
-  (lambda (xterm window)
-    (send window ':set-size!
-         (xterm-x-size xterm)
-         (xterm-y-size xterm))))
-
-(define-xterm-event-handler xterm-event-flag:button-down
-  (lambda (xterm window)
-    (send window ':button-event!
-         (button-downify (xterm-button xterm))
-         (xterm-pointer-x xterm)
-         (xterm-pointer-y xterm))))
-
-(define-xterm-event-handler xterm-event-flag:button-up
-  (lambda (xterm window)
-    (send window ':button-event!
-         (button-upify (xterm-button xterm))
-         (xterm-pointer-x xterm)
-         (xterm-pointer-y xterm))))
 \f
 (define button1-down)
 (define button2-down)
   (set! x-display-data false)
   unspecific)
 
+(define x-display-type-name 'X)
+
 (define (initialize-package!)
   (set! x-display-type
-       (make-display-type 'X
+       (make-display-type x-display-type-name
                           get-x-display
                           make-xterm-screen
                           make-xterm-input-port
   (set! button3-up (button-upify 2))
   (set! button4-up (button-upify 3))
   (set! button5-up (button-upify 4))
-  unspecific)
\ No newline at end of file
+  unspecific)