Enable super, hyper, and top modifier keys under X.
authorArthur Gleckler <edu/mit/csail/zurich/arthur>
Fri, 26 Jul 1991 21:56:09 +0000 (21:56 +0000)
committerArthur Gleckler <edu/mit/csail/zurich/arthur>
Fri, 26 Jul 1991 21:56:09 +0000 (21:56 +0000)
v7/src/edwin/xterm.scm
v7/src/microcode/x11base.c

index 3218db844dd1f5df360b1f53caabc49ab06853ad..ebe622f3af83fde3780d7e64f735e2521d840996 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/xterm.scm,v 1.19 1991/07/26 20:57:10 bal Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/xterm.scm,v 1.20 1991/07/26 21:56:09 arthur Exp $
 ;;;
 ;;;    Copyright (c) 1989-91 Massachusetts Institute of Technology
 ;;;
 (define (get-xterm-input-operations)
   (let ((display x-display-data)
        (queue x-display-events)
+       (bucky-bits 0)
        (string false)
        (start 0)
        (end 0)
     (let ((process-key-press-event
           (lambda (event)
             (set! string (vector-ref event 2))
+            (set! bucky-bits (vector-ref event 3))
             (set! start 0)
             (set! end (string-length string))
             (if signal-interrupts?
                            (if (fix:< start end) true (loop)))
                           (else
                            (process-special-event event)
-                           (loop))))))))
+                           (loop)))))))
+             (apply-bucky-bits
+              (lambda (character)
+                (if (and (zero? start)
+                         (= end 1))
+                    (make-char (char-code character)
+                               bucky-bits)
+                    character))))
          (values
           (lambda ()                   ;halt-update?
             (if (or (fix:< start end) pending-event)
                            (loop)))))))
           (lambda ()                   ;peek-char
             (and (or (fix:< start end) (guarantee-input))
-                 (string-ref string start)))
+                 (apply-bucky-bits (string-ref string start))))
           (lambda ()                   ;read-char
             (and (or (fix:< start end) (guarantee-input))
-                 (let ((char (string-ref string start)))
+                 (let ((char
+                        (apply-bucky-bits
+                         (string-ref string start))))
                    (set! start (fix:+ start 1))
                    char)))))))))
 \f
index 156125bf3f8dad7f0c62348c5c60290906a64e5b..7f9c3c2c8d1e4dd0947056b7da7c3263c1ec76dd 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/x11base.c,v 1.23 1991/07/23 08:16:24 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/x11base.c,v 1.24 1991/07/26 21:52:37 arthur Exp $
 
 Copyright (c) 1989-91 Massachusetts Institute of Technology
 
@@ -609,26 +609,44 @@ DEFUN (key_event, (xw, event, type),
 {
   char copy_buffer [80];
   KeySym keysym;
-  int nbytes =
+  int nbytes;
+
+  /* Make ShiftLock modifier not affect keys with other modifiers. */
+  if ((event -> state) &
+      (ShiftMask || ControlMask
+       || Mod1Mask || Mod2Mask || Mod3Mask || Mod4Mask || Mod5Mask))
+  {
+    if ((event->state) & LockMask)
+      (event->state) -= LockMask;
+  }
+  nbytes =
     (XLookupString (event,
                    copy_buffer,
                    (sizeof (copy_buffer)),
                    (&keysym),
                    (&compose_status)));
-  if ((nbytes < 1)
-      || (IsFunctionKey (keysym))
-      || (IsCursorKey (keysym))
-      || (IsKeypadKey (keysym))
-      || (IsMiscFunctionKey (keysym))
-      || (IsPFKey (keysym))
-      || (IsModifierKey (keysym)))
+  if ((nbytes < 1) || (IsModifierKey (keysym)))
     return (SHARP_F);
   else
     {
-      SCHEME_OBJECT result = (make_event_object (xw, type, 1));
-      if ((nbytes == 1) && (((event -> state) & Mod1Mask) != 0))
-       (copy_buffer[0]) |= 0x80;
+      long bucky = 0;
+
+      SCHEME_OBJECT result = (make_event_object (xw, type, 2));
+      if (nbytes == 1)
+      {
+       /* Convert to Scheme bucky bits (kept independent of the */
+       /* character).  Let X handle controlification. */
+       if ((event -> state) & Mod1Mask) /* Meta */
+         bucky |= 1;
+       if ((event -> state) & Mod2Mask) /* Super */
+         bucky |= 4;
+       if ((event -> state) & Mod3Mask) /* Hyper */
+         bucky |= 8;
+       if ((event -> state) & Mod4Mask) /* Top */
+         bucky |= 16;
+      }
       VECTOR_SET (result, EVENT_0, (memory_to_string (nbytes, copy_buffer)));
+      VECTOR_SET (result, EVENT_1, LONG_TO_UNSIGNED_FIXNUM (bucky));
       return (result);
     }
 }