;;; -*- Mode: Common-Lisp; Package: User; Base: 10.; Patch-File: T -*-

;;; Reason: Fixes a garbled translation-from-C bug in X11:SET-KEY-SYMS-MAP.
;;;  The symptom is that changing keyboard mapping could affect keys
;;;  other than the ones specified.

;;;                           RESTRICTED RIGHTS LEGEND
;;;
;;; Use, duplication, or disclosure by the Government is subject to
;;; restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
;;; Technical Data and Computer Software clause at 52.227-7013.
;;;
;;;   TEXAS INSTRUMENTS INCORPORATED      
;;;   P.O. BOX 2909, M/S 2151             
;;;   AUSTIN, TEXAS 78769                 
;;;
;;; Copyright (C) 1989 Texas Instruments Incorporated.
;;; All rights reserved.

;;; Written 06/07/90 10:43:48 by HAGY,
;;; while running on Zwingli from band LOD2
;;; With SYSTEM 6.25, VIRTUAL-MEMORY 6.2, EH 6.5, MAKE-SYSTEM 6.2, MICRONET 6.0, LOCAL-FILE 6.1,
;;;  BASIC-PATHNAME 6.2, NETWORK-SUPPORT-COLD 6.2, BASIC-NAMESPACE 6.7, NETWORK-NAMESPACE 6.0,
;;;  DISK-IO 6.1, DISK-LABEL 6.0, BASIC-FILE 6.6, MAC-PATHNAME 6.0, NETWORK-PATHNAME 6.0,
;;;  COMPILER 6.14, TV 6.19, DATALINK 6.0, CHAOSNET 6.5, GC 6.3, MEMORY-AUX 6.0, NVRAM 6.2,
;;;  SYSLOG 6.2, STREAMER-TAPE 6.5, UCL 6.0, INPUT-EDITOR 6.0, METER 6.1, ZWEI 6.8,
;;;  DEBUG-TOOLS 6.3, NETWORK-SUPPORT 6.0, NETWORK-SERVICE 6.2, DATALINK-DISPLAYS 6.0,
;;;  FONT-EDITOR 6.1, SERIAL 6.0, PRINTER 6.3, MAC-PRINTER-TYPES 6.1, PRINTER-TYPES 6.2,
;;;  IMAGEN 6.1, SUGGESTIONS 6.1, MAIL-DAEMON 6.3, MAIL-READER 6.6, TELNET 6.0, VT100 6.0,
;;;  NAMESPACE-EDITOR 6.4, PROFILE 6.2, VISIDOC 6.5, TI-CLOS 6.26, CLEH 6.5, IP 3.56,
;;;  Experimental CLX 6.11, CLUE 6.104, X11M 6.27, Experimental BUG 11.17, Experimental CLIO 1.0,
;;;   microcode 430, Band Name: REl 6.0 +SLE +CLIO

#!C
; From file EVENTS.LISP#> X11M.SERVER; Hotel:
#10R X11#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "X11"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* SYS:COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "SYS: X11M.SERVER; EVENTS.#"


(DEFUN SET-KEY-SYMS-MAP (KEY-SYMS)
  (DECLARE (TYPE KEY-SYMS-RECORD KEY-SYMS))
  (EVENT-TRACE-ENTERING "SET-KEY-SYMS-MAP")
  (LET ((ROW-DIF (- (KEY-SYMS-RECORD.MIN-KEY-CODE KEY-SYMS)
                    (KEY-SYMS-RECORD.MIN-KEY-CODE CURRENT-KEY-SYMS))))
    (DECLARE (TYPE INTEGER ROW-DIF))

    ;; If keysym map size changes, grow map first.
    (IF (< (KEY-SYMS-RECORD.MAP-WIDTH KEY-SYMS) (KEY-SYMS-RECORD.MAP-WIDTH CURRENT-KEY-SYMS))
        (FLET ((SOURCE-INDEX (ROW COLUMN)
                 (+ (* (- ROW (KEY-SYMS-RECORD.MIN-KEY-CODE KEY-SYMS))
                       (KEY-SYMS-RECORD.MAP-WIDTH KEY-SYMS))
                    COLUMN))
               (DESTINATION-INDEX (ROW COLUMN)
                 (+ (* (- ROW (KEY-SYMS-RECORD.MIN-KEY-CODE CURRENT-KEY-SYMS))
                       (KEY-SYMS-RECORD.MAP-WIDTH CURRENT-KEY-SYMS))
                    COLUMN)))
          (LOOP FOR I FROM (KEY-SYMS-RECORD.MIN-KEY-CODE KEY-SYMS) TO
                  (KEY-SYMS-RECORD.MAX-KEY-CODE KEY-SYMS)
                DO (PROGN
                     (LOOP FOR J FROM 0 BELOW (KEY-SYMS-RECORD.MAP-WIDTH KEY-SYMS)
                           DO (SETF (AREF (KEY-SYMS-RECORD.MAP CURRENT-KEY-SYMS) (DESTINATION-INDEX
                                                                                   I J))
                                    (AREF (KEY-SYMS-RECORD.MAP KEY-SYMS) (SOURCE-INDEX
                                                                           I J))))
                     (LOOP FOR J FROM (KEY-SYMS-RECORD.MAP-WIDTH KEY-SYMS) BELOW
                                      (KEY-SYMS-RECORD.MAP-WIDTH CURRENT-KEY-SYMS)
                           DO (SETF (AREF (KEY-SYMS-RECORD.MAP CURRENT-KEY-SYMS) (DESTINATION-INDEX
                                                                                   I J))
                                          NO-SYMBOL)))))
        ;;ELSE
        (PROGN
	  (WHEN (> (KEY-SYMS-RECORD.MAP-WIDTH KEY-SYMS)
		   (KEY-SYMS-RECORD.MAP-WIDTH CURRENT-KEY-SYMS))
            (LET ((MAP (MAKE-ARRAY (* (KEY-SYMS-RECORD.MAP-WIDTH KEY-SYMS)
                                      (1+ (- (KEY-SYMS-RECORD.MAX-KEY-CODE CURRENT-KEY-SYMS)
                                             (KEY-SYMS-RECORD.MIN-KEY-CODE CURRENT-KEY-SYMS))))
                                   :ELEMENT-TYPE 'INTEGER :INITIAL-ELEMENT NO-SYMBOL)))
              (WHEN (KEY-SYMS-RECORD.MAP CURRENT-KEY-SYMS)
                (LOOP WITH SOURCE = (KEY-SYMS-RECORD.MAP CURRENT-KEY-SYMS)
                      FOR I FROM 0 TO (- (KEY-SYMS-RECORD.MAX-KEY-CODE CURRENT-KEY-SYMS)
                                         (KEY-SYMS-RECORD.MIN-KEY-CODE CURRENT-KEY-SYMS))
                      DO (LOOP WITH DEST-OFFSET   = (* I (KEY-SYMS-RECORD.MAP-WIDTH KEY-SYMS))
                               WITH SOURCE-OFFSET = (* I (KEY-SYMS-RECORD.MAP-WIDTH
                                                          CURRENT-KEY-SYMS))
                               FOR J FROM 0 BELOW (KEY-SYMS-RECORD.MAP-WIDTH CURRENT-KEY-SYMS)
                               DO (SETF (AREF MAP (+ DEST-OFFSET J)) (AREF SOURCE (+ SOURCE-OFFSET
                                                                                     J))))))
              (SETF (KEY-SYMS-RECORD.MAP-WIDTH CURRENT-KEY-SYMS) (KEY-SYMS-RECORD.MAP-WIDTH
                                                                   KEY-SYMS))
              (SETF (KEY-SYMS-RECORD.MAP CURRENT-KEY-SYMS) MAP)
              ))
	  (LOOP WITH SOURCE = (KEY-SYMS-RECORD.MAP KEY-SYMS)
		WITH DEST   = (KEY-SYMS-RECORD.MAP CURRENT-KEY-SYMS)
		FOR INDEX FROM 0 BELOW (* (1+ (- (KEY-SYMS-RECORD.MAX-KEY-CODE KEY-SYMS)
						 (KEY-SYMS-RECORD.MIN-KEY-CODE KEY-SYMS)))
					  (KEY-SYMS-RECORD.MAP-WIDTH CURRENT-KEY-SYMS))
		DO (SETF (AREF DEST (+ INDEX ROW-DIF)) (AREF SOURCE INDEX)))))
    )
  (EVENT-TRACE-LEAVING "SET-KEY-SYMS-MAP"))
))
