(FILECREATED "13-Nov-85 12:11:52" {ERIS}<LISPCORE>LIBRARY>VIRTUALKEYBOARDS.;4 86198  

      changes to:  (VARS VKBD.CONFIGURATIONS)

      previous date: "13-Nov-85 09:11:48" {ERIS}<LISPCORE>LIBRARY>VIRTUALKEYBOARDS.;3)


(* Copyright (c) 1985 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT VIRTUALKEYBOARDSCOMS)

(RPAQQ VIRTUALKEYBOARDSCOMS ((FNS DEFINEKEYBOARD)
	(FNS VKBD.ADD-ITEM-TO-BACKGROUND-MENU VKBD.INIT VKBD.CREATE-DEFAULT-KEYBOARD 
	     VKBD.ADD-DEFAULT-KEYBOARD)
	(FNS VKBD.LOAD-FILE-COMMAND VKBD.LOAD-KEYBOARD-FILE VKBD.STORE-FILE-COMMAND 
	     VKBD.STORE-KEYBOARD-FILE)
	(FNS SWITCHKEYBOARDS VKBD.ASSIGNABLE-KEYP VKBD.BUTTONEVENTFN VKBD.CENTER-BITMAP-IN-REGION 
	     VKBD.CHAR-ASSIGNMENTP VKBD.CLEAR-KEY-DISPLAY VKBD.COMPLETE-KEYBOARD 
	     VKBD.CTRL-ASSIGNMENTP VKBD.EVENT-ASSIGNMENTP VKBD.META-ASSIGNMENTP 
	     VKBD.CREATE-KEYBOARD-BITMAP VKBD.CREATE-KEYBOARD-DISPLAY VKBD.CURSORMOVEDFN 
	     VKBD.DISPLAY-CHARACTER VKBD.DISPLAY-EMPTY-KEY-CAP VKBD.DISPLAY-KEY 
	     VKBD.DISPLAY-KEY-CHARACTERS VKBD.DRAW-KEY-CAPS VKBD.ERASE-FRAME VKBD.EXTEND-REGION 
	     VKBD.FETCH-KEY-ASSIGNMENT VKBD.FRAME-KEY VKBD.GET-CONFIGURATION 
	     VKBD.GET-CURRENT-KEY-ASSIGNMENT VKBD.GET-KEY-AND-REGIONS-OF-CURSOR-POSITION 
	     VKBD.GET-KEY-REGIONS VKBD.GET-NON-CHAR-LABEL VKBD.ICONFN VKBD.INVERT-LOCK-KEYS 
	     VKBD.INVERT-SHIFT-KEYS VKBD.TRANSLATE-KEY-ID VKBD.INVERT-KEY VKBD.INVERT-REGION 
	     VKBD.KEY-ID-TO-KEY-NAMES VKBD.KEY-NAME-TO-KEY-ID VKBD.KEYBOARD-IS-MACHINE-KEYBOARD 
	     VKBD.KEYBOARD-WINDOW-REPAINTFN VKBD.LOCK-ASSIGNMENTP VKBD.LOCK-KEYP VKBD.LOCK/NOLOCK 
	     VKBD.LOCKDOWN-ASSIGNMENTP VKBD.LOCKUP-ASSIGNMENTP VKBD.LOWER-HALF-REGION 
	     VKBD.PARSE-CHAR-CODE VKBD.PARSE-KEY-ASSIGNMENT VKBD.PERFORM-KEY-ASSIGNMENT 
	     VKBD.POP-MENU-AND-SWITCH-KEYBOARDS VKBD.POP-UP-KEYBOARDS-MENU 
	     VKBD.POSITION-IS-IN-KEY-REGION VKBD.REMOVE-KEYBOARD-COMMAND VKBD.RESET-KEYBOARD-WINDOW 
	     VKBD.SEND-CHARACTER VKBD.SHIFT-ASSIGNMENTP VKBD.SHIFTED-CHAR VKBD.UNDEFINE-KEYBOARD 
	     VKBD.UNION-REGIONS VKBD.UNSHIFTED-CHAR VKBD.UPER-HALF-REGION)
	(RECORDS KEYBOARDCONFIGURATION VIRTUALKEYBOARD)
	(INITVARS (VKBD.DEFAULT-CONFIGURATION-NAME (MACHINETYPE))
		  (VKBD.KNOWN-KEYBOARDS NIL))
	(VARS VKBD.BACKGROUND-MENU-SUBITEMS VKBD.NON-CHAR-ASSIGNMENTS-LABELS VKBD.CONFIGURATIONS)
	(BITMAPS VKBD.ICON VKBD.MASK)
	(GLOBALVARS VKBD.BACKGROUND-MENU-SUBITEMS VKBD.DEFAULT-CONFIGURATION-NAME 
		    VKBD.KNOWN-KEYBOARDS VKBD.NON-CHAR-ASSIGNMENTS-LABELS VKBD.ICON VKBD.MASK 
		    VKBD.CONFIGURATIONS)
	(P (VKBD.LOAD-KEYBOARD-FILE (PACK* (MACHINETYPE)
					   (QUOTE KEYBOARDS)))
	   (VKBD.INIT))
	(FILES ICONW)))
(DEFINEQ

(DEFINEKEYBOARD
  [LAMBDA (KEYBOARD-OBJECT)                                  (* sm "15-Aug-85 17:41")

          (* * The notion of DEFINING a keyboard is not a very good one. the idea is that there is a global list 
	  VKBD.KNOWN-KEYBOARDS. A keyboard added to this list is considered to be defined. The parsing allow the user some 
	  flexibility in the way the assignments are specified, although most of the user will use the keyboard editor to 
	  create and define new keyboards)


    (PROG (PARSED-LIST-OF-KEY-ASSIGNMENTS KEYBOARD PARSED-KEY-ASSIGNMENT ASSIGNABLE-KEYS 
					  CONFIGURATION)
          (SETQ CONFIGURATION (VKBD.GET-CONFIGURATION (fetch (VIRTUALKEYBOARD KEYBOARDCONFIGURATION)
							 of KEYBOARD-OBJECT)))
          (SETQ ASSIGNABLE-KEYS (fetch (KEYBOARDCONFIGURATION ASSIGNABLEKEYS) of CONFIGURATION))
          (SETQ PARSED-LIST-OF-KEY-ASSIGNMENTS (for KEY-ASSIGNMENT in (fetch (VIRTUALKEYBOARD 
										   KEYASSIGNMENTS)
									 of KEYBOARD-OBJECT)
						  join (if (AND (SETQ PARSED-KEY-ASSIGNMENT
								  (VKBD.PARSE-KEY-ASSIGNMENT 
										   KEY-ASSIGNMENT 
										    CONFIGURATION))
								(FMEMB (CAR PARSED-KEY-ASSIGNMENT)
								       ASSIGNABLE-KEYS))
							   then (LIST PARSED-KEY-ASSIGNMENT)
							 else NIL)))
          (if (SETQ KEYBOARD (FASSOC (fetch (VIRTUALKEYBOARD KEYBOARDNAME) of KEYBOARD-OBJECT)
				     VKBD.KNOWN-KEYBOARDS))
	      then (replace (VIRTUALKEYBOARD KEYASSIGNMENTS) of KEYBOARD with 
								   PARSED-LIST-OF-KEY-ASSIGNMENTS)
	    else (replace (VIRTUALKEYBOARD KEYASSIGNMENTS) of KEYBOARD-OBJECT with 
								   PARSED-LIST-OF-KEY-ASSIGNMENTS)
		 (SETQ VKBD.KNOWN-KEYBOARDS (CONS KEYBOARD-OBJECT VKBD.KNOWN-KEYBOARDS])
)
(DEFINEQ

(VKBD.ADD-ITEM-TO-BACKGROUND-MENU
  [LAMBDA (LABEL COMMAND MESSAGE SUBITEMLIST)                (* edited: " 3-Jun-85 15:59")
    (SETQ BackgroundMenuCommands (REMOVE (SASSOC LABEL BackgroundMenuCommands)
					 BackgroundMenuCommands))
    (NCONC1 BackgroundMenuCommands (LIST LABEL COMMAND MESSAGE SUBITEMLIST))
    (SETQ BackgroundMenu NIL])

(VKBD.INIT
  [LAMBDA NIL                                                (* sm "15-Aug-85 14:34")
    (VKBD.ADD-ITEM-TO-BACKGROUND-MENU "Keyboard" (QUOTE (QUOTE (VKBD.POP-MENU-AND-SWITCH-KEYBOARDS
								 T T)))
				      "Displays a menu for switching keyboards" 
				      VKBD.BACKGROUND-MENU-SUBITEMS)
    (VKBD.ADD-DEFAULT-KEYBOARD])

(VKBD.CREATE-DEFAULT-KEYBOARD
  [LAMBDA (CONFIGURATION)                                    (* sm "14-Aug-85 12:29")
    (SETQ CONFIGURATION (VKBD.GET-CONFIGURATION CONFIGURATION))
    (create VIRTUALKEYBOARD
	    KEYBOARDNAME ←(QUOTE DEFAULT)
	    KEYASSIGNMENTS ←(COPY (fetch (KEYBOARDCONFIGURATION DEFAULTASSIGNMENT) of CONFIGURATION))
	    KEYBOARDCONFIGURATION ←(fetch (KEYBOARDCONFIGURATION CONFIGURATIONNAME) of CONFIGURATION])

(VKBD.ADD-DEFAULT-KEYBOARD
  [LAMBDA NIL                                                (* sm "15-Aug-85 17:53")

          (* * It is useful practice to be able to switch back to the original key assignments. Thus the program is adding one
	  special keyboard with the name DEFAULT which is the current machine default keyboard.)


    (PROG (DEFAULT)
          (while (SETQ DEFAULT (FASSOC (QUOTE DEFAULT)
				       VKBD.KNOWN-KEYBOARDS))
	     do (SETQ VKBD.KNOWN-KEYBOARDS (REMOVE DEFAULT VKBD.KNOWN-KEYBOARDS)))
          (SETQ VKBD.KNOWN-KEYBOARDS (CONS (VKBD.CREATE-DEFAULT-KEYBOARD (MACHINETYPE))
					   VKBD.KNOWN-KEYBOARDS])
)
(DEFINEQ

(VKBD.LOAD-FILE-COMMAND
  [LAMBDA (REDEFINE? DELETE-FIRST?)                          (* sm "12-Jun-85 15:26")
    (PROG (F)
          [SETQ F (MKATOM (PROMPTFORWORD "ENTER FILE NAME: " NIL NIL PROMPTWINDOW NIL (QUOTE TTY]
          (if F
	      then (VKBD.LOAD-KEYBOARD-FILE F REDEFINE? DELETE-FIRST?])

(VKBD.LOAD-KEYBOARD-FILE
  [LAMBDA (FILENAME REDEFINE? DELETE-CURRENT-DEFINITIONS?)   (* jds "20-Sep-85 11:08")
    (PROG (FULLNAME NEW-KEYBOARD-LIST)
          (SETQ FULLNAME (OPENFILE FILENAME (QUOTE INPUT)
				   (QUOTE OLD)))
          (COND
	    [FULLNAME (SETQ NEW-KEYBOARD-LIST (READ FULLNAME))
		      (CLOSEF? FULLNAME)
		      (COND
			(DELETE-CURRENT-DEFINITIONS? (SETQ VKBD.KNOWN-KEYBOARDS NEW-KEYBOARD-LIST)
						     (VKBD.ADD-DEFAULT-KEYBOARD))
			(T (for KEYBOARD in NEW-KEYBOARD-LIST bind KB
			      do (COND
				   [(SETQ KB (FASSOC (fetch (VIRTUALKEYBOARD KEYBOARDNAME)
							of KEYBOARD)
						     VKBD.KNOWN-KEYBOARDS))
				     (COND
				       (REDEFINE? (replace (VIRTUALKEYBOARD KEYASSIGNMENTS)
						     of KB with (fetch (VIRTUALKEYBOARD 
										   KEYASSIGNMENTS)
								   of KEYBOARD))
						  (replace (VIRTUALKEYBOARD KEYBOARDCONFIGURATION)
						     of KB with (fetch (VIRTUALKEYBOARD 
									    KEYBOARDCONFIGURATION)
								   of KEYBOARD]
				   (T (SETQ VKBD.KNOWN-KEYBOARDS (NCONC1 VKBD.KNOWN-KEYBOARDS 
									 KEYBOARD]
	    (T (PROMPTPRINT "Couldn't open " FILENAME])

(VKBD.STORE-FILE-COMMAND
  [LAMBDA (F)                                                (* sm "12-Jun-85 15:29")
    (SETQ F (PROMPTFORWORD "ENTER FILE NAME: " NIL NIL PROMPTWINDOW NIL (QUOTE TTY)))
    (if F
	then (VKBD.STORE-KEYBOARD-FILE (MKATOM F))
      else (PROMPTPRINT "FILE NOT FOUND"])

(VKBD.STORE-KEYBOARD-FILE
  [LAMBDA (FILENAME)                                         (* sm " 8-Aug-85 09:42")
    (PROG (FULLNAME)
          (SETQ FULLNAME (OPENFILE FILENAME (QUOTE OUTPUT)
				   (QUOTE NEW)))
          (if FULLNAME
	      then (PRIN2 (REMOVE (FASSOC (QUOTE DEFAULT)
					  VKBD.KNOWN-KEYBOARDS)
				  VKBD.KNOWN-KEYBOARDS)
			  FULLNAME)
		   (CLOSEF? FULLNAME)
		   (PROMPTPRINT (CONCAT "Current known keyboards are stored in " FULLNAME))
	    else (PROMPTPRINT "Couldn't open " FILENAME])
)
(DEFINEQ

(SWITCHKEYBOARDS
  [LAMBDA (NEW-KEYBOARD SWITCH-FLG DISPLAY-FLG DISPLAY-POSITION)
                                                             (* jds "13-Nov-85 08:40")

          (* * This is the main function of the package. SWITCH-FLG and DISPLAY-FLG will produce the 3 logical combinations 
	  of switching a keyboard. The 4th comb NIl & NIL is NOOP. The call to VKBD.PERFORM-KEY-ASSIGNMENT is the the actual 
	  interaction with the "real" world. Any change of the KEYACTION handeling should be reflected here.)


    (PROG (WINDOW)
	    [COND
	      ((ATOM NEW-KEYBOARD)
		(SETQ NEW-KEYBOARD (FASSOC NEW-KEYBOARD VKBD.KNOWN-KEYBOARDS]
	    (COND
	      ((NULL NEW-KEYBOARD)
		(RETURN NIL)))
	    (SETQ NEW-KEYBOARD (VKBD.COMPLETE-KEYBOARD (COPY NEW-KEYBOARD)))
                                                             (* THIS IS NECCESSARY TO ENABLE THE MENU TO GENERATE 
							     THE RIGHT CHARACTERS FOR THE KEYS THAT WERE NOT 
							     REDEFINE)
	    [COND
	      (SWITCH-FLG (COND
			    ((VKBD.KEYBOARD-IS-MACHINE-KEYBOARD NEW-KEYBOARD)
			      (for KEY-ASSIGNMENT in (fetch (VIRTUALKEYBOARD KEYASSIGNMENTS)
							    of NEW-KEYBOARD)
				 do (VKBD.PERFORM-KEY-ASSIGNMENT KEY-ASSIGNMENT
								     (fetch (VIRTUALKEYBOARD 
									    KEYBOARDCONFIGURATION)
									of NEW-KEYBOARD)))
			      (PRINTOUT PROMPTWINDOW T "Keyboard was changed. Current keyboard is "
					(fetch KEYBOARDNAME of NEW-KEYBOARD)))
			    (T (RINGBELLS)
			       (PRINTOUT PROMPTWINDOW T 
		  "Keyboard is not configured for this machine. cannot perform actual switching."]
	    [COND
	      (DISPLAY-FLG (SETQ WINDOW (VKBD.CREATE-KEYBOARD-DISPLAY NEW-KEYBOARD 
									  DISPLAY-POSITION
									  (QUOTE 
									      VKBD.SEND-CHARACTER)))
			   (WINDOWPROP WINDOW (QUOTE ICONFN)
					 (QUOTE VKBD.ICONFN]
                                                             (* (RETURN OLD-KEYACTIONS))
	])

(VKBD.ASSIGNABLE-KEYP
  [LAMBDA (KEY WINDOW)                                       (* sm "15-Aug-85 17:56")

          (* * the assignable keys are specified in the configuration of the keyboard; Sometimes we don't want to allow the 
	  user to change the assignments of certain keys to avoid disasters)


    (MEMBER KEY (fetch (KEYBOARDCONFIGURATION ASSIGNABLEKEYS) of (VKBD.GET-CONFIGURATION WINDOW])

(VKBD.BUTTONEVENTFN
  [LAMBDA (WINDOW)                                           (* sm "15-Aug-85 18:06")

          (* * This is a general "menu" function for the keyboard when used as a menu -
	  it is used for all such uses: When displaying a virtual keyboard, when editing one and when editing a default 
	  assignments for a configuration. The only difference is what will be the action taken when a KEY was selected.
	  This will be determined by the property VKBD.MENUFN which specify the name of the function that should be called.
	  This function will get 3 arguments : The KEYID, the WINDOW and the mouse key; In the regular keyboard display this 
	  function will send a character to the system buffer. In the Editor it will make the key the CURRENT key.
	  In the configuration info window it will display information about the key)


    (PROG (MOUSE-POSITION SHADED-KEY LAST-MOUSE-KEY CURRENT-KEY-AND-REGIONS SHIFT-IS-DOWN)
	    (SETQ MOUSE-POSITION (CURSORPOSITION NIL WINDOW))
	    (TOTOPW WINDOW)                                (* This should be checked if changes to the keyboard 
							     handling is done)
	    [SETQ SHIFT-IS-DOWN (OR (KEYDOWNP (QUOTE RSHIFT))
					(KEYDOWNP (QUOTE LSHIFT]
	    (SETQ SHADED-KEY (WINDOWPROP WINDOW (QUOTE VKBD.SHADED-KEY)))
	    (SETQ LAST-MOUSE-KEY (WINDOWPROP WINDOW (QUOTE VKBD.MOUSE-BUTTON)))
	    (SETQ CURRENT-KEY-AND-REGIONS (VKBD.GET-KEY-AND-REGIONS-OF-CURSOR-POSITION 
										   MOUSE-POSITION 
											   WINDOW))
	    (COND
	      [(MOUSESTATE UP)
		(COND
		  ((AND SHADED-KEY (EQ SHADED-KEY (CAR CURRENT-KEY-AND-REGIONS)))
		    [APPLY (WINDOWPROP WINDOW (QUOTE VKBD.MENUFN))
			     (LIST (WINDOWPROP WINDOW (QUOTE VKBD.SHADED-KEY))
				     WINDOW
				     (WINDOWPROP WINDOW (QUOTE VKBD.LAST-MOUSE-STATE]
		    (VKBD.RESET-KEYBOARD-WINDOW WINDOW]
	      ((OR (MOUSESTATE (ONLY LEFT))
		     (MOUSESTATE (ONLY MIDDLE)))
		(WINDOWPROP WINDOW (QUOTE VKBD.SHADED-KEY)
			      (CAR CURRENT-KEY-AND-REGIONS))
		(for REGION in (CDR CURRENT-KEY-AND-REGIONS) do (VKBD.INVERT-REGION REGION 
											   WINDOW))
		[WINDOWPROP WINDOW (QUOTE VKBD.LAST-MOUSE-STATE)
			      (COND
				((LASTMOUSESTATE (ONLY LEFT))
				  (QUOTE LEFT))
				(T (QUOTE MIDDLE]
		(COND
		  ((OR SHIFT-IS-DOWN (LASTMOUSESTATE (ONLY MIDDLE)))
		    (VKBD.INVERT-SHIFT-KEYS WINDOW)
		    (WINDOWPROP WINDOW (QUOTE VKBD.SHIFT-DOWN)
				  T])

(VKBD.CENTER-BITMAP-IN-REGION
  [LAMBDA (BM REGION WINDOW ALLIGNMENT)                      (* sm " 8-Aug-85 11:24")
    (BITBLT BM 0 0 WINDOW (IPLUS (fetch (REGION LEFT) of REGION)
				     (IQUOTIENT (IDIFFERENCE (fetch (REGION WIDTH)
								    of REGION)
								 (BITMAPWIDTH BM))
						  2))
	      [COND
		[(GREATERP (BITMAPHEIGHT BM)
			     (fetch (REGION HEIGHT) of REGION))
		  (COND
		    [(EQ ALLIGNMENT (QUOTE TOP))
		      (IDIFFERENCE (fetch (REGION BOTTOM) of REGION)
				     (IDIFFERENCE (BITMAPHEIGHT BM)
						    (fetch (REGION HEIGHT) of REGION]
		    ((EQ ALLIGNMENT (QUOTE BOTTOM))
		      (fetch (REGION BOTTOM) of REGION))
		    (T (IPLUS (fetch (REGION BOTTOM) of REGION)
				(IQUOTIENT (IDIFFERENCE (fetch (REGION HEIGHT) of REGION)
							    (BITMAPHEIGHT BM))
					     2]
		(T (IPLUS (fetch (REGION BOTTOM) of REGION)
			    (IQUOTIENT (IDIFFERENCE (fetch (REGION HEIGHT) of REGION)
							(BITMAPHEIGHT BM))
					 2]
	      NIL NIL (QUOTE INPUT)
	      (QUOTE PAINT])

(VKBD.CHAR-ASSIGNMENTP
  [LAMBDA (ASSIGNMENT)                                       (* sm " 1-Aug-85 12:17")
    (AND (CADR ASSIGNMENT)
	 (LISTP (CADR ASSIGNMENT])

(VKBD.CLEAR-KEY-DISPLAY
  [LAMBDA (KEY-NAME VKBD-WINDOW)                             (* sm " 5-Aug-85 08:58")
    (for REGION in (VKBD.GET-KEY-REGIONS KEY-NAME VKBD-WINDOW)
       do (PROG ((LEFT (fetch LEFT of REGION))
		 (BOTTOM (fetch (REGION BOTTOM) of REGION))
		 (WIDTH (fetch (REGION WIDTH) of REGION))
		 (HEIGHT (fetch (REGION HEIGHT) of REGION)))
	        (BITBLT NIL NIL NIL VKBD-WINDOW (ADD1 LEFT)
			(ADD1 BOTTOM)
			(IDIFFERENCE WIDTH 2)
			(IDIFFERENCE HEIGHT 2)
			(QUOTE TEXTURE)
			(QUOTE REPLACE)
			WHITESHADE)
	        [BITMAPBIT VKBD-WINDOW (ADD1 LEFT)
			   (ADD1 BOTTOM)
			   (ITIMES (BITMAPBIT VKBD-WINDOW (ADD1 LEFT)
					      BOTTOM)
				   (BITMAPBIT VKBD-WINDOW LEFT (ADD1 BOTTOM]
	        [BITMAPBIT VKBD-WINDOW (IPLUS LEFT (IDIFFERENCE WIDTH 2))
			   (ADD1 BOTTOM)
			   (ITIMES (BITMAPBIT VKBD-WINDOW (IPLUS LEFT (IDIFFERENCE WIDTH 2))
					      BOTTOM)
				   (BITMAPBIT VKBD-WINDOW (IPLUS LEFT (SUB1 WIDTH))
					      (ADD1 BOTTOM]
	        [BITMAPBIT VKBD-WINDOW (ADD1 LEFT)
			   (IPLUS BOTTOM (IDIFFERENCE HEIGHT 2))
			   (ITIMES (BITMAPBIT VKBD-WINDOW (ADD1 LEFT)
					      (IPLUS BOTTOM (ADD1 HEIGHT)))
				   (BITMAPBIT VKBD-WINDOW LEFT (IPLUS BOTTOM (IDIFFERENCE HEIGHT 2]
	        (BITMAPBIT VKBD-WINDOW (IPLUS LEFT (IDIFFERENCE WIDTH 2))
			   (IPLUS BOTTOM (IDIFFERENCE HEIGHT 2))
			   (ITIMES (BITMAPBIT VKBD-WINDOW (IPLUS LEFT (SUB1 WIDTH))
					      (IPLUS BOTTOM (IDIFFERENCE HEIGHT 2)))
				   (BITMAPBIT VKBD-WINDOW (IPLUS LEFT (IDIFFERENCE WIDTH 2))
					      (IPLUS BOTTOM (SUB1 HEIGHT])

(VKBD.COMPLETE-KEYBOARD
  [LAMBDA (KEYBOARD)                                         (* jds "13-Nov-85 09:01")
                                                             (* Fill in keys that aren't mentioned in the new 
							     keyboard, using this machine's default)
    (PROG (CONFIGURATION OLD-KEY-ASSIGNMENTS DEFAULT-KEY-ASSIGNMENTS)
	    (SETQ CONFIGURATION (VKBD.GET-CONFIGURATION (fetch (VIRTUALKEYBOARD 
									    KEYBOARDCONFIGURATION)
							       of KEYBOARD)))
	    (SETQ OLD-KEY-ASSIGNMENTS (fetch (VIRTUALKEYBOARD KEYASSIGNMENTS) of KEYBOARD))
	    [replace KEYASSIGNMENTS of KEYBOARD with (COND
							     [(AND (
								VKBD.KEYBOARD-IS-MACHINE-KEYBOARD
								       KEYBOARD)
								     OLD-KEY-ASSIGNMENTS)
                                                             (* If it's a keyboard configured for this machine, 
							     make the key assignments.)
							       (for KEY in (fetch (
KEYBOARDCONFIGURATION KEYSIDLIST) of CONFIGURATION) collect (OR (FASSOC KEY 
									      OLD-KEY-ASSIGNMENTS)
								      (
								  VKBD.GET-CURRENT-KEY-ASSIGNMENT
									KEY CONFIGURATION]
							     (T (SETQ DEFAULT-KEY-ASSIGNMENTS
								  (fetch (KEYBOARDCONFIGURATION
									     DEFAULTASSIGNMENT)
								     of CONFIGURATION))
								(for KEY
								   in (fetch (
KEYBOARDCONFIGURATION KEYSIDLIST) of CONFIGURATION) collect (OR (FASSOC KEY 
									      OLD-KEY-ASSIGNMENTS)
								      (FASSOC KEY 
									  DEFAULT-KEY-ASSIGNMENTS]
	    (RETURN KEYBOARD])

(VKBD.CTRL-ASSIGNMENTP
  [LAMBDA (ASSIGNMENT)                                       (* sm "12-Aug-85 16:32")
    (AND (EQ (CADR ASSIGNMENT)
	     (QUOTE CTRLDOWN))
	 (EQ (CDDR ASSIGNMENT)
	     (QUOTE CTRLUP])

(VKBD.EVENT-ASSIGNMENTP
  [LAMBDA (ASSIGNMENT)                                       (* sm "12-Aug-85 16:39")
    (AND (EQ (CADR ASSIGNMENT)
	     (QUOTE EVENT))
	 (EQ (CDDR ASSIGNMENT)
	     (QUOTE EVENT])

(VKBD.META-ASSIGNMENTP
  [LAMBDA (ASSIGNMENT)                                       (* sm "12-Aug-85 16:32")
    (AND (EQ (CADR ASSIGNMENT)
	     (QUOTE METADOWN))
	 (EQ (CDDR ASSIGNMENT)
	     (QUOTE METAUP])

(VKBD.CREATE-KEYBOARD-BITMAP
  [LAMBDA (CONFIGURATION)                                    (* sm " 6-Aug-85 11:44")
    (PROG (BM KEYS-REGION BM-WIDTH BM-HEIGHT MAX-REGION)
	    [COND
	      ((ATOM CONFIGURATION)
		(SETQ CONFIGURATION (VKBD.GET-CONFIGURATION CONFIGURATION]
	    [SETQ MAX-REGION (APPLY* (QUOTE VKBD.UNION-REGIONS)
					 (for K in (fetch (KEYBOARDCONFIGURATION KEYREGIONS)
							  of CONFIGURATION)
					    collect (CADR K]
	    (SETQ BM-WIDTH (IPLUS (ITIMES 2 (fetch (REGION LEFT) of MAX-REGION))
				      (fetch (REGION WIDTH) of MAX-REGION)))
	    (SETQ BM-HEIGHT (IPLUS (ITIMES 2 (fetch (REGION BOTTOM) of MAX-REGION))
				       (fetch (REGION HEIGHT) of MAX-REGION)))
	    (SETQ BM (BITMAPCREATE BM-WIDTH BM-HEIGHT))
	    (BITBLT NIL NIL NIL BM 0 0 BM-WIDTH BM-HEIGHT (QUOTE TEXTURE)
		      (QUOTE REPLACE)
		      BLACKSHADE)
	    (BITBLT NIL NIL NIL BM 1 1 (IDIFFERENCE BM-WIDTH 2)
		      (IDIFFERENCE BM-HEIGHT 2)
		      (QUOTE TEXTURE)
		      (QUOTE REPLACE)
		      (fetch (KEYBOARDCONFIGURATION BACKGROUNDSHADE) of CONFIGURATION))
	    (for KEY-AND-REGIONS in (fetch (KEYBOARDCONFIGURATION KEYREGIONS) of 
										    CONFIGURATION)
	       do (VKBD.DISPLAY-EMPTY-KEY-CAP (CDR KEY-AND-REGIONS)
						  BM))
	    (RETURN BM])

(VKBD.CREATE-KEYBOARD-DISPLAY
  [LAMBDA (KEYBOARD MENU-POSITION MENU-FUNCTION BM)          (* sm "14-Aug-85 12:37")
    (PROG (WINDOW WINDOW-WIDTH WINDOW-HEIGHT KEYBOARD-BITMAP CONFIGURATION)
	    (SETQ CONFIGURATION (VKBD.GET-CONFIGURATION (fetch KEYBOARDCONFIGURATION
							       of KEYBOARD)))
	    (SETQ KEYBOARD-BITMAP (OR BM (VKBD.CREATE-KEYBOARD-BITMAP CONFIGURATION)))
	    (SETQ WINDOW-WIDTH (IPLUS 8 (BITMAPWIDTH KEYBOARD-BITMAP)))
	    (SETQ WINDOW-HEIGHT (IPLUS 18 (BITMAPHEIGHT KEYBOARD-BITMAP)))
	    [COND
	      ((NOT MENU-POSITION)
		(SETQ MENU-POSITION (GETBOXPOSITION WINDOW-WIDTH WINDOW-HEIGHT]
	    [SETQ WINDOW (CREATEW (CREATEREGION (fetch (POSITION XCOORD) of MENU-POSITION)
						      (fetch (POSITION YCOORD) of MENU-POSITION)
						      WINDOW-WIDTH WINDOW-HEIGHT)
				      (CONCAT "Virtual Keyboard : " (fetch (VIRTUALKEYBOARD
										 KEYBOARDNAME)
									 of KEYBOARD]
	    (WINDOWPROP WINDOW (QUOTE VKBD.KEYBOARD)
			  KEYBOARD)
	    (WINDOWPROP WINDOW (QUOTE BUTTONEVENTFN)
			  (QUOTE VKBD.BUTTONEVENTFN))
	    (WINDOWPROP WINDOW (QUOTE CURSORMOVEDFN)
			  (QUOTE VKBD.CURSORMOVEDFN))
	    (WINDOWPROP WINDOW (QUOTE CURSOROUTFN)
			  (QUOTE VKBD.RESET-KEYBOARD-WINDOW))
	    (WINDOWPROP WINDOW (QUOTE CURSORINFN)
			  (QUOTE VKBD.RESET-KEYBOARD-WINDOW))
	    (WINDOWPROP WINDOW (QUOTE VKBD.MENUFN)
			  MENU-FUNCTION)
	    (WINDOWPROP WINDOW (QUOTE REPAINTFN)
			  (QUOTE VKBD.KEYBOARD-WINDOW-REPAINTFN))
	    (WINDOWPROP WINDOW (QUOTE RESHAPEFN)
			  (QUOTE DON'T))
	    (REDISPLAYW WINDOW)
	    (RETURN WINDOW])

(VKBD.CURSORMOVEDFN
  [LAMBDA (WINDOW)                                           (* sm " 6-Aug-85 10:01")
    (PROG (MOUSE-POSITION SHADED-KEY CURRENT-KEY-AND-REGIONS SHIFT-IS-DOWN)
	    (SETQ MOUSE-POSITION (CURSORPOSITION NIL WINDOW))
	    (SETQ SHADED-KEY (WINDOWPROP WINDOW (QUOTE VKBD.SHADED-KEY)))
	    [SETQ SHIFT-IS-DOWN (OR (KEYDOWNP (QUOTE LSHIFT))
					(KEYDOWNP (QUOTE RSHIFT]
	    [COND
	      (SHADED-KEY (COND
			    ((NOT (VKBD.POSITION-IS-IN-KEY-REGION SHADED-KEY MOUSE-POSITION 
								      WINDOW))
			      (VKBD.RESET-KEYBOARD-WINDOW WINDOW))
			    (T (RETURN T]
	    (COND
	      ((MOUSESTATE (OR (ONLY LEFT)
				 (ONLY MIDDLE)))
		(SETQ CURRENT-KEY-AND-REGIONS (VKBD.GET-KEY-AND-REGIONS-OF-CURSOR-POSITION 
										   MOUSE-POSITION 
											   WINDOW))
		(COND
		  (CURRENT-KEY-AND-REGIONS (for REGION in (CDR CURRENT-KEY-AND-REGIONS)
					      do (VKBD.INVERT-REGION REGION WINDOW))
					   (COND
					     ((OR SHIFT-IS-DOWN (LASTMOUSESTATE (ONLY MIDDLE)))
					       (VKBD.INVERT-SHIFT-KEYS WINDOW)
					       (WINDOWPROP WINDOW (QUOTE VKBD.SHIFT-DOWN)
							     T)))
					   (WINDOWPROP WINDOW (QUOTE VKBD.SHADED-KEY)
							 (CAR CURRENT-KEY-AND-REGIONS))
					   (WINDOWPROP WINDOW (QUOTE VKBD.LAST-MOUSE-STATE)
							 (COND
							   ((LASTMOUSESTATE (ONLY LEFT))
							     (QUOTE LEFT))
							   (T (QUOTE MIDDLE])

(VKBD.DISPLAY-CHARACTER
  [LAMBDA (CHAR REGION CHAR-LABELS WINDOW CONF ALLIGNMENT)   (* sm "13-Aug-85 14:29")
    (PROG (CHAR-LABEL)
	    (SETQ REGION (VKBD.EXTEND-REGION REGION -1))
	    (COND
	      ((SETQ CHAR-LABEL (FASSOC CHAR CHAR-LABELS))
		(DSPFONT (FONTCREATE (fetch (KEYBOARDCONFIGURATION KEYLABELSFONT) of CONF))
			   WINDOW)
		(CENTERPRINTINREGION (CADR CHAR-LABEL)
				       REGION WINDOW))
	      (T (VKBD.CENTER-BITMAP-IN-REGION (GETCHARBITMAP CHAR (FONTCREATE
								    (fetch (KEYBOARDCONFIGURATION
									       KEYBOARDDISPLAYFONT)
								       of CONF)))
						 REGION WINDOW ALLIGNMENT)

          (* * (DSPFONT (FONTCREATE (fetch (KEYBOARDCONFIGURATION KEYBOARDDISPLAYFONT) of CONF)) WINDOW) 
	  (CENTERPRINTINREGION (MKSTRING (CHARACTER CHAR)) REGION WINDOW))


		 ])

(VKBD.DISPLAY-EMPTY-KEY-CAP
  [LAMBDA (KEY-REGIONS BM)                                   (* sm " 5-Aug-85 11:50")
    (PROG (LEFT BOTTOM WIDTH HEIGHT)
	    (for REGION in KEY-REGIONS
	       do (SETQ LEFT (fetch (REGION LEFT) of REGION))
		    (SETQ BOTTOM (fetch (REGION BOTTOM) of REGION))
		    (SETQ WIDTH (fetch (REGION WIDTH) of REGION))
		    (SETQ HEIGHT (fetch (REGION HEIGHT) of REGION))
		    (BITBLT NIL NIL NIL BM LEFT BOTTOM WIDTH HEIGHT (QUOTE TEXTURE)
			      (QUOTE REPLACE)
			      BLACKSHADE)
		    (BITBLT NIL NIL NIL BM (ADD1 LEFT)
			      (ADD1 BOTTOM)
			      (IDIFFERENCE WIDTH 2)
			      (IDIFFERENCE HEIGHT 2)
			      (QUOTE TEXTURE)
			      (QUOTE REPLACE)
			      WHITESHADE)
		    (BITMAPBIT BM LEFT BOTTOM 0)
		    (BITMAPBIT BM (IPLUS LEFT (SUB1 WIDTH))
				 BOTTOM 0)
		    (BITMAPBIT BM LEFT (IPLUS BOTTOM (SUB1 HEIGHT))
				 0)
		    (BITMAPBIT BM (IPLUS LEFT (SUB1 WIDTH))
				 (IPLUS BOTTOM (SUB1 HEIGHT))
				 0))
	    (COND
	      ((CDR KEY-REGIONS)
		(for REGION1 in KEY-REGIONS
		   do (for REGION2 in KEY-REGIONS bind INTERSECT
			   do (COND
				  ((NOT (EQUAL REGION1 REGION2))
				    [SETQ INTERSECT (INTERSECTREGIONS
					(CREATEREGION (SUB1 (fetch (REGION LEFT) of REGION1))
							(SUB1 (fetch (REGION BOTTOM)
								   of REGION1))
							(IPLUS (fetch (REGION WIDTH)
								    of REGION1)
								 2)
							(IPLUS (fetch (REGION HEIGHT)
								    of REGION1)
								 2))
					(CREATEREGION (SUB1 (fetch (REGION LEFT) of REGION2))
							(SUB1 (fetch (REGION BOTTOM)
								   of REGION2))
							(IPLUS (fetch (REGION WIDTH)
								    of REGION2)
								 2)
							(IPLUS (fetch (REGION HEIGHT)
								    of REGION2)
								 2]
				    (COND
				      (INTERSECT (COND
						   ((GREATERP (fetch (REGION HEIGHT)
								   of INTERSECT)
								(fetch (REGION WIDTH) of 
											INTERSECT))
						     (SETQ INTERSECT
						       (CREATEREGION (fetch (REGION LEFT)
									  of INTERSECT)
								       (ADD1 (fetch (REGION
											  BOTTOM)
										  of INTERSECT))
								       (fetch (REGION WIDTH)
									  of INTERSECT)
								       (IDIFFERENCE
									 (fetch (REGION HEIGHT)
									    of INTERSECT)
									 2)))
						     (BITBLT NIL NIL NIL BM (fetch (REGION LEFT)
										 of INTERSECT)
							       (fetch (REGION BOTTOM) of 
											INTERSECT)
							       (fetch (REGION WIDTH) of INTERSECT)
							       (fetch (REGION HEIGHT) of 
											INTERSECT)
							       (QUOTE TEXTURE)
							       (QUOTE REPLACE)
							       BLACKSHADE)
						     (BITBLT NIL NIL NIL BM (fetch (REGION LEFT)
										 of INTERSECT)
							       (ADD1 (fetch (REGION BOTTOM)
									  of INTERSECT))
							       (fetch (REGION WIDTH) of INTERSECT)
							       (IDIFFERENCE (fetch (REGION HEIGHT)
										 of INTERSECT)
									      2)
							       (QUOTE TEXTURE)
							       (QUOTE REPLACE)
							       WHITESHADE))
						   (T (SETQ INTERSECT
							(CREATEREGION (ADD1 (fetch
										  (REGION LEFT)
										   of INTERSECT))
									(fetch (REGION BOTTOM)
									   of INTERSECT)
									(IDIFFERENCE
									  (fetch (REGION WIDTH)
									     of INTERSECT)
									  2)
									(fetch (REGION HEIGHT)
									   of INTERSECT)))
						      (BITBLT NIL NIL NIL BM (fetch (REGION
											  LEFT)
										  of INTERSECT)
								(fetch (REGION BOTTOM)
								   of INTERSECT)
								(fetch (REGION WIDTH) of 
											INTERSECT)
								(fetch (REGION HEIGHT)
								   of INTERSECT)
								(QUOTE TEXTURE)
								(QUOTE REPLACE)
								BLACKSHADE)
						      (BITBLT NIL NIL NIL BM
								(ADD1 (fetch (REGION LEFT)
									   of INTERSECT))
								(fetch (REGION BOTTOM)
								   of INTERSECT)
								(IDIFFERENCE (fetch (REGION
											  WIDTH)
										  of INTERSECT)
									       2)
								(fetch (REGION HEIGHT)
								   of INTERSECT)
								(QUOTE TEXTURE)
								(QUOTE REPLACE)
								WHITESHADE])

(VKBD.DISPLAY-KEY
  [LAMBDA (KEY-ID WINDOW CONF KEY-LABELS CHAR-LABELS)        (* sm "13-Aug-85 10:45")
    (PROG (CONF KEY-ASSIGNMENT LABEL-STRING LABEL)
	    (VKBD.CLEAR-KEY-DISPLAY KEY-ID WINDOW)
	    (SETQ CONF (OR CONF (VKBD.GET-CONFIGURATION WINDOW)))
	    (SETQ KEY-LABELS (OR KEY-LABELS (fetch (KEYBOARDCONFIGURATION KEYLABELS)
						   of CONF)))
	    [COND
	      ((SETQ LABEL (FASSOC KEY-ID KEY-LABELS))
		(SETQ LABEL-STRING (CADR LABEL)))
	      (T (SETQ KEY-ASSIGNMENT (VKBD.FETCH-KEY-ASSIGNMENT KEY-ID WINDOW))
		 (SETQ LABEL-STRING (VKBD.GET-NON-CHAR-LABEL KEY-ASSIGNMENT]
	    (COND
	      [LABEL-STRING (SETQ KEY-REGION (CAR (VKBD.GET-KEY-REGIONS KEY-ID WINDOW)))
			    (DSPFONT (FONTCREATE (fetch (KEYBOARDCONFIGURATION KEYLABELSFONT)
							of CONF))
				       WINDOW)
			    (COND
			      ((AND (LISTP LABEL-STRING)
				      (CDR LABEL-STRING))
				(CENTERPRINTINREGION (CAR LABEL-STRING)
						       (VKBD.UPER-HALF-REGION KEY-REGION)
						       WINDOW)
				(CENTERPRINTINREGION (CADR LABEL-STRING)
						       (VKBD.LOWER-HALF-REGION KEY-REGION)
						       WINDOW))
			      (T (CENTERPRINTINREGION LABEL-STRING KEY-REGION WINDOW]
	      (T (VKBD.DISPLAY-KEY-CHARACTERS KEY-ASSIGNMENT WINDOW CONF CHAR-LABELS])

(VKBD.DISPLAY-KEY-CHARACTERS
  [LAMBDA (KEY-ASSIGNMENT WINDOW CONF CHAR-LABELS)           (* sm "13-Aug-85 10:50")
    (PROG (KEY-REGION CHAR-LABELS CONF SHIFTED-CHAR UNSHIFTED-CHAR)
	    (COND
	      ((AND KEY-ASSIGNMENT (LISTP (CADR KEY-ASSIGNMENT)))
		(SETQ CONF (OR CONF (VKBD.GET-CONFIGURATION WINDOW)))
		(SETQ CHAR-LABELS (OR CHAR-LABELS (fetch (KEYBOARDCONFIGURATION CHARLABELS)
							 of CONF)))
		(SETQ KEY-REGION (CAR (VKBD.GET-KEY-REGIONS (CAR KEY-ASSIGNMENT)
								  CONF)))
		(SETQ SHIFTED-CHAR (VKBD.SHIFTED-CHAR KEY-ASSIGNMENT))
		(SETQ UNSHIFTED-CHAR (VKBD.UNSHIFTED-CHAR KEY-ASSIGNMENT))
		(COND
		  ((EQ SHIFTED-CHAR UNSHIFTED-CHAR)
		    (VKBD.DISPLAY-CHARACTER SHIFTED-CHAR KEY-REGION CHAR-LABELS WINDOW CONF))
		  (T (VKBD.DISPLAY-CHARACTER UNSHIFTED-CHAR (VKBD.LOWER-HALF-REGION KEY-REGION)
					       CHAR-LABELS WINDOW CONF (QUOTE BOTTOM))
		     (VKBD.DISPLAY-CHARACTER SHIFTED-CHAR (VKBD.UPER-HALF-REGION KEY-REGION)
					       CHAR-LABELS WINDOW CONF (QUOTE TOP])

(VKBD.DRAW-KEY-CAPS
  [LAMBDA (LIST-OF-REGIONS BITMAP)                           (* sm " 5-Aug-85 09:23")
    (for REGION in LIST-OF-REGIONS
       do (BITBLT NIL NIL NIL BITMAP (fetch LEFT of REGION)
		  (fetch (REGION BOTTOM) of REGION)
		  (fetch (REGION WIDTH) of REGION)
		  (fetch (REGION HEIGHT) of REGION)
		  (QUOTE TEXTURE)
		  (QUOTE REPLACE)
		  BLACKSHADE)
	  (BITBLT NIL NIL NIL BITMAP (ADD1 (fetch (REGION LEFT) of REGION))
		  (ADD1 (fetch (REGION BOTTOM) of REGION))
		  (IDIFFERENCE (fetch (REGION WIDTH) of REGION)
			       2)
		  (IDIFFERENCE (fetch (REGION HEIGHT) of REGION)
			       2)
		  (QUOTE TEXTURE)
		  (QUOTE REPLACE)
		  WHITESHADE])

(VKBD.ERASE-FRAME
  [LAMBDA (KEY WINDOW FRAMESIZE)                             (* sm " 5-Aug-85 09:30")
    (VKBD.FRAME-KEY KEY WINDOW (fetch (KEYBOARDCONFIGURATION BACKGROUNDSHADE) of (
VKBD.GET-CONFIGURATION WINDOW))
		    FRAMESIZE])

(VKBD.EXTEND-REGION
  [LAMBDA (REGION NBITS)                                     (* sm " 5-Aug-85 09:30")
    (COND
      ((NULL NBITS)
	(SETQ NBITS 1)))
    (CREATEREGION (IDIFFERENCE (fetch (REGION LEFT) of REGION)
				   NBITS)
		    (IDIFFERENCE (fetch (REGION BOTTOM) of REGION)
				   NBITS)
		    (IPLUS (fetch (REGION WIDTH) of REGION)
			     (ITIMES NBITS 2))
		    (IPLUS (fetch (REGION HEIGHT) of REGION)
			     (ITIMES NBITS 2])

(VKBD.FETCH-KEY-ASSIGNMENT
  [LAMBDA (KEY WINDOW)                                       (* sm " 5-Aug-85 09:49")
    (FASSOC KEY (fetch (VIRTUALKEYBOARD KEYASSIGNMENTS) of (WINDOWPROP WINDOW (QUOTE VKBD.KEYBOARD])

(VKBD.FRAME-KEY
  [LAMBDA (KEY WINDOW SHADE BITS)                            (* sm "13-Aug-85 10:52")
    (PROG (KEY-REGIONS EXTENDED-REGION)
          (SETQ KEY-REGIONS (VKBD.GET-KEY-REGIONS KEY WINDOW))
          (for REGION in KEY-REGIONS
	     do (SETQ EXTENDED-REGION (VKBD.EXTEND-REGION REGION BITS))
		(BITBLT NIL NIL NIL WINDOW (fetch (REGION LEFT) of EXTENDED-REGION)
			(fetch (REGION BOTTOM) of EXTENDED-REGION)
			(fetch (REGION WIDTH) of EXTENDED-REGION)
			(fetch (REGION HEIGHT) of EXTENDED-REGION)
			(QUOTE TEXTURE)
			(QUOTE REPLACE)
			SHADE))
          (VKBD.DISPLAY-EMPTY-KEY-CAP KEY-REGIONS WINDOW)
          (VKBD.DISPLAY-KEY KEY WINDOW)
          (if (EQ (WINDOWPROP WINDOW (QUOTE VKBD.SHADED-KEY))
		  KEY)
	      then (VKBD.INVERT-KEY KEY WINDOW])

(VKBD.GET-CONFIGURATION
  [LAMBDA (CONFNAME/WINDOW)                                  (* jds "13-Nov-85 08:52")
    [COND
      ((WINDOWP CONFNAME/WINDOW)
	(SETQ CONFNAME/WINDOW (fetch (VIRTUALKEYBOARD KEYBOARDCONFIGURATION)
				   of (WINDOWPROP CONFNAME/WINDOW (QUOTE VKBD.KEYBOARD]
    (COND
      ((type? KEYBOARDCONFIGURATION CONFNAME/WINDOW)
	CONFNAME/WINDOW)
      (T (FASSOC (OR CONFNAME/WINDOW VKBD.DEFAULT-CONFIGURATION-NAME (MACHINETYPE))
		   VKBD.CONFIGURATIONS])

(VKBD.GET-CURRENT-KEY-ASSIGNMENT
  [LAMBDA (KEY WINDOW/CONFIGURATION)                         (* sm " 5-Aug-85 14:55")
    (CONS KEY (KEYACTION (VKBD.TRANSLATE-KEY-ID KEY WINDOW/CONFIGURATION])

(VKBD.GET-KEY-AND-REGIONS-OF-CURSOR-POSITION
  [LAMBDA (CURSOR-POSITION WINDOW)                           (* sm " 5-Aug-85 11:18")
    (for KEY-REGIONS in (fetch (KEYBOARDCONFIGURATION KEYREGIONS) of (VKBD.GET-CONFIGURATION WINDOW))
       thereis (for REGION in (CDR KEY-REGIONS) thereis (INSIDEP REGION CURSOR-POSITION])

(VKBD.GET-KEY-REGIONS
  [LAMBDA (KEY-ID CONFIGURATION/WINDOW)                      (* sm " 5-Aug-85 09:34")
    (CDR (FASSOC KEY-ID (fetch (KEYBOARDCONFIGURATION KEYREGIONS) of (VKBD.GET-CONFIGURATION 
									     CONFIGURATION/WINDOW])

(VKBD.GET-NON-CHAR-LABEL
  [LAMBDA (KEY-ASSIGNMENT)                                   (* sm "13-Aug-85 10:43")
    (COND
      ((VKBD.SHIFT-ASSIGNMENTP KEY-ASSIGNMENT)
	"SHIFT")
      ((VKBD.LOCK-ASSIGNMENTP KEY-ASSIGNMENT)
	"LOCK")
      ((VKBD.CTRL-ASSIGNMENTP KEY-ASSIGNMENT)
	"CTRL")
      ((VKBD.LOCKUP-ASSIGNMENTP KEY-ASSIGNMENT)
	(QUOTE ("LOCK" "UP")))
      ((VKBD.LOCKDOWN-ASSIGNMENTP KEY-ASSIGNMENT)
	(QUOTE ("LOCK" "DOWN")))
      ((VKBD.META-ASSIGNMENTP KEY-ASSIGNMENT)
	"META")
      ((VKBD.EVENT-ASSIGNMENTP KEY-ASSIGNMENT)
	" ")
      (T NIL])

(VKBD.ICONFN
  [LAMBDA (WINDOW ICON)                                      (* sm " 5-Aug-85 15:54")
    [COND
      ((NULL ICON)
	(SETQ ICON (TITLEDICONW (create TITLEDICON
					ICON ← VKBD.ICON
					MASK ← VKBD.MASK
					TITLEREG ←(CREATEREGION 5 15 80 50))
				(fetch (VIRTUALKEYBOARD KEYBOARDNAME) of (WINDOWPROP WINDOW
										     (QUOTE 
										    VKBD.KEYBOARD)))
				(FONTCREATE (QUOTE GACHA)
					    8]
    ICON])

(VKBD.INVERT-LOCK-KEYS
  [LAMBDA (WINDOW)                                           (* sm " 5-Aug-85 09:34")
    (for KEY-ASSIGNMENT in (fetch (VIRTUALKEYBOARD KEYASSIGNMENTS) of (WINDOWPROP WINDOW
										  (QUOTE 
										    VKBD.KEYBOARD)))
       when (VKBD.LOCK-ASSIGNMENTP KEY-ASSIGNMENT) do (VKBD.INVERT-KEY (CAR KEY-ASSIGNMENT)
								       WINDOW])

(VKBD.INVERT-SHIFT-KEYS
  [LAMBDA (WINDOW)                                           (* sm " 5-Aug-85 09:34")
    (for KEY-ASSIGNMENT in (fetch (VIRTUALKEYBOARD KEYASSIGNMENTS) of (WINDOWPROP WINDOW
										  (QUOTE 
										    VKBD.KEYBOARD)))
       when (VKBD.SHIFT-ASSIGNMENTP KEY-ASSIGNMENT) do (VKBD.INVERT-KEY (CAR KEY-ASSIGNMENT)
									WINDOW])

(VKBD.TRANSLATE-KEY-ID
  [LAMBDA (KEY-ID WINDOW/CONFIGURATION)                      (* sm " 7-Aug-85 17:06")
    (PROG (MAPPING)
          (SETQ WINDOW/CONFIGURATION (VKBD.GET-CONFIGURATION WINDOW/CONFIGURATION))
          (SETQ MAPPING (fetch ACTUALKEYSMAPING of WINDOW/CONFIGURATION))
          (if (NULL MAPPING)
	      then (RETURN KEY-ID))
          (if (AND (LISTP MAPPING)
		   (EQ (CAR MAPPING)
		       (QUOTE LAMBDA)))
	      then (RETURN (APPLY* MAPPING KEY-ID))
	    elseif (AND (ATOM MAPPING)
			(GETD MAPPING))
	      then (RETURN (APPLY* MAPPING KEY-ID))
	    else (RETURN (CADR (FASSOC KEY-ID MAPPING])

(VKBD.INVERT-KEY
  [LAMBDA (KEY-ID VKBD-WINDOW)                               (* sm "30-Jul-85 21:19")
    (for REGION in (VKBD.GET-KEY-REGIONS KEY-ID VKBD-WINDOW) do (VKBD.INVERT-REGION REGION 
										    VKBD-WINDOW])

(VKBD.INVERT-REGION
  [LAMBDA (REGION WINDOW)                                    (* sm " 5-Aug-85 09:35")
    (if REGION
	then (BITBLT WINDOW (fetch (REGION LEFT) of REGION)
		     (fetch (REGION BOTTOM) of REGION)
		     WINDOW
		     (fetch (REGION LEFT) of REGION)
		     (fetch (REGION BOTTOM) of REGION)
		     (fetch (REGION WIDTH) of REGION)
		     (fetch (REGION HEIGHT) of REGION)
		     (QUOTE INVERT)
		     (QUOTE REPLACE])

(VKBD.KEY-ID-TO-KEY-NAMES
  [LAMBDA (KEY-ID WINDOW/CONFIGURATION)                      (* sm " 5-Aug-85 09:36")
    (SETQ WINDOW/CONFIGURATION (VKBD.GET-CONFIGURATION WINDOW/CONFIGURATION))
    (for NAME-ID-PAIR in (fetch (KEYBOARDCONFIGURATION KEYNAMESMAPPING) of WINDOW/CONFIGURATION)
       when (EQ (CADR NAME-ID-PAIR)
		KEY-ID)
       collect (CAR NAME-ID-PAIR])

(VKBD.KEY-NAME-TO-KEY-ID
  [LAMBDA (KEY-NAME CONFIGURATION-NAME)                      (* sm " 5-Aug-85 09:36")
    (CADR (FASSOC KEY-NAME (fetch (KEYBOARDCONFIGURATION KEYNAMESMAPPING) of (VKBD.GET-CONFIGURATION
									       CONFIGURATION-NAME])

(VKBD.KEYBOARD-IS-MACHINE-KEYBOARD
  [LAMBDA (KEYBOARD)                                         (* jds "13-Nov-85 08:45")
                                                             (* T if this keyboard is configured for this machine.)
    (EQ (fetch (KEYBOARDCONFIGURATION MACHINETYPE) of (VKBD.GET-CONFIGURATION (fetch 
									    KEYBOARDCONFIGURATION
											 of 
											 KEYBOARD)))
	  (MACHINETYPE])

(VKBD.KEYBOARD-WINDOW-REPAINTFN
  [LAMBDA (WINDOW)                                           (* sm " 7-Aug-85 17:05")
    (PROG (CONFIGURATION DISPLAYED-KEYS BM KEY-LABELS CHAR-LABELS)
	    (SETQ CONFIGURATION (VKBD.GET-CONFIGURATION WINDOW))
	    (SETQ KEY-LABELS (fetch (KEYBOARDCONFIGURATION KEYLABELS) of CONFIGURATION))
	    (SETQ CHAR-LABELS (fetch (KEYBOARDCONFIGURATION CHARLABELS) of CONFIGURATION))
	    (SETQ BM (VKBD.CREATE-KEYBOARD-BITMAP CONFIGURATION))
	    (BITBLT BM 0 0 WINDOW)
	    (for KEY in (fetch (KEYBOARDCONFIGURATION KEYSIDLIST) of CONFIGURATION)
	       do (VKBD.DISPLAY-KEY KEY WINDOW CONFIGURATION KEY-LABELS CHAR-LABELS))
	    (COND
	      ((WINDOWPROP WINDOW (QUOTE VKBD.LOCKED))
		(VKBD.INVERT-LOCK-KEYS WINDOW)))
	    (WINDOWPROP WINDOW (QUOTE VKBD.SHADED-KEY)
			  NIL)
	    (WINDOWPROP WINDOW (QUOTE VKBD.LAST-MOUSE-STATE)
			  NIL])

(VKBD.LOCK-ASSIGNMENTP
  [LAMBDA (ASSIGNMENT)                                       (* sm " 4-Aug-85 23:03")
    (AND (EQ (CADR ASSIGNMENT)
	     (QUOTE LOCKDOWN))
	 (EQ (CDDR ASSIGNMENT)
	     (QUOTE LOCKUP])

(VKBD.LOCK-KEYP
  [LAMBDA (KEY WINDOW)                                       (* sm " 5-Aug-85 09:42")
    (VKBD.LOCK-ASSIGNMENTP (FASSOC KEY (fetch (VIRTUALKEYBOARD KEYASSIGNMENTS)
					  of (WINDOWPROP WINDOW (QUOTE VKBD.KEYBOARD])

(VKBD.LOCK/NOLOCK
  [LAMBDA (KEY-ACTION)                                       (* sm "28-May-85 16:36")
    (CADDR (CADR KEY-ACTION])

(VKBD.LOCKDOWN-ASSIGNMENTP
  [LAMBDA (ASSIGNMENT)                                       (* sm "12-Aug-85 16:35")
    (AND (EQ (CADR ASSIGNMENT)
	     (QUOTE LOCKDOWN))
	 (OR (NULL (CDDR ASSIGNMENT))
	     (EQ (CDDR ASSIGNMENT)
		 (QUOTE IGNORE])

(VKBD.LOCKUP-ASSIGNMENTP
  [LAMBDA (ASSIGNMENT)                                       (* sm "12-Aug-85 16:36")
    (AND (EQ (CADR ASSIGNMENT)
	     (QUOTE LOCKUP))
	 (OR (NULL (CDDR ASSIGNMENT))
	     (EQ (CDDR ASSIGNMENT)
		 (QUOTE IGNORE])

(VKBD.LOWER-HALF-REGION
  [LAMBDA (REGION)                                           (* sm "13-Aug-85 10:36")
    (CREATEREGION (fetch (REGION LEFT) of REGION)
		  (fetch (REGION BOTTOM) of REGION)
		  (fetch (REGION WIDTH) of REGION)
		  (IQUOTIENT (fetch (REGION HEIGHT) of REGION)
			     2])

(VKBD.PARSE-CHAR-CODE
  [LAMBDA (CHAR-CODE)                                        (* sm "28-May-85 13:48")
    (COND
      ((FIXP CHAR-CODE)
	CHAR-CODE)
      ((AND CHAR-CODE (ATOM CHAR-CODE))
	(APPLY* (QUOTE CHARCODE)
		CHAR-CODE))
      ((AND (LISTP CHAR-CODE)
	    (EQP (LENGTH CHAR-CODE)
		 2)
	    (FIXP (CAR CHAR-CODE))
	    (FIXP (CADR CHAR-CODE)))
	(IPLUS (ITIMES 256 (CAR CHAR-CODE))
	       (CADR CHAR-CODE])

(VKBD.PARSE-KEY-ASSIGNMENT
  [LAMBDA (KEY-ASSIGNMENT KEYBOARD-CONFIGURATION-NAME)       (* sm " 5-Aug-85 09:43")
    (PROG (KEY UNSHIFTED-CHAR SHIFTED-CHAR LOCK/NOLOCK)
          (COND
	    ((LESSP (LENGTH KEY-ASSIGNMENT)
		    2)
	      (RETURN NIL)))
          (SETQ KEY (CAR KEY-ASSIGNMENT))
          (OR (FMEMB KEY (fetch (KEYBOARDCONFIGURATION KEYSIDLIST) of (VKBD.GET-CONFIGURATION 
								      KEYBOARD-CONFIGURATION-NAME)))
	      (SETQ KEY (VKBD.KEY-NAME-TO-KEY-ID KEY KEYBOARD-CONFIGURATION-NAME))
	      (RETURN NIL))
          [if (NOT (VKBD.CHAR-ASSIGNMENTP KEY-ASSIGNMENT))
	      then (RETURN (CONS KEY (CDR KEY-ASSIGNMENT]
          (COND
	    ((LESSP (LENGTH (CADR KEY-ASSIGNMENT))
		    2)
	      (RETURN NIL)))
          (SETQ UNSHIFTED-CHAR (VKBD.PARSE-CHAR-CODE (VKBD.UNSHIFTED-CHAR KEY-ASSIGNMENT)))
          [COND
	    ((NULL (CDADR KEY-ASSIGNMENT))
	      (SETQ SHIFTED-CHAR UNSHIFTED-CHAR)
	      (SETQ LOCK/NOLOCK (QUOTE LOCKSHIFT)))
	    (T (SETQ SHIFTED-CHAR (VKBD.PARSE-CHAR-CODE (VKBD.SHIFTED-CHAR KEY-ASSIGNMENT)))
	       (COND
		 ((NULL (CDDADR KEY-ASSIGNMENT))
		   (SETQ LOCK/NOLOCK (QUOTE LOCKSHIFT)))
		 ((FMEMB (VKBD.LOCK/NOLOCK KEY-ASSIGNMENT)
			 (QUOTE (LOCKSHIFT NOLOCKSHIFT)))
		   (SETQ LOCK/NOLOCK (VKBD.LOCK/NOLOCK KEY-ASSIGNMENT)))
		 (T (SETQ LOCK/NOLOCK (QUOTE LOCKSHIFT]
          (RETURN (CONS KEY (CONS (LIST UNSHIFTED-CHAR SHIFTED-CHAR LOCK/NOLOCK)
				  (CDDR KEY-ASSIGNMENT])

(VKBD.PERFORM-KEY-ASSIGNMENT
  [LAMBDA (KEY-ASSIGNMENT WINDOW/CONFIGURATION)              (* sm " 5-Aug-85 14:26")
    (KEYACTION (VKBD.TRANSLATE-KEY-ID (CAR KEY-ASSIGNMENT)
				      WINDOW/CONFIGURATION)
	       (CDR KEY-ASSIGNMENT])

(VKBD.POP-MENU-AND-SWITCH-KEYBOARDS
  [LAMBDA (SWITCH-FLG DISPLAY-FLG)                           (* sm "12-Jun-85 14:49")
    (PROG (KEYBOARD)
          (SETQ KEYBOARD (VKBD.POP-UP-KEYBOARDS-MENU "Select an alternative keyboard"))
          (if KEYBOARD
	      then (SWITCHKEYBOARDS KEYBOARD SWITCH-FLG DISPLAY-FLG])

(VKBD.POP-UP-KEYBOARDS-MENU
  [LAMBDA (PROMPT-STRING)                                    (* sm " 5-Aug-85 09:44")
    (if PROMPT-STRING
	then (PROMPTPRINT PROMPT-STRING)
	     (FLASHWINDOW PROMPTWINDOW 1))
    (MENU (create MENU
		  ITEMS ←(CONS (QUOTE (Quit NIL))
			       (for K in VKBD.KNOWN-KEYBOARDS collect (fetch (VIRTUALKEYBOARD 
										     KEYBOARDNAME)
									 of K)))
		  MENUFONT ← BIGFONT])

(VKBD.POSITION-IS-IN-KEY-REGION
  [LAMBDA (KEY POSITION WINDOW)
    (for REGION in (VKBD.GET-KEY-REGIONS KEY WINDOW) thereis (INSIDEP REGION POSITION])

(VKBD.REMOVE-KEYBOARD-COMMAND
  [LAMBDA NIL                                                (* sm "12-Jun-85 15:43")
    (PROG (K)
          (SETQ K (VKBD.POP-UP-KEYBOARDS-MENU "Select keyboard to be removed ."))
          (if K
	      then (VKBD.UNDEFINE-KEYBOARD K)
		   (PRINTOUT PROMPTWINDOW "Keyboard " K 
			     " was removed from the list of known keyboards. "])

(VKBD.RESET-KEYBOARD-WINDOW
  [LAMBDA (WINDOW)                                           (* sm " 6-Aug-85 09:44")
    (PROG (SHADED-KEY)
          (if (SETQ SHADED-KEY (WINDOWPROP WINDOW (QUOTE VKBD.SHADED-KEY)))
	      then (VKBD.INVERT-KEY SHADED-KEY WINDOW)
		   (WINDOWPROP WINDOW (QUOTE VKBD.SHADED-KEY)
			       NIL))
          (if (WINDOWPROP WINDOW (QUOTE VKBD.SHIFT-DOWN))
	      then (VKBD.INVERT-SHIFT-KEYS WINDOW)
		   (WINDOWPROP WINDOW (QUOTE VKBD.SHIFT-DOWN)
			       NIL))
          (WINDOWPROP WINDOW (QUOTE VKBD.LAST-MOUSE-STATE)
		      NIL])

(VKBD.SEND-CHARACTER
  [LAMBDA (KEY WINDOW MOUSEKEY)                              (* sm " 7-Aug-85 17:04")
    (PROG (KEY-ASSIGNMENT CHAR-CODE CONFIGURATION)
          (SETQ CONFIGURATION (VKBD.GET-CONFIGURATION WINDOW))
          (if (VKBD.LOCK-KEYP KEY WINDOW)
	      then [WINDOWPROP WINDOW (QUOTE VKBD.LOCKED)
			       (NOT (WINDOWPROP WINDOW (QUOTE VKBD.LOCKED]
		   (VKBD.INVERT-LOCK-KEYS WINDOW)
	    else [SETQ KEY-ASSIGNMENT (FASSOC KEY (fetch (VIRTUALKEYBOARD KEYASSIGNMENTS)
						     of (WINDOWPROP WINDOW (QUOTE VKBD.KEYBOARD]
		 (if (VKBD.CHAR-ASSIGNMENTP KEY-ASSIGNMENT)
		     then (SETQ CHAR-CODE (if [OR (KEYDOWNP (QUOTE RSHIFT))
						  (KEYDOWNP (QUOTE LSHIFT))
						  (WINDOWPROP WINDOW (QUOTE VKBD.SHIFT-DOWN))
						  (AND (EQ (VKBD.LOCK/NOLOCK KEY-ASSIGNMENT)
							   (QUOTE LOCKSHIFT))
						       (WINDOWPROP WINDOW (QUOTE VKBD.LOCKED]
					      then (VKBD.SHIFTED-CHAR KEY-ASSIGNMENT)
					    else (VKBD.UNSHIFTED-CHAR KEY-ASSIGNMENT)))
			  (if CHAR-CODE
			      then (BKSYSBUF (CHARACTER CHAR-CODE])

(VKBD.SHIFT-ASSIGNMENTP
  [LAMBDA (ASSIGNMENT)                                       (* sm " 4-Aug-85 23:27")
    (OR (AND (EQ (CADR ASSIGNMENT)
		 (QUOTE 1SHIFTDOWN))
	     (EQ (CDDR ASSIGNMENT)
		 (QUOTE 1SHIFTUP)))
	(AND (EQ (CADR ASSIGNMENT)
		 (QUOTE 2SHIFTDOWN))
	     (EQ (CDDR ASSIGNMENT)
		 (QUOTE 2SHIFTUP])

(VKBD.SHIFTED-CHAR
  [LAMBDA (KEY-ASSIGNMENT)                                   (* sm "31-Jul-85 14:14")
    (CADADR KEY-ASSIGNMENT])

(VKBD.UNDEFINE-KEYBOARD
  [LAMBDA (KEYBOARD-NAME)                                    (* sm " 8-Aug-85 09:54")
    (IF (EQ KEYBOARD-NAME (QUOTE DEFAULT))
	THEN (PROMPTPRINT "Can not delete the default keyboart. ")
      ELSE (SETQ VKBD.KNOWN-KEYBOARDS (REMOVE (FASSOC KEYBOARD-NAME VKBD.KNOWN-KEYBOARDS)
					      VKBD.KNOWN-KEYBOARDS])

(VKBD.UNION-REGIONS
  [LAMBDA (REGION-SET)                                       (* sm " 6-Aug-85 11:38")
    (SETQ REGION-SET (COPY REGION-SET))
    (APPLY (QUOTE UNIONREGIONS)
	   (while REGION-SET collect (APPLY (QUOTE UNIONREGIONS)
					    (while REGION-SET for I from 1 to 50 collect
										  (pop REGION-SET])

(VKBD.UNSHIFTED-CHAR
  [LAMBDA (KEY-ASSIGNMENT)                                   (* sm "31-Jul-85 14:14")
    (CAADR KEY-ASSIGNMENT])

(VKBD.UPER-HALF-REGION
  [LAMBDA (REGION)                                           (* sm "13-Aug-85 10:38")
    (CREATEREGION (fetch (REGION LEFT) of REGION)
		  (IPLUS 1 (fetch (REGION BOTTOM) of REGION)
			 (IQUOTIENT (fetch (REGION HEIGHT) of REGION)
				    2))
		  (fetch (REGION WIDTH) of REGION)
		  (IQUOTIENT (fetch (REGION HEIGHT) of REGION)
			     2])
)
[DECLARE: EVAL@COMPILE 

(RECORD KEYBOARDCONFIGURATION (CONFIGURATIONNAME KEYSIDLIST KEYREGIONS ASSIGNABLEKEYS 
						   DEFAULTASSIGNMENT KEYNAMESMAPPING MACHINETYPE 
						   KEYLABELS KEYLABELSFONT BACKGROUNDSHADE 
						   KEYBOARDDISPLAYFONT CHARLABELS ACTUALKEYSMAPING)
				[TYPE? (EQP (LENGTH DATUM)
						(LENGTH (RECORDFIELDNAMES (QUOTE 
									    KEYBOARDCONFIGURATION]
				MACHINETYPE ←(MACHINETYPE)
				KEYLABELSFONT ←(QUOTE (HELVETICA 5))
				BACKGROUNDSHADE ← 23130 KEYBOARDDISPLAYFONT ←(QUOTE (CLASSIC 12))
				CHARLABELS ←(QUOTE ((1 BS)
						       (92 ESC)
						       (9 TAB)
						       (13 CR))))

(RECORD VIRTUALKEYBOARD (KEYBOARDNAME KEYASSIGNMENTS KEYBOARDCONFIGURATION))
]

(RPAQ? VKBD.DEFAULT-CONFIGURATION-NAME (MACHINETYPE))

(RPAQ? VKBD.KNOWN-KEYBOARDS NIL)

(RPAQQ VKBD.BACKGROUND-MENU-SUBITEMS (SUBITEMS
	 ("Switch keyboard" [QUOTE (ADD.PROCESS (QUOTE (VKBD.POP-MENU-AND-SWITCH-KEYBOARDS T]
			    "Switches the key actions of the keyborad.")
	 ("Switch and display" [QUOTE (ADD.PROCESS (QUOTE (VKBD.POP-MENU-AND-SWITCH-KEYBOARDS T T]
			       
"Switches the key actions of the keyboards and displays the new keyboard. the displayed keyboard can be used as a menu."
			       )
	 ("Display only" [QUOTE (ADD.PROCESS (QUOTE (VKBD.POP-MENU-AND-SWITCH-KEYBOARDS NIL T]
			 "Displays the new keyboard. The displayed keyboard can be used as a menu.")
	 ("Store keyboards" (QUOTE (ADD.PROCESS (QUOTE (VKBD.STORE-FILE-COMMAND))
						(QUOTE WINDOW)
						PROMPTWINDOW))
			    "Stores the current known keyboards")
	 ("Load keyboards file" (QUOTE (ADD.PROCESS (QUOTE (VKBD.LOAD-FILE-COMMAND))
						    (QUOTE WINDOW)
						    PROMPTWINDOW))
				
"Adds definition of keyboards found on file. If a keyboard with the same name is already known to the system DO NOT redefine it. "
				(SUBITEMS ("Replace" (QUOTE (ADD.PROCESS (QUOTE (
VKBD.LOAD-FILE-COMMAND NIL T))
									 (QUOTE WINDOW)
									 PROMPTWINDOW))
						     
			 "Removes the current known definitions and loads predefined keyboards .")
					  ("Add, don't redefine" (QUOTE (ADD.PROCESS
									  (QUOTE (
VKBD.LOAD-FILE-COMMAND NIL NIL))
									  (QUOTE WINDOW)
									  PROMPTWINDOW))
								 
"Adds definition of keyboards found on file. If a keyboard with the same name is already known to the system DO NOT redefine it. "
								 )
					  ("Add, redefine" (QUOTE (ADD.PROCESS (QUOTE (
VKBD.LOAD-FILE-COMMAND T NIL))
									       (QUOTE WINDOW)
									       PROMPTWINDOW))
							   
"Adds definitions of keyboards found on file. If a keyboard with the same name is already known to the system, REDEFINE ir"
							   )))
	 ("Remove keyboard" [QUOTE (ADD.PROCESS (QUOTE (VKBD.REMOVE-KEYBOARD-COMMAND]
			    "Removes a keyboard from the list of known keyboards")))

(RPAQQ VKBD.NON-CHAR-ASSIGNMENTS-LABELS ((SHIFT SHIFT)
					   (CTRL CTRL)
					   (META META)
					   (LOCK LOCK)
					   (LOCKUP LOCKUP)
					   (LOCKDOWN LOCKDOWN)))

(RPAQQ VKBD.CONFIGURATIONS [(DORADO (100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 
					   115 116 117 118 119 120 121 122 123 124 125 126 127 128 
					   129 130 131 132 133 134 135 136 137 138 139 140 141 142 
					   143 144 145 146 148 149 150 151 152 153 154 155 156 157 
					   158 159 160 161)
				      ((100 (178 154 29 33))
				       (101 (146 154 29 33))
				       (102 (210 154 29 33))
				       (103 (130 118 29 33))
				       (104 (242 154 29 33))
				       (105 (138 82 29 33))
				       (106 (258 118 29 33))
				       (107 (186 46 29 33))
				       (108 (338 154 29 33))
				       (109 (298 82 29 33))
				       (110 (370 154 29 33))
				       (111 (354 118 29 33))
				       (112 (378 46 29 33))
				       (113 (434 154 29 33))
				       (114 (466 154 29 33))
				       (115 (482 118 29 33))
				       (116 (114 154 29 33))
				       (117 (82 154 29 33))
				       (118 (98 118 29 33))
				       (119 (66 118 29 33))
				       (120 (106 82 29 33))
				       (121 (74 82 29 33))
				       (122 (306 154 29 33))
				       (123 (290 118 29 33))
				       (124 (122 46 29 33))
				       (125 (322 118 29 33))
				       (126 (330 82 29 33))
				       (127 (314 46 29 33))
				       (128 (394 82 29 33))
				       (129 (418 118 29 33))
				       (130 (492 82 29 33))
				       (131 (514 118 29 33))
				       (132 (50 154 29 33))
				       (133 (18 154 29 33))
				       (134 (9 118 54 33))
				       (135 (170 82 29 33))
				       (136 (18 82 52 33))
				       (137 (154 46 29 33))
				       (138 (266 82 29 33))
				       (139 (218 46 29 33))
				       (140 (90 46 29 33))
				       (141 (38 46 49 33))
				       (142 (346 46 29 33))
				       (143 (362 82 29 33))
				       (144 (426 82 63 33))
				       (145 (450 118 29 33))
				       (146 (498 154 29 33))
				       (148 (162 118 29 33))
				       (149 (194 118 29 33))
				       (150 (202 82 29 33))
				       (151 (226 118 29 33))
				       (152 (234 82 29 33))
				       (153 (274 154 29 33))
				       (154 (250 46 29 33))
				       (155 (282 46 29 33))
				       (156 (6 46 29 33))
				       (157 (110 10 279 33))
				       (158 (386 118 29 33))
				       (159 (402 154 29 33))
				       (160 (410 46 63 33))
				       (161 (476 46 29 33)))
				      (118 100 101 102 103 104 105 106 107 108 109 110 111 112 116 
					   117 119 120 121 122 123 124 125 126 127 128 129 132 135 
					   137 138 139 140 142 143 145 148 149 150 151 152 153 154 
					   155 158 159)
				      ((102 (54 126 NOLOCKSHIFT))
				       (110 (45 45 NOLOCKSHIFT))
				       (133 (27 27 NOLOCKSHIFT))
				       (145 (← ↑ NOLOCKSHIFT))
				       (136 CTRLDOWN . CTRLUP)
				       (100 (53 37 NOLOCKSHIFT))
				       (101 (52 36 NOLOCKSHIFT))
				       (103 (101 69 LOCKSHIFT))
				       (104 (55 38 NOLOCKSHIFT))
				       (105 (100 68 LOCKSHIFT))
				       (106 (117 85 LOCKSHIFT))
				       (107 (118 86 LOCKSHIFT))
				       (108 (48 41 NOLOCKSHIFT))
				       (109 (107 75 LOCKSHIFT))
				       (111 (112 80 LOCKSHIFT))
				       (112 (47 63 NOLOCKSHIFT))
				       (113 (\ %| NOLOCKSHIFT))
				       (114 (10 10 NOLOCKSHIFT))
				       (115 (8 8 NOLOCKSHIFT))
				       (116 (51 35 NOLOCKSHIFT))
				       (117 (50 64 NOLOCKSHIFT))
				       (118 (119 87 LOCKSHIFT))
				       (119 (113 81 LOCKSHIFT))
				       (120 (115 83 LOCKSHIFT))
				       (121 (97 65 LOCKSHIFT))
				       (122 (57 40 NOLOCKSHIFT))
				       (123 (105 73 LOCKSHIFT))
				       (124 (120 88 LOCKSHIFT))
				       (125 (111 79 LOCKSHIFT))
				       (126 (108 76 LOCKSHIFT))
				       (127 (44 60 NOLOCKSHIFT))
				       (128 (39 34 NOLOCKSHIFT))
				       (129 (93 125 NOLOCKSHIFT))
				       (130 (194 194 NOLOCKSHIFT))
				       (131 (193 193 NOLOCKSHIFT))
				       (132 (49 33 NOLOCKSHIFT))
				       (134 (9 9 NOLOCKSHIFT))
				       (135 (102 70 LOCKSHIFT))
				       (137 (99 67 LOCKSHIFT))
				       (138 (106 74 LOCKSHIFT))
				       (139 (98 66 LOCKSHIFT))
				       (140 (122 90 LOCKSHIFT))
				       (141 1SHIFTDOWN . 1SHIFTUP)
				       (142 (46 62 NOLOCKSHIFT))
				       (143 (59 58 NOLOCKSHIFT))
				       (144 (13 13 NOLOCKSHIFT))
				       (146 (127 127 NOLOCKSHIFT))
				       (148 (114 82 LOCKSHIFT))
				       (149 (116 84 LOCKSHIFT))
				       (150 (103 71 LOCKSHIFT))
				       (151 (121 89 LOCKSHIFT))
				       (152 (104 72 LOCKSHIFT))
				       (153 (56 42 NOLOCKSHIFT))
				       (154 (110 78 LOCKSHIFT))
				       (155 (109 77 LOCKSHIFT))
				       (156 LOCKDOWN . LOCKUP)
				       (157 (32 32 NOLOCKSHIFT))
				       (158 (91 123 NOLOCKSHIFT))
				       (159 (61 43 NOLOCKSHIFT))
				       (160 2SHIFTDOWN . 2SHIFTUP)
				       (161 (195 195 NOLOCKSHIFT)))
				      ((w 118)
				       (W 118)
				       (5 100)
				       (%% 100)
				       (4 101)
				       ($ 101)
				       (6 102)
				       (~ 102)
				       (e 103)
				       (E 103)
				       (7 104)
				       (& 104)
				       (d 105)
				       (D 105)
				       (u 106)
				       (U 106)
				       (v 107)
				       (V 107)
				       (0 108)
				       (%) 108)
				       (k 109)
				       (K 109)
				       (- 110)
				       (110)
				       (p 111)
				       (P 111)
				       (/ 112)
				       (? 112)
				       (BS 115)
				       (<- 115)
				       (3 116)
				       (# 116)
				       (2 117)
				       (@ 117)
				       (q 119)
				       (Q 119)
				       (s 120)
				       (S 120)
				       (a 121)
				       (A 121)
				       (9 122)
				       (%( 122)
				       (i 123)
				       (I 123)
				       (x 124)
				       (X 124)
				       (o 125)
				       (O 125)
				       (l 126)
				       (L 126)
				       (, 127)
				       (< 127)
				       (' 128)
				       (%" 128)
				       (%] 129)
				       (} 129)
				       (1 132)
				       (! 132)
				       (ESC 133)
				       (ESCAPE 133)
				       (-> 133)
				       (TAB 134)
				       (=> 134)
				       (f 135)
				       (F 135)
				       (c 137)
				       (C 137)
				       (j 138)
				       (J 138)
				       (b 139)
				       (B 139)
				       (z 140)
				       (Z 140)
				       (LSHIFT 141)
				       (%. 142)
				       (> 142)
				       (; 143)
				       (: 143)
				       (CR 144)
				       (<-%| 144)
				       (← 145)
				       (↑ 145)
				       (r 148)
				       (R 148)
				       (t 149)
				       (T 149)
				       (g 150)
				       (G 150)
				       (y 151)
				       (Y 151)
				       (h 152)
				       (H 152)
				       (8 153)
				       (* 153)
				       (n 154)
				       (N 154)
				       (m 155)
				       (M 155)
				       (LOCK 156)
				       (SPACE 157)
				       (%[ 158)
				       ({ 158)
				       (= 159)
				       (+ 159)
				       (RSHIFT 160))
				      DORADO
				      ((136 CONTROL))
				      (HELVETICA 5)
				      23130
				      (CLASSIC 12)
				      ((1 BS)
				       (27 ESC)
				       (8 BS)
				       (9 TAB)
				       (10 LF)
				       (13 CR)
				       (32 SPACE)
				       (127 DEL)
				       (193 % )
				       (194 % )
				       (195 % ))
				      [LAMBDA (KEY)
					      (IDIFFERENCE KEY 100])
	(DANDELION (100 101 102 103 104 105 106 107 108 109 110 111 112 115 116 117 118 119 120 121 
			122 123 124 125 126 127 128 129 132 133 134 135 137 138 139 140 141 142 143 
			144 145 148 149 150 151 152 153 154 155 156 157 158 159 160)
		   ((157 (110 10 279 33))
		    (115 (434 154 53 33))
		    (134 (18 118 45 33))
		    (144 (450 118 37 33)
			 (458 82 29 36))
		    (133 (18 154 29 33))
		    (141 (18 46 69 33))
		    (160 (410 46 77 33))
		    (156 (18 82 53 33))
		    (132 (50 154 29 33))
		    (117 (82 154 29 33))
		    (116 (114 154 29 33))
		    (101 (146 154 29 33))
		    (100 (178 154 29 33))
		    (102 (210 154 29 33))
		    (104 (242 154 29 33))
		    (153 (274 154 29 33))
		    (122 (306 154 29 33))
		    (108 (338 154 29 33))
		    (110 (370 154 29 33))
		    (159 (402 154 29 33))
		    (119 (66 118 29 33))
		    (118 (98 118 29 33))
		    (103 (130 118 29 33))
		    (148 (162 118 29 33))
		    (149 (194 118 29 33))
		    (151 (226 118 29 33))
		    (106 (258 118 29 33))
		    (123 (290 118 29 33))
		    (125 (322 118 29 33))
		    (111 (354 118 29 33))
		    (158 (386 118 29 33))
		    (129 (418 118 29 33))
		    (121 (74 82 29 33))
		    (120 (106 82 29 33))
		    (105 (138 82 29 33))
		    (135 (170 82 29 33))
		    (150 (202 82 29 33))
		    (152 (234 82 29 33))
		    (138 (266 82 29 33))
		    (109 (298 82 29 33))
		    (126 (330 82 29 33))
		    (143 (362 82 29 33))
		    (128 (394 82 29 33))
		    (145 (426 82 29 33))
		    (140 (90 46 29 33))
		    (124 (122 46 29 33))
		    (137 (154 46 29 33))
		    (107 (186 46 29 33))
		    (139 (218 46 29 33))
		    (154 (250 46 29 33))
		    (155 (282 46 29 33))
		    (127 (314 46 29 33))
		    (142 (346 46 29 33))
		    (112 (378 46 29 33)))
		   (118 100 101 102 103 104 105 106 107 108 109 110 111 112 116 117 119 120 121 122 
			123 124 125 126 127 128 129 132 135 137 138 139 140 142 143 145 148 149 150 
			151 152 153 154 155 158 159)
		   ((118 (119 87 LOCKSHIFT))
		    (102 (54 94 NOLOCKSHIFT))
		    (110 (45 95 NOLOCKSHIFT))
		    (133 (92 124 NOLOCKSHIFT))
		    (145 (96 126 NOLOCKSHIFT))
		    (100 (53 37 NOLOCKSHIFT))
		    (101 (52 36 NOLOCKSHIFT))
		    (103 (101 69 LOCKSHIFT))
		    (104 (55 38 NOLOCKSHIFT))
		    (105 (100 68 LOCKSHIFT))
		    (106 (117 85 LOCKSHIFT))
		    (107 (118 86 LOCKSHIFT))
		    (108 (48 41 NOLOCKSHIFT))
		    (109 (107 75 LOCKSHIFT))
		    (111 (112 80 LOCKSHIFT))
		    (112 (47 63 NOLOCKSHIFT))
		    (115 (1 1 NOLOCKSHIFT))
		    (116 (51 35 NOLOCKSHIFT))
		    (117 (50 64 NOLOCKSHIFT))
		    (119 (113 81 LOCKSHIFT))
		    (120 (115 83 LOCKSHIFT))
		    (121 (97 65 LOCKSHIFT))
		    (122 (57 40 NOLOCKSHIFT))
		    (123 (105 73 LOCKSHIFT))
		    (124 (120 88 LOCKSHIFT))
		    (125 (111 79 LOCKSHIFT))
		    (126 (108 76 LOCKSHIFT))
		    (127 (44 60 NOLOCKSHIFT))
		    (128 (39 34 NOLOCKSHIFT))
		    (129 (93 125 NOLOCKSHIFT))
		    (132 (49 33 NOLOCKSHIFT))
		    (134 (9 9 NOLOCKSHIFT))
		    (135 (102 70 LOCKSHIFT))
		    (137 (99 67 LOCKSHIFT))
		    (138 (106 74 LOCKSHIFT))
		    (139 (98 66 LOCKSHIFT))
		    (140 (122 90 LOCKSHIFT))
		    (141 1SHIFTDOWN . 1SHIFTUP)
		    (142 (46 62 NOLOCKSHIFT))
		    (143 (59 58 NOLOCKSHIFT))
		    (144 (13 13 NOLOCKSHIFT))
		    (148 (114 82 LOCKSHIFT))
		    (149 (116 84 LOCKSHIFT))
		    (150 (103 71 LOCKSHIFT))
		    (151 (121 89 LOCKSHIFT))
		    (152 (104 72 LOCKSHIFT))
		    (153 (56 42 NOLOCKSHIFT))
		    (154 (110 78 LOCKSHIFT))
		    (155 (109 77 LOCKSHIFT))
		    (156 LOCKDOWN . LOCKUP)
		    (157 (32 32 NOLOCKSHIFT))
		    (158 (91 123 NOLOCKSHIFT))
		    (159 (61 43 NOLOCKSHIFT))
		    (160 2SHIFTDOWN . 2SHIFTUP))
		   ((w 118)
		    (W 118)
		    (5 100)
		    (%% 100)
		    (4 101)
		    ($ 101)
		    (6 102)
		    (~ 102)
		    (e 103)
		    (E 103)
		    (7 104)
		    (& 104)
		    (d 105)
		    (D 105)
		    (u 106)
		    (U 106)
		    (v 107)
		    (V 107)
		    (0 108)
		    (%) 108)
		    (k 109)
		    (K 109)
		    (- 110)
		    (110)
		    (p 111)
		    (P 111)
		    (/ 112)
		    (? 112)
		    (BS 115)
		    (<- 115)
		    (3 116)
		    (# 116)
		    (2 117)
		    (@ 117)
		    (q 119)
		    (Q 119)
		    (s 120)
		    (S 120)
		    (a 121)
		    (A 121)
		    (9 122)
		    (%( 122)
		    (i 123)
		    (I 123)
		    (x 124)
		    (X 124)
		    (o 125)
		    (O 125)
		    (l 126)
		    (L 126)
		    (, 127)
		    (< 127)
		    (' 128)
		    (%" 128)
		    (%] 129)
		    (} 129)
		    (1 132)
		    (! 132)
		    (ESC 133)
		    (ESCAPE 133)
		    (-> 133)
		    (TAB 134)
		    (=> 134)
		    (f 135)
		    (F 135)
		    (c 137)
		    (C 137)
		    (j 138)
		    (J 138)
		    (b 139)
		    (B 139)
		    (z 140)
		    (Z 140)
		    (LSHIFT 141)
		    (%. 142)
		    (> 142)
		    (; 143)
		    (: 143)
		    (CR 144)
		    (<-%| 144)
		    (← 145)
		    (↑ 145)
		    (r 148)
		    (R 148)
		    (t 149)
		    (T 149)
		    (g 150)
		    (G 150)
		    (y 151)
		    (Y 151)
		    (h 152)
		    (H 152)
		    (8 153)
		    (* 153)
		    (n 154)
		    (N 154)
		    (m 155)
		    (M 155)
		    (LOCK 156)
		    (SPACE 157)
		    (%[ 158)
		    ({ 158)
		    (= 159)
		    (+ 159)
		    (RSHIFT 160))
		   DANDELION NIL (HELVETICA 5)
		   23130
		   (CLASSIC 12)
		   ((1 BS)
		    (92 ESC)
		    (9 TAB)
		    (13 CR)
		    (32 SPACE))
		   [LAMBDA (KEY)
			   (IDIFFERENCE KEY 100])
	(DOVE (100 101 102 103 104 105 106 107 108 109 110 111 112 115 116 117 118 119 120 121 122 
		   123 124 125 126 127 128 129 131 132 134 135 137 138 139 140 141 142 143 144 145 
		   147 148 149 150 151 152 153 154 155 156 157 158 159 160 165 169 170 172 173 174 
		   175 176 181 182 183 184 185 187 193 194 198 205 206)
	      ((100 (178 138 29 29))
	       (101 (146 138 29 29))
	       (102 (210 138 29 29))
	       (103 (130 106 29 29))
	       (104 (242 138 29 29))
	       (105 (138 74 29 29))
	       (106 (258 106 29 29))
	       (107 (186 42 29 29))
	       (108 (338 138 29 29))
	       (109 (298 74 29 29))
	       (110 (370 138 29 29))
	       (111 (354 106 29 29))
	       (112 (378 42 29 29))
	       (115 (434 138 53 29))
	       (116 (114 138 29 29))
	       (117 (82 138 29 29))
	       (118 (98 106 29 29))
	       (119 (66 106 29 29))
	       (120 (106 74 29 29))
	       (121 (74 74 29 29))
	       (122 (306 138 29 29))
	       (123 (290 106 29 29))
	       (124 (122 42 29 29))
	       (125 (322 106 29 29))
	       (126 (330 74 29 29))
	       (127 (314 42 29 29))
	       (128 (394 74 29 29))
	       (129 (418 106 29 29))
	       (132 (50 138 29 29))
	       (134 (18 106 45 29))
	       (135 (170 74 29 29))
	       (137 (154 42 29 29))
	       (138 (266 74 29 29))
	       (139 (218 42 29 29))
	       (140 (90 42 29 29))
	       (141 (18 42 69 29))
	       (142 (346 42 29 29))
	       (143 (362 74 29 29))
	       (144 (450 106 37 29)
		    (458 74 29 32))
	       (145 (426 74 29 29))
	       (148 (162 106 29 29))
	       (149 (194 106 29 29))
	       (150 (202 74 29 29))
	       (151 (226 106 29 29))
	       (152 (234 74 29 29))
	       (153 (274 138 29 29))
	       (154 (250 42 29 29))
	       (155 (282 42 29 29))
	       (156 (18 74 53 29))
	       (157 (110 10 279 29))
	       (158 (386 106 29 29))
	       (159 (402 138 29 29))
	       (160 (410 42 77 29))
	       (165 (18 138 29 29))
	       (172 (520 138 29 29))
	       (173 (552 138 29 29))
	       (174 (584 138 29 29))
	       (175 (616 138 29 29))
	       (176 (520 106 29 29))
	       (181 (552 106 29 29))
	       (182 (584 106 29 29))
	       (183 (616 106 29 29))
	       (147 (520 42 29 61))
	       (184 (552 74 29 29))
	       (185 (584 74 29 29))
	       (187 (616 74 29 29))
	       (194 (552 42 29 29))
	       (169 (584 42 29 29))
	       (170 (616 42 29 29))
	       (198 (520 10 61 29))
	       (205 (584 10 29 29))
	       (206 (616 10 29 29))
	       (131 (18 10 45 29))
	       (193 (434 10 53 29)))
	      (100 101 102 103 104 105 106 107 108 109 110 111 112 116 117 118 119 120 121 122 123 
		   124 125 126 127 128 129 132 135 137 138 139 140 142 143 145 148 149 150 151 152 
		   153 154 155 158 159)
	      ((115 (8 8 NOLOCKSHIFT))
	       (165 (27 27 NOLOCKSHIFT))
	       (102 (54 94 NOLOCKSHIFT))
	       (110 (45 95 NOLOCKSHIFT))
	       (145 (96 126 NOLOCKSHIFT))
	       (100 (53 37 NOLOCKSHIFT))
	       (101 (52 36 NOLOCKSHIFT))
	       (103 (101 69 LOCKSHIFT))
	       (104 (55 38 NOLOCKSHIFT))
	       (105 (100 68 LOCKSHIFT))
	       (106 (117 85 LOCKSHIFT))
	       (107 (118 86 LOCKSHIFT))
	       (108 (48 41 NOLOCKSHIFT))
	       (109 (107 75 LOCKSHIFT))
	       (111 (112 80 LOCKSHIFT))
	       (112 (47 63 NOLOCKSHIFT))
	       (116 (51 35 NOLOCKSHIFT))
	       (117 (50 64 NOLOCKSHIFT))
	       (118 (119 87 LOCKSHIFT))
	       (119 (113 81 LOCKSHIFT))
	       (120 (115 83 LOCKSHIFT))
	       (121 (97 65 LOCKSHIFT))
	       (122 (57 40 NOLOCKSHIFT))
	       (123 (105 73 LOCKSHIFT))
	       (124 (120 88 LOCKSHIFT))
	       (125 (111 79 LOCKSHIFT))
	       (126 (108 76 LOCKSHIFT))
	       (127 (44 60 NOLOCKSHIFT))
	       (128 (39 34 NOLOCKSHIFT))
	       (129 (93 125 NOLOCKSHIFT))
	       (132 (49 33 NOLOCKSHIFT))
	       (134 (9 9 NOLOCKSHIFT))
	       (135 (102 70 LOCKSHIFT))
	       (137 (99 67 LOCKSHIFT))
	       (138 (106 74 LOCKSHIFT))
	       (139 (98 66 LOCKSHIFT))
	       (140 (122 90 LOCKSHIFT))
	       (141 1SHIFTDOWN . 1SHIFTUP)
	       (142 (46 62 NOLOCKSHIFT))
	       (143 (59 58 NOLOCKSHIFT))
	       (144 (13 13 NOLOCKSHIFT))
	       (148 (114 82 LOCKSHIFT))
	       (149 (116 84 LOCKSHIFT))
	       (150 (103 71 LOCKSHIFT))
	       (151 (121 89 LOCKSHIFT))
	       (152 (104 72 LOCKSHIFT))
	       (153 (56 42 NOLOCKSHIFT))
	       (154 (110 78 LOCKSHIFT))
	       (155 (109 77 LOCKSHIFT))
	       (156 LOCKDOWN . LOCKUP)
	       (157 (32 32 NOLOCKSHIFT))
	       (158 (91 123 NOLOCKSHIFT))
	       (159 (61 43 NOLOCKSHIFT))
	       (160 2SHIFTDOWN . 2SHIFTUP)
	       (172 (517 549 NOLOCKSHIFT))
	       (173 (521 45 NOLOCKSHIFT))
	       (174 (522 180 NOLOCKSHIFT))
	       (175 (2 184 NOLOCKSHIFT))
	       (176 (523 555 NOLOCKSHIFT))
	       (181 (524 55 NOLOCKSHIFT))
	       (182 (173 56 NOLOCKSHIFT))
	       (183 (525 57 NOLOCKSHIFT))
	       (147 (530 562 NOLOCKSHIFT))
	       (184 (172 52 NOLOCKSHIFT))
	       (185 (526 53 NOLOCKSHIFT))
	       (187 (174 54 NOLOCKSHIFT))
	       (194 (527 49 NOLOCKSHIFT))
	       (169 (175 50 NOLOCKSHIFT))
	       (170 (528 51 NOLOCKSHIFT))
	       (198 (529 48 NOLOCKSHIFT))
	       (205 (124 46 NOLOCKSHIFT))
	       (206 (92 44 NOLOCKSHIFT))
	       (131 METADOWN . METAUP)
	       (193 (532 564 NOLOCKSHIFT)))
	      ((INS 198)
	       (5 100)
	       (%% 100)
	       (4 101)
	       ($ 101)
	       (6 102)
	       (~ 102)
	       (e 103)
	       (E 103)
	       (7 104)
	       (& 104)
	       (d 105)
	       (D 105)
	       (u 106)
	       (U 106)
	       (v 107)
	       (V 107)
	       (0 108)
	       (%) 108)
	       (k 109)
	       (K 109)
	       (- 110)
	       (110)
	       (p 111)
	       (P 111)
	       (/ 112)
	       (? 112)
	       (BS 115)
	       (<- 115)
	       (3 116)
	       (# 116)
	       (2 117)
	       (@ 117)
	       (w 118)
	       (W 118)
	       (q 119)
	       (Q 119)
	       (s 120)
	       (S 120)
	       (a 121)
	       (A 121)
	       (9 122)
	       (%( 122)
	       (i 123)
	       (I 123)
	       (x 124)
	       (X 124)
	       (o 125)
	       (O 125)
	       (l 126)
	       (L 126)
	       (, 127)
	       (< 127)
	       (' 128)
	       (%" 128)
	       (%] 129)
	       (} 129)
	       (1 132)
	       (! 132)
	       (ESC 165)
	       (ESCAPE 165)
	       (-> 165)
	       (TAB 134)
	       (=> 134)
	       (f 135)
	       (F 135)
	       (c 137)
	       (C 137)
	       (j 138)
	       (J 138)
	       (b 139)
	       (B 139)
	       (z 140)
	       (Z 140)
	       (LSHIFT 141)
	       (%. 142)
	       (> 142)
	       (; 143)
	       (: 143)
	       (CR 144)
	       (<-%| 144)
	       (← 145)
	       (↑ 145)
	       (r 148)
	       (R 148)
	       (t 149)
	       (T 149)
	       (g 150)
	       (G 150)
	       (y 151)
	       (Y 151)
	       (h 152)
	       (H 152)
	       (8 153)
	       (* 153)
	       (n 154)
	       (N 154)
	       (m 155)
	       (M 155)
	       (LOCK 156)
	       (SPACE 157)
	       (%[ 158)
	       ({ 158)
	       (= 159)
	       (+ 159)
	       (RSHIFT 160)
	       (NUMERIC+ 172)
	       (NUMERIC- 173)
	       (NUMERIC* 174)
	       (NUMERIC/ 175)
	       (CLEAR 176)
	       (NUMERIC7 181)
	       (NUMERIC8 182)
	       (NUMERIC9 183)
	       (NUMERIC4 147)
	       (NUMERIC5 184)
	       (NUMERIC6 185)
	       (SKIP 147)
	       (NEXT 147)
	       (NUMERIC1 194)
	       (NUMERIC2 169)
	       (NUMERIC3 170)
	       (NUMERIC0 198)
	       (NUMERIC. 205)
	       (NUMERIC, 206)
	       (KEYBOARD 131)
	       (DEFINE 193)
	       (EXPAND 193))
	      DOVE
	      ((147 NEXT)
	       (165 ESC)
	       (176 "CLEAR")
	       (131 META)
	       (193 "EXPAND")
	       (172 HELP))
	      (HELVETICA 5)
	      23130
	      (CLASSIC 12)
	      ((1 BS)
	       (2 BREAK)
	       (8 BS)
	       (27 ESC)
	       (9 TAB)
	       (13 CR)
	       (32 SPACE)
	       (517 HELP)
	       (521 SCRL)
	       (522 NUMLK)
	       (523 CLEAR)
	       (555 DOIT)
	       (524 HOME)
	       (525 PGUP)
	       (526 % )
	       (527 END)
	       (528 PGDN)
	       (529 INS))
	      [LAMBDA (KEY)
		      (IDIFFERENCE KEY 100])
	(FULL-IBMPC (100 101 102 103 104 105 106 107 108 109 110 111 112 115 116 117 118 119 120 121 
			 122 123 124 125 126 127 128 129 132 133 134 135 137 138 139 140 141 142 143 
			 144 148 149 150 151 152 153 154 155 156 157 158 159 160 200 201 202 203 204 
			 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 301 302 303 304 
			 305 306 307 308 309 310 311)
		    ((157 (180 10 279 29))
		     (115 (536 138 29 29))
		     (134 (88 106 45 29))
		     (144 (520 103 45 32)
			  (496 74 69 29))
		     (133 (88 138 29 29))
		     (141 (88 42 69 29))
		     (160 (480 42 85 29))
		     (156 (88 74 53 29))
		     (132 (120 138 29 29))
		     (117 (152 138 29 29))
		     (116 (184 138 29 29))
		     (101 (216 138 29 29))
		     (100 (248 138 29 29))
		     (102 (280 138 29 29))
		     (104 (312 138 29 29))
		     (153 (344 138 29 29))
		     (122 (376 138 29 29))
		     (108 (408 138 29 29))
		     (110 (440 138 29 29))
		     (159 (472 138 29 29))
		     (119 (136 106 29 29))
		     (118 (168 106 29 29))
		     (103 (200 106 29 29))
		     (148 (232 106 29 29))
		     (149 (264 106 29 29))
		     (151 (296 106 29 29))
		     (106 (328 106 29 29))
		     (123 (360 106 29 29))
		     (125 (392 106 29 29))
		     (111 (424 106 29 29))
		     (158 (456 106 29 29))
		     (129 (488 106 29 29))
		     (121 (144 74 29 29))
		     (120 (176 74 29 29))
		     (105 (208 74 29 29))
		     (135 (240 74 29 29))
		     (150 (272 74 29 29))
		     (152 (304 74 29 29))
		     (138 (336 74 29 29))
		     (109 (368 74 29 29))
		     (126 (400 74 29 29))
		     (143 (432 74 29 29))
		     (128 (464 74 29 29))
		     (140 (160 42 29 29))
		     (124 (192 42 29 29))
		     (137 (224 42 29 29))
		     (107 (256 42 29 29))
		     (139 (288 42 29 29))
		     (154 (320 42 29 29))
		     (155 (352 42 29 29))
		     (127 (384 42 29 29))
		     (142 (416 42 29 29))
		     (112 (448 42 29 29))
		     (218 (88 10 45 29))
		     (219 (512 10 53 29))
		     (200 (582 138 29 29))
		     (201 (614 138 29 29))
		     (202 (646 138 29 29))
		     (203 (678 138 29 29))
		     (204 (582 106 29 29))
		     (205 (614 106 29 29))
		     (206 (646 106 29 29))
		     (207 (678 106 29 29))
		     (208 (582 74 29 29))
		     (209 (614 74 29 29))
		     (210 (646 74 29 29))
		     (211 (678 74 29 29))
		     (212 (582 42 29 29))
		     (213 (614 42 29 29))
		     (214 (646 42 29 29))
		     (215 (678 10 29 61))
		     (216 (582 10 61 29))
		     (217 (646 10 29 29))
		     (311 (504 138 29 29))
		     (301 (10 138 29 29))
		     (302 (42 138 29 29))
		     (303 (10 106 29 29))
		     (304 (42 106 29 29))
		     (305 (10 74 29 29))
		     (306 (42 74 29 29))
		     (307 (10 42 29 29))
		     (308 (42 42 29 29))
		     (309 (10 10 29 29))
		     (310 (42 10 29 29)))
		    (201 200 100 101 102 103 104 105 106 107 108 109 110 111 112 116 117 118 119 120 
			 121 122 123 124 125 126 127 128 129 132 135 137 138 139 140 142 143 145 148 
			 149 150 151 152 153 154 155 158 159)
		    ((311 (92 124 NOLOCKSHIFT))
		     (156 CTRLDOWN . CTRLUP)
		     (102 (54 94 NOLOCKSHIFT))
		     (110 (45 95 NOLOCKSHIFT))
		     (133 (96 196 NOLOCKSHIFT))
		     (145 (96 126 NOLOCKSHIFT))
		     (100 (53 37 NOLOCKSHIFT))
		     (101 (52 36 NOLOCKSHIFT))
		     (103 (101 69 LOCKSHIFT))
		     (104 (55 38 NOLOCKSHIFT))
		     (105 (100 68 LOCKSHIFT))
		     (106 (117 85 LOCKSHIFT))
		     (107 (118 86 LOCKSHIFT))
		     (108 (48 41 NOLOCKSHIFT))
		     (109 (107 75 LOCKSHIFT))
		     (111 (112 80 LOCKSHIFT))
		     (112 (47 63 NOLOCKSHIFT))
		     (115 (1 1 NOLOCKSHIFT))
		     (116 (51 35 NOLOCKSHIFT))
		     (117 (50 64 NOLOCKSHIFT))
		     (118 (119 87 LOCKSHIFT))
		     (119 (113 81 LOCKSHIFT))
		     (120 (115 83 LOCKSHIFT))
		     (121 (97 65 LOCKSHIFT))
		     (122 (57 40 NOLOCKSHIFT))
		     (123 (105 73 LOCKSHIFT))
		     (124 (120 88 LOCKSHIFT))
		     (125 (111 79 LOCKSHIFT))
		     (126 (108 76 LOCKSHIFT))
		     (127 (44 60 NOLOCKSHIFT))
		     (128 (39 34 NOLOCKSHIFT))
		     (129 (93 125 NOLOCKSHIFT))
		     (132 (49 33 NOLOCKSHIFT))
		     (134 (9 9 NOLOCKSHIFT))
		     (135 (102 70 LOCKSHIFT))
		     (137 (99 67 LOCKSHIFT))
		     (138 (106 74 LOCKSHIFT))
		     (139 (98 66 LOCKSHIFT))
		     (140 (122 90 LOCKSHIFT))
		     (141 1SHIFTDOWN . 1SHIFTUP)
		     (142 (46 62 NOLOCKSHIFT))
		     (143 (59 58 NOLOCKSHIFT))
		     (144 (13 13 NOLOCKSHIFT))
		     (148 (114 82 LOCKSHIFT))
		     (149 (116 84 LOCKSHIFT))
		     (150 (103 71 LOCKSHIFT))
		     (151 (121 89 LOCKSHIFT))
		     (152 (104 72 LOCKSHIFT))
		     (153 (56 42 NOLOCKSHIFT))
		     (154 (110 78 LOCKSHIFT))
		     (155 (109 77 LOCKSHIFT))
		     (157 (32 32 NOLOCKSHIFT))
		     (158 (91 123 NOLOCKSHIFT))
		     (159 (61 43 NOLOCKSHIFT))
		     (160 2SHIFTDOWN . 2SHIFTUP)
		     (200 EVENT . EVENT)
		     (201 EVENT . EVENT)
		     (202 EVENT . EVENT)
		     (203 EVENT . EVENT)
		     (204 (55 55 NOLOCKSHIFT))
		     (205 (56 56 NOLOCKSHIFT))
		     (206 (57 57 NOLOCKSHIFT))
		     (207 (42 42 NOLOCKSHIFT))
		     (208 (52 52 NOLOCKSHIFT))
		     (209 (53 53 NOLOCKSHIFT))
		     (210 (54 54 NOLOCKSHIFT))
		     (211 (45 45 NOLOCKSHIFT))
		     (212 (49 49 NOLOCKSHIFT))
		     (213 (50 50 NOLOCKSHIFT))
		     (214 (51 51 NOLOCKSHIFT))
		     (215 (43 43 NOLOCKSHIFT))
		     (216 (48 48 NOLOCKSHIFT))
		     (217 (46 46 NOLOCKSHIFT))
		     (218 METADOWN . METAUP)
		     (219 LOCKDOWN . LOCKUP))
		    ((SCRLLOCK 202)
		     (NUMLOCK 201)
		     (NUMERICESC 200)
		     (NUMERIC1 204)
		     (5 100)
		     (%% 100)
		     (4 101)
		     ($ 101)
		     (6 102)
		     (~ 102)
		     (e 103)
		     (E 103)
		     (7 104)
		     (& 104)
		     (d 105)
		     (D 105)
		     (u 106)
		     (U 106)
		     (v 107)
		     (V 107)
		     (0 108)
		     (%) 108)
		     (k 109)
		     (K 109)
		     (- 110)
		     (110)
		     (p 111)
		     (P 111)
		     (/ 112)
		     (? 112)
		     (BS 115)
		     (<- 115)
		     (3 116)
		     (# 116)
		     (2 117)
		     (@ 117)
		     (w 118)
		     (W 118)
		     (q 119)
		     (Q 119)
		     (s 120)
		     (S 120)
		     (a 121)
		     (A 121)
		     (9 122)
		     (%( 122)
		     (i 123)
		     (I 123)
		     (x 124)
		     (X 124)
		     (o 125)
		     (O 125)
		     (l 126)
		     (L 126)
		     (, 127)
		     (< 127)
		     (' 128)
		     (%" 128)
		     (%] 129)
		     (} 129)
		     (1 132)
		     (! 132)
		     (ESC 133)
		     (ESCAPE 133)
		     (-> 133)
		     (TAB 134)
		     (=> 134)
		     (f 135)
		     (F 135)
		     (c 137)
		     (C 137)
		     (j 138)
		     (J 138)
		     (b 139)
		     (B 139)
		     (z 140)
		     (Z 140)
		     (LSHIFT 141)
		     (%. 142)
		     (> 142)
		     (; 143)
		     (: 143)
		     (CR 144)
		     (<-%| 144)
		     (← 145)
		     (↑ 145)
		     (r 148)
		     (R 148)
		     (t 149)
		     (T 149)
		     (g 150)
		     (G 150)
		     (y 151)
		     (Y 151)
		     (h 152)
		     (H 152)
		     (8 153)
		     (* 153)
		     (n 154)
		     (N 154)
		     (m 155)
		     (M 155)
		     (LOCK 156)
		     (SPACE 157)
		     (%[ 158)
		     ({ 158)
		     (= 159)
		     (+ 159)
		     (RSHIFT 160)
		     (NUMERIC/ 203)
		     (NUMERIC7 205)
		     (NUMERIC8 206)
		     (NUMERIC9 207)
		     (NUMERIC4 208)
		     (NUMERIC5 209)
		     (NUMERIC6 210)
		     (SKIP 211)
		     (NEXT 211)
		     (NUMERIC1 212)
		     (NUMERIC2 213)
		     (NUMERIC3 214)
		     (NUMERIC0 215)
		     (NUMERIC. 216)
		     (NUMERIC, 217)
		     (KEYBOARD 218)
		     (DEFINE 219)
		     (EXPAND 219))
		    IBMPC
		    ((200 ESC)
		     (203 (SYS REQ))
		     (202 ("SCRL" "LOCK"))
		     (201 ("NUM" "LOCK"))
		     (218 "ALT")
		     (301 "F1")
		     (302 "F2")
		     (303 "F3")
		     (304 "F4")
		     (305 "F5")
		     (306 "F6")
		     (307 "F7")
		     (308 "F8")
		     (309 "F9")
		     (310 "F10"))
		    (HELVETICA 5)
		    23130
		    (CLASSIC 12)
		    ((1 BS)
		     (92 ESC)
		     (9 TAB)
		     (13 CR)
		     (32 SPACE))
		    (LAMBDA (KEY)
			    (IDIFFERENCE KEY 100])

(RPAQ VKBD.ICON (READBITMAP))
(93 50
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"LGOOOOOOOOOOOOOOOOOOOOAH"
"LGOOOOOOOOOOOOOOOOOOOOAH"
"LG@HDBA@HDBA@HDBA@HD@GAH"
"LG@HDBA@HDBA@HDBA@HD@GAH"
"LG@HDBA@HDBA@HDBA@HDNGAH"
"LG@HDBA@HDBA@HDBA@HD@GAH"
"LGOOOOOOOOOOOOOOOOOOOOAH"
"LG@BA@HDBA@HDBA@HDBA@GAH"
"LGGBA@HDBA@HDBA@HDBA@GAH"
"LGGBA@HDBA@HDBA@HDBAFGAH"
"LG@BA@HDBA@HDBA@HDBA@GAH"
"LGOOOOOOOOOOOOOOOOOOHGAH"
"LG@AHDBA@HDBA@HDBA@HIGAH"
"LG@AHDBA@HDBA@HDBA@HIGAH"
"LG@AHDBA@HDBA@HDBA@HIGAH"
"LG@AHDBA@HDBA@HDBA@HHGAH"
"LGOOOOOOOOOOOOOOOOOOOOAH"
"LG@@@HDBA@HDBA@HDBA@@GAH"
"LG@@@HDBA@HDBA@HDBA@@GAH"
"LG@@@HDBA@HDBA@HDBA@@GAH"
"LG@@@HDBA@HDBA@HDBA@@GAH"
"LGOOOOOOOOOOOOOOOOOOOOAH"
"LGOOOOOOOOOOOOOOOOOOOOAH"
"LGOOOOOOOOOOOOOOOOOOOOAH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"L@@@@@@@@@@@@@@@@@@@@@AH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH")

(RPAQ VKBD.MASK (READBITMAP))
(93 50
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH"
"OOOOOOOOOOOOOOOOOOOOOOOH")
(DECLARE: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS VKBD.BACKGROUND-MENU-SUBITEMS VKBD.DEFAULT-CONFIGURATION-NAME VKBD.KNOWN-KEYBOARDS 
	    VKBD.NON-CHAR-ASSIGNMENTS-LABELS VKBD.ICON VKBD.MASK VKBD.CONFIGURATIONS)
)
(VKBD.LOAD-KEYBOARD-FILE (PACK* (MACHINETYPE)
				(QUOTE KEYBOARDS)))
(VKBD.INIT)
(FILESLOAD ICONW)
(PUTPROPS VIRTUALKEYBOARDS COPYRIGHT ("Xerox Corporation" 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (2650 4543 (DEFINEKEYBOARD 2660 . 4541)) (4544 6479 (VKBD.ADD-ITEM-TO-BACKGROUND-MENU 
4554 . 4928) (VKBD.INIT 4930 . 5296) (VKBD.CREATE-DEFAULT-KEYBOARD 5298 . 5775) (
VKBD.ADD-DEFAULT-KEYBOARD 5777 . 6477)) (6480 9044 (VKBD.LOAD-FILE-COMMAND 6490 . 6832) (
VKBD.LOAD-KEYBOARD-FILE 6834 . 8114) (VKBD.STORE-FILE-COMMAND 8116 . 8453) (VKBD.STORE-KEYBOARD-FILE 
8455 . 9042)) (9045 51506 (SWITCHKEYBOARDS 9055 . 11128) (VKBD.ASSIGNABLE-KEYP 11130 . 11565) (
VKBD.BUTTONEVENTFN 11567 . 14200) (VKBD.CENTER-BITMAP-IN-REGION 14202 . 15395) (VKBD.CHAR-ASSIGNMENTP 
15397 . 15584) (VKBD.CLEAR-KEY-DISPLAY 15586 . 17415) (VKBD.COMPLETE-KEYBOARD 17417 . 19101) (
VKBD.CTRL-ASSIGNMENTP 19103 . 19348) (VKBD.EVENT-ASSIGNMENTP 19350 . 19592) (VKBD.META-ASSIGNMENTP 
19594 . 19839) (VKBD.CREATE-KEYBOARD-BITMAP 19841 . 21301) (VKBD.CREATE-KEYBOARD-DISPLAY 21303 . 23082
) (VKBD.CURSORMOVEDFN 23084 . 24619) (VKBD.DISPLAY-CHARACTER 24621 . 25503) (
VKBD.DISPLAY-EMPTY-KEY-CAP 25505 . 30117) (VKBD.DISPLAY-KEY 30119 . 31521) (
VKBD.DISPLAY-KEY-CHARACTERS 31523 . 32643) (VKBD.DRAW-KEY-CAPS 32645 . 33436) (VKBD.ERASE-FRAME 33438
 . 33698) (VKBD.EXTEND-REGION 33700 . 34222) (VKBD.FETCH-KEY-ASSIGNMENT 34224 . 34465) (VKBD.FRAME-KEY
 34467 . 35356) (VKBD.GET-CONFIGURATION 35358 . 35889) (VKBD.GET-CURRENT-KEY-ASSIGNMENT 35891 . 36104)
 (VKBD.GET-KEY-AND-REGIONS-OF-CURSOR-POSITION 36106 . 36480) (VKBD.GET-KEY-REGIONS 36482 . 36748) (
VKBD.GET-NON-CHAR-LABEL 36750 . 37356) (VKBD.ICONFN 37358 . 37842) (VKBD.INVERT-LOCK-KEYS 37844 . 
38260) (VKBD.INVERT-SHIFT-KEYS 38262 . 38674) (VKBD.TRANSLATE-KEY-ID 38676 . 39422) (VKBD.INVERT-KEY 
39424 . 39674) (VKBD.INVERT-REGION 39676 . 40187) (VKBD.KEY-ID-TO-KEY-NAMES 40189 . 40608) (
VKBD.KEY-NAME-TO-KEY-ID 40610 . 40886) (VKBD.KEYBOARD-IS-MACHINE-KEYBOARD 40888 . 41344) (
VKBD.KEYBOARD-WINDOW-REPAINTFN 41346 . 42326) (VKBD.LOCK-ASSIGNMENTP 42328 . 42573) (VKBD.LOCK-KEYP 
42575 . 42839) (VKBD.LOCK/NOLOCK 42841 . 42990) (VKBD.LOCKDOWN-ASSIGNMENTP 42992 . 43285) (
VKBD.LOCKUP-ASSIGNMENTP 43287 . 43576) (VKBD.LOWER-HALF-REGION 43578 . 43921) (VKBD.PARSE-CHAR-CODE 
43923 . 44422) (VKBD.PARSE-KEY-ASSIGNMENT 44424 . 46090) (VKBD.PERFORM-KEY-ASSIGNMENT 46092 . 46351) (
VKBD.POP-MENU-AND-SWITCH-KEYBOARDS 46353 . 46701) (VKBD.POP-UP-KEYBOARDS-MENU 46703 . 47173) (
VKBD.POSITION-IS-IN-KEY-REGION 47175 . 47350) (VKBD.REMOVE-KEYBOARD-COMMAND 47352 . 47753) (
VKBD.RESET-KEYBOARD-WINDOW 47755 . 48398) (VKBD.SEND-CHARACTER 48400 . 49625) (VKBD.SHIFT-ASSIGNMENTP 
49627 . 50012) (VKBD.SHIFTED-CHAR 50014 . 50159) (VKBD.UNDEFINE-KEYBOARD 50161 . 50541) (
VKBD.UNION-REGIONS 50543 . 50926) (VKBD.UNSHIFTED-CHAR 50928 . 51074) (VKBD.UPER-HALF-REGION 51076 . 
51504)))))
STOP