Change KEYBOARD-READ, KEYBOARD-PEEK, and KEYBOARD-PEEK-NO-HANG to
authorChris Hanson <org/chris-hanson/cph>
Sun, 1 Aug 1993 00:16:08 +0000 (00:16 +0000)
committerChris Hanson <org/chris-hanson/cph>
Sun, 1 Aug 1993 00:16:08 +0000 (00:16 +0000)
intercept "update" and "resize" events and to handle them rather than
returning them.  Other events with potentially troublesome actions are
returned as before.  Additionally, several places where input events
were discarded have been fixed -- input events must ALWAYS be handled.

v7/src/edwin/comred.scm
v7/src/edwin/edwin.pkg
v7/src/edwin/input.scm
v7/src/edwin/prompt.scm
v7/src/edwin/tterm.scm
v7/src/edwin/xterm.scm

index f84fceb691332fe526f14189b5c35c60da0628c2..23da6f56362badef6645a86cd846f25a05b52847 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Id: comred.scm,v 1.97 1993/07/06 20:35:48 cph Exp $
+;;;    $Id: comred.scm,v 1.98 1993/08/01 00:15:49 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989-93 Massachusetts Institute of Technology
 ;;;
 (define-structure (input-event
                   (constructor %make-input-event)
                   (conc-name input-event/))
+  (type false read-only true)
   (operator false read-only true)
   (operands false read-only true))
 
-(define (make-input-event operator . operands)
-  (%make-input-event operator operands))
+(define (make-input-event type operator . operands)
+  (%make-input-event type operator operands))
 
 (define (apply-input-event input-event)
   (if (not (input-event? input-event))
index 813589f5bc5fb43bde850f3f4732ef6315a155bc..78a71157f9fd9b310367c5d8b55c8823cfd542ca 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Id: edwin.pkg,v 1.119 1993/07/22 21:06:43 cph Exp $
+$Id: edwin.pkg,v 1.120 1993/08/01 00:15:52 cph Exp $
 
 Copyright (c) 1989-1993 Massachusetts Institute of Technology
 
@@ -419,6 +419,7 @@ MIT in each case. |#
          execute-command
          execute-command-history-entry
          initialize-command-reader!
+         input-event/type
          input-event?
          keyboard-keys-read
          last-command
index 9edf991635322c7739ceb4131111804e735c3379..8df6fe0c69cfa9f86c68ac478720f1feb9d01b5a 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/input.scm,v 1.93 1992/02/18 20:47:26 arthur Exp $
+;;;    $Id: input.scm,v 1.94 1993/08/01 00:15:55 cph Exp $
 ;;;
-;;;    Copyright (c) 1986, 1989-92 Massachusetts Institute of Technology
+;;;    Copyright (c) 1986, 1989-93 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
@@ -181,7 +181,7 @@ B 3BAB8C
       (keyboard-read-1 (editor-peek current-editor))))
 
 (define (keyboard-read)
-  (set! keyboard-keys-read (1+ keyboard-keys-read))
+  (set! keyboard-keys-read (+ keyboard-keys-read 1))
   (if *executing-keyboard-macro?*
       (keyboard-macro-read-key)
       (let ((key (keyboard-read-1 (editor-read current-editor))))
@@ -194,19 +194,36 @@ B 3BAB8C
               ((ref-command end-kbd-macro) 1)))
        key)))
 
+(define (keyboard-read-1 reader)
+  (handle-simple-events (lambda () (keyboard-read-2 reader))))
+
 (define (keyboard-peek-no-hang)
-  ((editor-peek-no-hang current-editor)))
+  (handle-simple-events (editor-peek-no-hang current-editor)))
 
-(define (keyboard-read-char)
-  (let loop ((key (keyboard-read)))
-    (if (char? key)
-       key
-       (loop (keyboard-read)))))
+(define (handle-simple-events thunk)
+  (let loop ()
+    (let ((input (thunk)))
+      (if (and (input-event? input)
+              (memq (input-event/type input) '(UPDATE SET-SCREEN-SIZE)))
+         (begin
+           (apply-input-event input)
+           (loop))
+         input))))
 
+(define (keyboard-read-char)
+  (let loop ()
+    (let ((key (keyboard-read)))
+      (if (char? key)
+         key
+         (begin
+           (if (input-event? key)
+               (apply-input-event key))
+           (loop))))))
+\f
 (define read-key-timeout/fast 500)
 (define read-key-timeout/slow 2000)
 
-(define (keyboard-read-1 reader)
+(define (keyboard-read-2 reader)
   (remap-alias-key
    (let ((peek-no-hang (editor-peek-no-hang current-editor)))
      (if (not (peek-no-hang))
index fee36d533e9d56b6817416c4b4a52f8716a31227..e2b846aea9d7f48f048348fa71f4b9aa7495eacb 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Id: prompt.scm,v 1.156 1992/11/29 20:22:37 bal Exp $
+;;;    $Id: prompt.scm,v 1.157 1993/08/01 00:15:58 cph Exp $
 ;;;
-;;;    Copyright (c) 1986, 1989-92 Massachusetts Institute of Technology
+;;;    Copyright (c) 1986, 1989-93 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
                        (select-window (car typein-saved-windows)))
                       ((zero? typein-edit-depth)
                        (select-window (other-window)))))))))))
-    (if (eq? value typein-edit-abort-flag)
-       (abort-current-command)
-       value)))
+    (cond ((eq? value typein-edit-abort-flag)
+          (abort-current-command))
+         ((and (pair? value) (eq? (car value) typein-edit-abort-flag))
+          (abort-current-command (cdr value)))
+         (else
+          value))))
 
 (define-integrable (within-typein-edit?)
   (not (null? typein-saved-windows)))
   (set-current-major-mode! mode)
   (command-reader))
 
+(define (abort-typein-edit event)
+  (typein-edit-continuation (cons typein-edit-abort-flag event)))
+
 (define (exit-typein-edit)
   (if (not typein-edit-continuation)
       (error "Not editing typein; can't exit"))
@@ -633,13 +639,12 @@ a repetition of this command will exit."
             (let ((input (with-editor-interrupts-disabled keyboard-read)))
               (if (and (char? input) (char-ascii? input))
                   (set-typein-string! (key-name input) true))
-              input)))))
-    (cond ((and (char? input) (char-ascii? input))
-          input)
-         ((input-event? input)
-          (abort-current-command input))
-         (else
-          (editor-error "Not an ASCII character:" input)))))
+              (if (input-event? input)
+                  (abort-typein-edit input)
+                  input))))))
+    (if (not (and (char? input) (char-ascii? input)))
+       (editor-error "Not an ASCII character:" input))
+    input))
 
 (define (prompt-for-key prompt #!optional comtab)
   (let ((comtab (if (default-object? comtab) (current-comtabs) comtab)))
@@ -649,9 +654,7 @@ a repetition of this command will exit."
          (let inner-loop
              ((char (with-editor-interrupts-disabled keyboard-read)))
            (if (input-event? char)
-               (within-continuation typein-edit-continuation
-                 (lambda ()
-                   (abort-current-command char))))
+               (abort-typein-edit char))
            (let ((chars (append! prefix (list char))))
              (set-typein-string! (xkey->name chars) true)
              (if (prefix-key-list? comtab chars)
@@ -680,6 +683,8 @@ a repetition of this command will exit."
                          (char-ci=? char #\rubout)))
                 (set-typein-string! "n" true)
                 false)
+               ((input-event? char)
+                (abort-typein-edit char))
                (else
                 (editor-beep)
                 (if (not lost?)
@@ -782,29 +787,30 @@ Whilst editing the command, the following commands are available:
 ;;; in unix.scm which deal with .KY files.
 
 (define (prompt-for-password prompt)
-  (prompt-for-typein 
-   prompt false
-   (lambda ()
-     (let loop ((ts ""))
-       (let ((input (keyboard-read)))
-        (if (and (char? input) (char-ascii? input))
-            (cond ((char=? input #\Return)
-                   ts)
-                  ((char=? input #\C-g)
-                   (abort-current-command))
-                  ((char=? input #\Rubout)
-                   (let ((ts-len (string-length ts)))
-                     (if (> ts-len 0)
-                         (let ((new-string (string-head ts (-1+ ts-len))))
-                           (set-typein-string!
-                            (make-string (string-length new-string) #\.) true)
-                           (loop new-string))
-                         (loop ts))))
-                  (else
-                   (set-typein-string!
-                    (make-string (1+ (string-length ts)) #\.) true)
-                   (loop (string-append ts (char->string input)))))
-            (loop ts)))))))
+  (prompt-for-typein prompt false
+    (lambda ()
+      (let loop ((ts ""))
+       (let ((input (keyboard-read)))
+         (cond ((input-event? input)
+                (abort-typein-edit input))
+               ((not (and (char? input) (char-ascii? input)))
+                (loop ts))
+               ((char=? input #\Return)
+                ts)
+               ((char=? input #\C-g)
+                (abort-current-command))
+               ((char=? input #\Rubout)
+                (let ((ts-len (string-length ts)))
+                  (if (> ts-len 0)
+                      (let ((new-string (string-head ts (-1+ ts-len))))
+                        (set-typein-string!
+                         (make-string (string-length new-string) #\.) true)
+                        (loop new-string))
+                      (loop ts))))
+               (else
+                (set-typein-string!
+                 (make-string (1+ (string-length ts)) #\.) true)
+                (loop (string-append ts (char->string input))))))))))
 
 (define (prompt-for-confirmed-password)
   (let ((password1 (prompt-for-password "Password: ")))
index 000a1c8fa44ceaa95efbc8259c7636ce5a5d6630..5024ca1b105c2accb10523915946507f9ffaf430 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Id: tterm.scm,v 1.20 1993/07/16 19:20:22 gjr Exp $
+$Id: tterm.scm,v 1.21 1993/08/01 00:16:01 cph Exp $
 
 Copyright (c) 1990-1993 Massachusetts Institute of Technology
 
@@ -190,7 +190,7 @@ MIT in each case. |#
              (cond ((char? event)
                     event)
                    ((process-change-event event)
-                    (make-input-event update-screens! #f))
+                    (make-input-event 'UPDATE update-screens! #f))
                    (else
                     (guarantee-result)))))))
       (values
index 76708d3c1d3623567cf388f1b554c7200255645a..73afb99cc03d456bfe125ba3f41f4e3c7a2b6c89 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Id: xterm.scm,v 1.39 1993/04/28 19:51:10 cph Exp $
+;;;    $Id: xterm.scm,v 1.40 1993/08/01 00:16:08 cph Exp $
 ;;;
 ;;;    Copyright (c) 1989-93 Massachusetts Institute of Technology
 ;;;
                            (error "#F returned from blocking read"))
                           ((not (vector? event))
                            (if (process-change-event event)
-                               (make-input-event update-screens! #f)
+                               (make-input-event 'UPDATE update-screens! #f)
                                (loop)))
                           (else
                            (or (process-event event) (loop)))))))))
   (lambda (screen event)
     (set! last-focus-time (vector-ref event 5))
     (let ((xterm (screen-xterm screen)))
-      (make-input-event execute-button-command
+      (make-input-event 'BUTTON
+                       execute-button-command
                        screen
                        (make-down-button (vector-ref event 4))
                        (xterm-map-x-coordinate xterm (vector-ref event 2))
   (lambda (screen event)
     (set! last-focus-time (vector-ref event 5))
     (let ((xterm (screen-xterm screen)))
-      (make-input-event execute-button-command
+      (make-input-event 'BUTTON
+                       execute-button-command
                        screen
                        (make-up-button (vector-ref event 4))
                        (xterm-map-x-coordinate xterm (vector-ref event 2))
            (y-size (xterm-map-y-size xterm y-size)))
        (and (not (and (= x-size (screen-x-size screen))
                       (= y-size (screen-y-size screen))))
-            (make-input-event
-             (lambda (screen x-size y-size)
-               (set-screen-size! screen x-size y-size)
-               (update-screen! screen #t))
-             screen x-size y-size))))))
+            (make-input-event 'SET-SCREEN-SIZE
+                              (lambda (screen x-size y-size)
+                                (set-screen-size! screen x-size y-size)
+                                (update-screen! screen #t))
+                              screen x-size y-size))))))
 
 (define-event-handler event-type:focus-in
   (lambda (screen event)
     event
     (and (not (selected-screen? screen))
-        (make-input-event select-screen screen))))
+        (make-input-event 'SELECT-SCREEN select-screen screen))))
 
 (define-event-handler event-type:delete-window
   (lambda (screen event)
     event
     (and (not (screen-deleted? screen))
-        (make-input-event delete-screen! screen))))
+        (make-input-event 'DELETE-SCREEN delete-screen! screen))))
 
 (define-event-handler event-type:map
   (lambda (screen event)
     (and (not (screen-deleted? screen))
         (begin
           (set-screen-visibility! screen 'VISIBLE)
-          (make-input-event update-screen! screen #t)))))
+          (make-input-event 'UPDATE update-screen! screen #t)))))
 
 (define-event-handler event-type:unmap
   (lambda (screen event)
           (and (selected-screen? screen)
                (let ((screen (other-screen screen false)))
                  (and screen
-                      (make-input-event select-screen screen))))))))
+                      (make-input-event 'SELECT-SCREEN
+                                        select-screen
+                                        screen))))))))
 
 (define-event-handler event-type:visibility
   (lambda (screen event)
               ((2) (set-screen-visibility! screen 'OBSCURED)))
              (and (or (eq? old-visibility 'UNMAPPED)
                       (eq? old-visibility 'OBSCURED))
-                  (make-input-event update-screen! screen #t)))))))
+                  (make-input-event 'UPDATE update-screen! screen #t)))))))
 
 (define-event-handler event-type:take-focus
   (lambda (screen event)
     (set! last-focus-time (vector-ref event 2))
-    (make-input-event select-screen screen)))
+    (make-input-event 'SELECT-SCREEN select-screen screen)))
 \f
 (define reading-event?)
 (define signal-interrupts?)