Change to use runtime system's "os2winp" support. Change
authorChris Hanson <org/chris-hanson/cph>
Fri, 6 Jan 1995 01:12:44 +0000 (01:12 +0000)
committerChris Hanson <org/chris-hanson/cph>
Fri, 6 Jan 1995 01:12:44 +0000 (01:12 +0000)
corresponding to microcode which now supports multiple event queues
for windows.  Add subprocess support.  Reimplement management of state
so that windows are closed down properly when the editor is killed.
Change code that "controlifies" input characters -- previously it was
not doing this correctly.  Change handling of paint events to clear
the region being painted before drawing in it -- previously the
microcode took care of this, but it no longer does so.

v7/src/edwin/os2term.scm

index 91b9662cbbbf7d4463832d65263eb008f1d76217..776f93dd58085ac2ffd439731e27675c2b6f43b2 100644 (file)
@@ -1,8 +1,8 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Id: os2term.scm,v 1.1 1994/12/19 19:46:29 cph Exp $
+;;;    $Id: os2term.scm,v 1.2 1995/01/06 01:12:44 cph Exp $
 ;;;
-;;;    Copyright (c) 1994 Massachusetts Institute of Technology
+;;;    Copyright (c) 1994-95 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
 ;;;    Massachusetts Institute of Technology, Department of
 ;;; Package: (edwin screen os2-screen)
 
 (declare (usual-integrations))
+(declare (integrate-external "..\\runtime\\os2winp"))
 \f
 (define os2-display-type)
 (define screen-list)
 (define event-queue)
+(define event-descriptor)
 (define virtual-key-table)
 (define signal-interrupts?)
-(define event-descriptor)
 (define previewer-registration)
 (define reading-event?)
 (define desktop-width)
                           with-editor-interrupts-from-os2
                           with-os2-interrupts-enabled
                           with-os2-interrupts-disabled))
-  (set! screen-list '())
-  (set! event-queue (make-queue))
   (set! virtual-key-table (make-virtual-key-table))
-  (set! event-descriptor (os2win-event-descriptor))
-  unspecific)
+  (set! event-descriptor #f)
+  (add-event-receiver! event:before-exit finalize-pm-state))
+
+(define (initialize-pm-state)
+  (if (not event-descriptor)
+      (begin
+       (set! screen-list '())
+       (set! event-queue (make-queue))
+       (set! event-descriptor (os2win-open-event-qid))
+       unspecific)))
+
+(define (finalize-pm-state)
+  (if event-descriptor
+      (begin
+       (do () ((null? screen-list))
+         (os2-screen/discard! (car screen-list)))
+       (set! event-queue)
+       (os2win-close-event-qid event-descriptor)
+       (set! event-descriptor #f)
+       unspecific)))
 
 (define (with-editor-interrupts-from-os2 receiver)
   (fluid-let ((reading-event? #f)
              (signal-interrupts? #t)
              (previewer-registration))
     (dynamic-wind (lambda ()
+                   (initialize-pm-state)
                    (preview-event-stream)
                    (set! desktop-width (os2win-desktop-width))
                    (set! desktop-height (os2win-desktop-height))
                  (lambda ()
                    (receiver (lambda (thunk) (thunk)) '()))
                  (lambda ()
-                   (deregister-input-thread-event previewer-registration)))))
+                   (deregister-input-thread-event previewer-registration)
+                   (finalize-pm-state)))))
 
 (define (with-os2-interrupts-enabled thunk)
   (with-signal-interrupts #t thunk))
                    unspecific))))
 \f
 (define (make-os2-screen)
+  ;; Call to INITIALIZE-PM-STATE needed because first screen is built
+  ;; before the display is grabbed.  This is a bug that should be
+  ;; fixed -- the display grab should be the very first thing that
+  ;; happens.
+  (initialize-pm-state)
   (call-with-values open-window
     (lambda (state x-size y-size)
       (let ((screen
        screen))))
 
 (define (open-window)
-  (let ((wid (os2win-open "Edwin")))
+  (let ((wid (os2win-open-1 event-descriptor 0 "Edwin")))
     (let ((metrics (set-normal-font! wid current-font)))
       (os2win-set-colors wid
                         (face-foreground-color normal-face)
                                       (make-vector size normal-face))
                    x-size
                    y-size)))))))
-
+\f
 (define (os2-screen/beep screen)
   screen
   (os2win-beep 880 50))
   (os2win-clear (screen-wid screen)
                0 (screen-pel-width screen)
                0 (screen-pel-height screen)))
-\f
+
 (define (os2-screen/discard! screen)
   (set! screen-list (delq! screen screen-list))
   (os2win-close (screen-wid screen)))
-
+\f
 (define (os2-screen/enter! screen)
   screen
   unspecific)
   (set! highlight-face
        (make-face color (face-background-color highlight-face)))
   unspecific)
-
+\f
 (define (os2-screen/set-font! screen font)
   (set-screen-font-metrics! screen (set-normal-font! (screen-wid screen) font))
   (set! current-font font)
 (define-integrable (set-screen-current-face! screen face)
   (set-screen-state/current-face! (screen-state screen) face))
 
-(define-structure (font-metrics (type vector) (conc-name font-metrics/))
-  (width #f read-only #t)
-  (height #f read-only #t)
-  (descender #f read-only #t))
-
 (define-integrable (screen-char-width screen)
   (font-metrics/width (screen-font-metrics screen)))
 
     (let ((event
           (if (queue-empty? event-queue)
               (if (eq? 'IN-UPDATE block?)
-                  (os2win-get-event #f)
+                  (os2win-get-event event-descriptor #f)
                   (read-event-1 block?))
               (dequeue!/unsafe event-queue))))
       (set! reading-event? #f)
-      (if (and (vector? event)
-              (fix:= (vector-ref event 0) event-type:paint))
+      (if (and (vector? event) (fix:= (event-type event) event-type:paint))
          (begin
            (process-paint-event event)
            (loop))
          event))))
 
 (define (read-event-1 block?)
-  (or (os2win-get-event #f)
+  (or (os2win-get-event event-descriptor #f)
       (let loop ()
        (let ((interrupt-mask (set-interrupt-enables! interrupt-mask/gc-ok)))
          (cond (inferior-thread-changes?
                 (set-interrupt-enables! interrupt-mask)
                 event:inferior-thread-output)
+               ((process-output-available?)
+                (set-interrupt-enables! interrupt-mask)
+                event:process-output)
+               ((process-status-changes?)
+                (set-interrupt-enables! interrupt-mask)
+                event:process-status)
                (else
                 (let ((flag
                        (test-for-input-on-descriptor event-descriptor
                     ((INTERRUPT) (loop))
                     (else (read-event-1 block?))))))))))
 
+(define-integrable event:process-output -2)
+(define-integrable event:process-status -3)
+(define-integrable event:inferior-thread-output -4)
+
 (define (preview-event-stream)
   (set! previewer-registration
        (permanently-register-input-thread-event
         (current-thread)
         (lambda ()
           (if (not reading-event?)
-              (let ((event (os2win-get-event #f)))
+              (let ((event (os2win-get-event event-descriptor #f)))
                 (if event
                     (if (and signal-interrupts?
                              (vector? event)
               (cdr events)))
       ((null? events))
     (enqueue!/unsafe queue (car events))))
-
+\f
 (define (signal-interrupt!)
   (editor-beep)
   (temporary-message "Quit")
          (meta (if (fix:= 0 (fix:and flags KC_ALT)) 0 1)))
       (let ((process-code
             (lambda (code)
-              (if (and (fix:<= #o040 code) (not (fix:= 0 control)))
+              (if (and (fix:<= #o100 code) (fix:< code #o140)
+                       (not (fix:= 0 control)))
                   (make-char (fix:and code #o037) meta)
                   (make-char code (fix:or meta control))))))
        (if (fix:= 0 (fix:and flags KC_VIRTUALKEY))
        (else (error "Illegal change event:" event))))
 
 (define (process-paint-event event)
-  (let ((wid (event-wid event)))
+  (let ((wid (event-wid event))
+       (xl (paint-event/xl event))
+       (xh (paint-event/xh event))
+       (yl (paint-event/yl event))
+       (yh (paint-event/yh event)))
+    (os2win-clear wid xl xh yl yh)
     (let ((screen (wid->screen wid)))
       (if screen
-         (let ((cxl (xl->cxl screen (paint-event/xl event)))
-               (cxh (xh->cxh screen (paint-event/xh event)))
-               (cyl (yh->cyl screen (paint-event/yh event)))
-               (cyh (yl->cyh screen (paint-event/yl event)))
+         (let ((cxl (xl->cxl screen xl))
+               (cxh (xh->cxh screen xh))
+               (cyl (yh->cyl screen yh))
+               (cyh (yl->cyh screen yl))
                (char-map (screen-char-map screen))
                (face-map (screen-face-map screen))
                (x-size (screen-x-size screen))
                                      (outer index
                                             (fix:+ cxl (fix:- index start)))))
                                (inner (fix:+ index 1)))))))))))))))
-\f
+
 (define (process-special-event event)
   (let ((handler (vector-ref event-handlers (event-type event)))
        (screen (wid->screen (event-wid event))))
         (handler screen event))))
 
 (define event-handlers
-  (make-vector number-of-event-types false))
-
-(define-integrable (define-event-handler event-type handler)
+  (make-vector number-of-event-types #f))
+\f
+(define (define-event-handler event-type handler)
   (vector-set! event-handlers event-type handler))
 
 (define-event-handler event-type:button
     (vector-set! table VK_CLEAR                'CLEAR)
     (vector-set! table VK_EREOF                'EREOF)
     (vector-set! table VK_PA1          'PA1)
-    table))
-\f
-(define-primitives
-  (os2win-beep 2)
-  (os2win-open 1)
-  (os2win-close 1)
-  (os2win-show 2)
-  (os2win-write 6)
-  (os2win-move-cursor 3)
-  (os2win-shape-cursor 4)
-  (os2win-show-cursor 2)
-  (os2win-clear 5)
-  (os2win-scroll 7)
-  (os2win-invalidate 5)
-  (os2win-set-font 3)
-  (os2win-set-grid 3)
-  (os2win-activate 1)
-  (os2win-get-pos 1)
-  (os2win-set-pos 3)
-  (os2win-get-size 1)
-  (os2win-set-size 3)
-  (os2win-focus? 1)
-  (os2win-set-state 2)
-  (os2win-set-colors 3)
-  (os2win-get-event 1)
-  (os2win-event-ready? 1)
-  (os2win-event-descriptor 0)
-  (os2win-console-wid 0)
-  (os2win-desktop-width 0)
-  (os2win-desktop-height 0))
-
-(define-integrable event:process-output -2)
-(define-integrable event:process-status -3)
-(define-integrable event:inferior-thread-output -4)
-
-(define-integrable (event-type event) (vector-ref event 0))
-(define-integrable (event-wid event) (vector-ref event 1))
-
-(define-macro (define-event name type . slots)
-  `(BEGIN
-     (DEFINE-INTEGRABLE ,(symbol-append 'EVENT-TYPE: name) ,type)
-     ,@(let loop ((slots slots) (index 2))
-        (if (null? slots)
-            '()
-            (cons `(DEFINE-INTEGRABLE
-                     (,(symbol-append name '-EVENT/ (car slots)) EVENT)
-                     (VECTOR-REF EVENT ,index))
-                  (loop (cdr slots) (+ index 1)))))))
-
-;; These must match "microcode/pros2pm.c"
-(define-event button     0 number type x y flags)
-(define-event close      1)
-(define-event focus      2 gained?)
-(define-event key        3 code flags repeat)
-(define-event paint      4 xl xh yl yh)
-(define-event resize     5 width height)
-(define-event visibility 6 shown?)
-
-(define-integrable number-of-event-types 7)
-
-(define-integrable button-event-type:down 0)
-(define-integrable button-event-type:up 1)
-(define-integrable button-event-type:click 2)
-(define-integrable button-event-type:double-click 3)
-\f
-;;; Constants from OS/2 header file "pmwin.h":
-
-(define-integrable CURSOR_SOLID                #x0000)
-(define-integrable CURSOR_HALFTONE     #x0001)
-(define-integrable CURSOR_FRAME                #x0002)
-(define-integrable CURSOR_FLASH                #x0004)
-
-(define-integrable VK_BUTTON1          #x01)
-(define-integrable VK_BUTTON2          #x02)
-(define-integrable VK_BUTTON3          #x03)
-(define-integrable VK_BREAK            #x04)
-(define-integrable VK_BACKSPACE                #x05)
-(define-integrable VK_TAB              #x06)
-(define-integrable VK_BACKTAB          #x07)
-(define-integrable VK_NEWLINE          #x08)
-(define-integrable VK_SHIFT            #x09)
-(define-integrable VK_CTRL             #x0A)
-(define-integrable VK_ALT              #x0B)
-(define-integrable VK_ALTGRAF          #x0C)
-(define-integrable VK_PAUSE            #x0D)
-(define-integrable VK_CAPSLOCK         #x0E)
-(define-integrable VK_ESC              #x0F)
-(define-integrable VK_SPACE            #x10)
-(define-integrable VK_PAGEUP           #x11)
-(define-integrable VK_PAGEDOWN         #x12)
-(define-integrable VK_END              #x13)
-(define-integrable VK_HOME             #x14)
-(define-integrable VK_LEFT             #x15)
-(define-integrable VK_UP               #x16)
-(define-integrable VK_RIGHT            #x17)
-(define-integrable VK_DOWN             #x18)
-(define-integrable VK_PRINTSCRN                #x19)
-(define-integrable VK_INSERT           #x1A)
-(define-integrable VK_DELETE           #x1B)
-(define-integrable VK_SCRLLOCK         #x1C)
-(define-integrable VK_NUMLOCK          #x1D)
-(define-integrable VK_ENTER            #x1E)
-(define-integrable VK_SYSRQ            #x1F)
-(define-integrable VK_F1               #x20)
-(define-integrable VK_F2               #x21)
-(define-integrable VK_F3               #x22)
-(define-integrable VK_F4               #x23)
-(define-integrable VK_F5               #x24)
-(define-integrable VK_F6               #x25)
-(define-integrable VK_F7               #x26)
-(define-integrable VK_F8               #x27)
-(define-integrable VK_F9               #x28)
-(define-integrable VK_F10              #x29)
-(define-integrable VK_F11              #x2A)
-(define-integrable VK_F12              #x2B)
-(define-integrable VK_F13              #x2C)
-(define-integrable VK_F14              #x2D)
-(define-integrable VK_F15              #x2E)
-(define-integrable VK_F16              #x2F)
-(define-integrable VK_F17              #x30)
-(define-integrable VK_F18              #x31)
-(define-integrable VK_F19              #x32)
-(define-integrable VK_F20              #x33)
-(define-integrable VK_F21              #x34)
-(define-integrable VK_F22              #x35)
-(define-integrable VK_F23              #x36)
-(define-integrable VK_F24              #x37)
-(define-integrable VK_ENDDRAG          #x38)
-(define-integrable VK_CLEAR            #x39)
-(define-integrable VK_EREOF            #x3A)
-(define-integrable VK_PA1              #x3B)
-(define-integrable virtual-key-supremum #x3C)
-
-(define-integrable KC_NONE             #x0000)
-(define-integrable KC_CHAR             #x0001)
-(define-integrable KC_VIRTUALKEY       #x0002)
-(define-integrable KC_SCANCODE         #x0004)
-(define-integrable KC_SHIFT            #x0008)
-(define-integrable KC_CTRL             #x0010)
-(define-integrable KC_ALT              #x0020)
-(define-integrable KC_KEYUP            #x0040)
-(define-integrable KC_PREVDOWN         #x0080)
-(define-integrable KC_LONEKEY          #x0100)
-(define-integrable KC_DEADKEY          #x0200)
-(define-integrable KC_COMPOSITE                #x0400)
-(define-integrable KC_INVALIDCOMP      #x0800)
-(define-integrable KC_TOGGLE           #x1000)
-(define-integrable KC_INVALIDCHAR      #x2000)
-
-(define-integrable window-state:top        0)
-(define-integrable window-state:bottom     1)
-(define-integrable window-state:show       2)
-(define-integrable window-state:hide       3)
-(define-integrable window-state:activate   4)
-(define-integrable window-state:deactivate 5)
-(define-integrable window-state:minimize   6)
-(define-integrable window-state:maximize   7)
-(define-integrable window-state:restore    8)
\ No newline at end of file
+    table))
\ No newline at end of file