From 90a6f780279cf7e5de9f4292793464fbd34ec897 Mon Sep 17 00:00:00 2001 From: Arthur Gleckler Date: Fri, 26 Jul 1991 21:56:09 +0000 Subject: [PATCH] Enable super, hyper, and top modifier keys under X. --- v7/src/edwin/xterm.scm | 19 +++++++++++++---- v7/src/microcode/x11base.c | 42 +++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/v7/src/edwin/xterm.scm b/v7/src/edwin/xterm.scm index 3218db844..ebe622f3a 100644 --- a/v7/src/edwin/xterm.scm +++ b/v7/src/edwin/xterm.scm @@ -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 ;;; @@ -231,6 +231,7 @@ (define (get-xterm-input-operations) (let ((display x-display-data) (queue x-display-events) + (bucky-bits 0) (string false) (start 0) (end 0) @@ -238,6 +239,7 @@ (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? @@ -266,7 +268,14 @@ (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) @@ -291,10 +300,12 @@ (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))))))))) diff --git a/v7/src/microcode/x11base.c b/v7/src/microcode/x11base.c index 156125bf3..7f9c3c2c8 100644 --- a/v7/src/microcode/x11base.c +++ b/v7/src/microcode/x11base.c @@ -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); } } -- 2.25.1