DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦a19c7608f⟧ Ada Source

    Length: 107520 (0x1a400)
    Types: Ada Source
    Notes: 03_class, FILE, Long Ada Source, R1k_Segment, e3_tag, package body Xlbp_Key, seg_004f73

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Text_Io;

with Xlbt_Arithmetic;  
use Xlbt_Arithmetic;  
with Xlbt_Basic;  
use Xlbt_Basic;  
with Xlbt_Event2;  
use Xlbt_Event2;  
with Xlbt_Key;  
use Xlbt_Key;  
with Xlbt_Key2;  
use Xlbt_Key2;  
with Xlbt_Key_Defs;  
use Xlbt_Key_Defs;  
with Xlbt_String;  
use Xlbt_String;

with Xlbp_Keyboard_Encoding;  
use Xlbp_Keyboard_Encoding;

with Xlbit_Library2;  
use Xlbit_Library2;  
with Xlbit_Library4;  
use Xlbit_Library4;

with Xlbip_Internal;  
use Xlbip_Internal;

with Xlbmt_Network_Types;  
use Xlbmt_Network_Types;  
with Xlbmt_Parameters;  
use Xlbmt_Parameters;

with Xlbmp_Error_Log;  
use Xlbmp_Error_Log;

package body Xlbp_Key is
------------------------------------------------------------------------------
-- X Library Keys
--
-- Xlbp_Key - Used to translate key codes to/from key symbols and strings.
------------------------------------------------------------------------------
-- Copyright 1989 - 1991 by Rational, Santa Clara, California.
-- Copyright 1987 - 1989 by Digital Equipment Corporation, Maynard, Mass.
-- Copyright 1987 - 1989 by Massachusetts Institute of Technology,
--                          Cambridge, Massachusetts.
--
--                  All Rights Reserved.
--
-- Permission to use, copy, modify, and distribute this software and its
-- documentation for any purpose and without fee is hereby granted,
-- provided that the above copyright notice(s) appear in all copies and that
-- both that copyright notice(s) and this permission notice appear in
-- supporting documentation, and that the names of Digital, MIT, or Rational
-- not be used in advertising or publicity pertaining to distribution of
-- the software without specific, written prior permission.
--
-- Digital, MIT, and Rational disclaim all warranties with regard to this
-- software, including all implied warranties of merchantability and fitness,
-- in no event shall Digital, MIT, or Rational be liable for any special,
-- indirect or consequential damages or any damages whatsoever resulting from
-- loss of use, data or profits, whether in an action of contract, negligence
-- or other tortious action, arising out of or in connection with the use or
-- performance of this software.
------------------------------------------------------------------------------
-- ****************************************************************************
-- * Date      - /Name/ Comment
-- *
-- *  7-NOV-90 - /GEB/ Implement the new multitasking protection scheme for
-- *           -  library state.
-- ****************************************************************************

    All_Mods : constant X_Key_Button_Mask :=  
       X_Key_Button_Mask'  
          (Shift_Mask | Lock_Mask | Control_Mask | Mod_1_Mask |  
           Mod_2_Mask | Mod_3_Mask | Mod_4_Mask | Mod_5_Mask => True,  
           others => False);

    type X_Mod_Mask_Array is array (X_Key_Modifier) of X_Key_Button_Mask;

    Mod_Mask : constant X_Mod_Mask_Array :=  
       (Shift_Map_Index   =>  
           X_Key_Button_Mask'(Shift_Mask => True, others => False),  
        Lock_Map_Index    =>  
           X_Key_Button_Mask'(Lock_Mask => True, others => False),  
        Control_Map_Index =>  
           X_Key_Button_Mask'(Control_Mask => True, others => False),  
        Mod_1_Map_Index   =>  
           X_Key_Button_Mask'(Mod_1_Mask => True, others => False),  
        Mod_2_Map_Index   =>  
           X_Key_Button_Mask'(Mod_2_Mask => True, others => False),  
        Mod_3_Map_Index   =>  
           X_Key_Button_Mask'(Mod_3_Mask => True, others => False),  
        Mod_4_Map_Index   =>  
           X_Key_Button_Mask'(Mod_4_Mask => True, others => False),  
        Mod_5_Map_Index   =>  
           X_Key_Button_Mask'(Mod_5_Mask => True, others => False));

    function  Initialize (Display : X_Display) return Boolean;  
    procedure Initialize_Ks_Info_Map;

--\x0c
    function Find_Key_Code (Display : X_Display;  
                            Code    : X_Key_Sym) return X_Key_Code is
------------------------------------------------------------------------------
-- given a Key_Sym, returns the first key_code found after the index value
-- in the table.  (Hopefully, can be found quickly).
------------------------------------------------------------------------------
    begin

        for I in Display.Key_Syms'Range (1) loop  
            for J in Display.Key_Syms'Range (2) loop  
                if Display.Key_Syms (I, J) = Code then
--/ if not TeleGen2_2d_Bug then
                    return I;
--/ else
--//                     return X_Key_Code (I);
--/ end if;
                end if;  
            end loop;  
        end loop;  
        return 0;

    end Find_Key_Code;

--\x0c
    procedure Compute_Mask_From_Key_Trans (Display : X_Display;  
                                           P       : X_Key_Trans) is
------------------------------------------------------------------------------
-- given a list of modifiers, computes the mask necessary for later matching.
-- This routine must lookup the key in the Keymap and then search to see
-- what modifier it is bound to, if any.
------------------------------------------------------------------------------
        Code : X_Key_Code;  
        M    : X_Modifier_Keymap := Display.Modifier_Map;  
    begin

        P.State := X_Key_Button_Mask'(Any_Modifier => True, others => False);  
        for I in P.Modifiers'Range loop
            -- if not found, then not on current keyboard
            Code := Find_Key_Code (Display, P.Modifiers (I));  
            if Code = 0 then  
                return;  
            end if;
            -- code is now the keycode for the modifier you want
            for J in M.Modifiermap'Range loop  
                for K in M.Modifiermap (J)'Range loop  
                    if M.Modifiermap (J) (K) = Code then  
                        P.State := P.State or Mod_Mask (K);  
                        exit;  
                    end if;  
                end loop;  
            end loop;  
        end loop;  
        P.State (Any_Modifier) := False;

    end Compute_Mask_From_Key_Trans;

--\x0c
    procedure X_Convert_Case (Display :     X_Display;  
                              Sym     :     X_Key_Sym;  
                              Lower   : out X_Key_Sym;  
                              Upper   : out X_Key_Sym) is
------------------------------------------------------------------------------
--  Display - Specifies the display to use
--  Sym     - Specifies the symbol to upper/lower casify
--  Lower   - Receives the lower case version
--  Upper   - Receives the upper case version
--
-- Called with a symbol in order to obtain the upper and lower case versions
-- of the symbol if there are such things.  ie. 'A' and 'a' both have uc/lc
-- versions but '%' doesn't.
------------------------------------------------------------------------------
        use Latin1;  
    begin

        Lower := Sym;  
        Upper := Sym;  
        if Sym > 16#FF# then  
            return;  
        end if;  
        if Sym >= Xk_S_A and then Sym <= Xk_S_Z then  
            Lower := Sym + (Xk_A - Xk_S_A);  
        elsif Sym >= Xk_A and then Sym <= Xk_Z then  
            Upper := Sym - (Xk_A - Xk_S_A);  
        elsif Sym >= Xk_S_Agrave and then Sym <= Xk_S_Odiaeresis then  
            Lower := Sym + (Xk_Agrave - Xk_S_Agrave);  
        elsif Sym >= Xk_Agrave and then Sym <= Xk_Odiaeresis then  
            Upper := Sym - (Xk_Agrave - Xk_S_Agrave);  
        elsif Sym >= Xk_Ooblique and then Sym <= Xk_S_Thorn then  
            Lower := Sym + (Xk_Oslash - Xk_Ooblique);  
        elsif Sym >= Xk_Oslash and then Sym <= Xk_Thorn then  
            Upper := Sym - (Xk_Oslash - Xk_Ooblique);  
        end if;

    end X_Convert_Case;

--\x0c
    function Key_Code_To_Key_Sym (Display  : X_Display;  
                                  Key_Code : X_Key_Code;  
                                  Col      : U_Char) return X_Key_Sym is  
        Col_Odd  : U_Char;  
        Col_Even : U_Char;  
        Per      : U_Char;  
        Lc       : X_Key_Sym;  
        Uc       : X_Key_Sym;  
    begin

----If the Key_Code is nonsense or if the Col is not in the 0..3 range and
--  is also out of the Key_Syms range then return No_Symbol.

--/ if not TeleGen2_2d_Bug then
        if not (Key_Code in Display.Key_Syms'Range (1)) then
--/ else
--//         if not (TeleGen2_2d_Bug(Key_Code) in Display.Key_Syms'Range (1)) then
--/ end if;
            return No_Symbol;  
        end if;  
        if Col < Display.Key_Syms'First (2) or else  
           (Col > Display.Key_Syms'Last (2) and then Col >= 4) then  
            return No_Symbol;  
        end if;

----If Col is in the 0..3 range then we have an answer even if we have to
--  compute it.

        if Col < 4 then

----Locate the last non-No_Symbol entry for this Key_Code.

            Col_Odd := Col;  
            Per     := Display.Key_Syms'Last (2);  
            if Col > 1 then  
                while Per >= 2 and then
--/ if not TeleGen2_2d_Bug then
                         Display.Key_Syms (Key_Code, Per) = No_Symbol loop
--/ else
--//                          Display.Key_Syms (TeleGen2_2d_Bug(Key_Code), Per) =
--//                             No_Symbol loop
--/ end if;
                    Per := Per - 1;  
                end loop;  
                if Per < 2 then  
                    Col_Odd := Col_Odd - 1;  
                end if;  
            end if;

----If the even/odd pair of X_Key_Syms indexed by Col is a single symbol and
--  a No_Symbol then do the X_Convert_Case call to see if we have an upper/lower
--  case alphabetical.

            Col_Even := Col_Odd - Col_Odd rem 2;  
            Col_Odd  := Col_Even + 1;  
            if Per < Col_Odd or else
--/ if not TeleGen2_2d_Bug then
               Display.Key_Syms (Key_Code, Col_Odd) = No_Symbol then  
                X_Convert_Case  
                   (Display, Display.Key_Syms (Key_Code, Col_Even), Lc, Uc);
--/ else
--//                Display.Key_Syms (TeleGen2_2d_Bug(Key_Code), Col_Odd) =
--//                     No_Symbol then
--//                 X_Convert_Case (Display,
--//                                 Display.Key_Syms (TeleGen2_2d_Bug(Key_Code),
--//                                               Col_Even),
--//                                 Lc,
--//                                 Uc);
--/ end if;
                if Col rem 2 = 0 then  
                    return Lc;  
                else  
                    if Lc = Uc then  
                        return No_Symbol;  
                    else  
                        return Uc;  
                    end if;  
                end if;  
            end if;  
        end if;

----Otherwise return whatever is in the table.

--/ if not TeleGen2_2d_Bug then
        return Display.Key_Syms (Key_Code, Col);
--/ else
--//         return Display.Key_Syms (TeleGen2_2d_Bug(Key_Code), Col);
--/ end if;
    end Key_Code_To_Key_Sym;

--\x0c
    function Init_Mod_Map (Display : X_Display) return Boolean is  
        Map : X_Modifier_Keymap;  
        Sym : X_Key_Sym;  
        P   : X_Key_Trans;  
    begin

        Map                  := X_Get_Modifier_Mapping (Display);  
        Display.Modifier_Map := Map;  
        if Map = None_X_Modifier_Keymap then  
            return False;  
        end if;  
        if Display.Key_Syms = null and then not Initialize (Display) then  
            return False;  
        end if;  
        Lock_Display (Display);

----If any Lock key contains Caps_Lock, then interpret as Caps_Lock,
--  else if any contains Shift_Lock, then interpret as Shift_Lock,
--  else ignore Lock altogether.

        Display.Lock_Meaning := No_Symbol;

----Lock modifiers are in the second row of the matrix.

        for I in Map.Modifiermap'Range loop  
            for J in Display.Key_Syms'Range (2) loop  
                Sym :=  
                   Key_Code_To_Key_Sym (Display,  
                                        Map.Modifiermap (I) (Lock_Map_Index),  
                                        J);  
                if Sym = Misc.Xk_Caps_Lock then  
                    Display.Lock_Meaning := Misc.Xk_Caps_Lock;  
                    exit;  
                elsif Sym = Misc.Xk_Shift_Lock then  
                    Display.Lock_Meaning := Misc.Xk_Shift_Lock;  
                end if;  
            end loop;  
        end loop;

----Now find any Mod<n> modifier acting as the Group modifier.

        Display.Mode_Switch := None_X_Key_Button_Mask;  
        for I in Map.Modifiermap'Range loop  
            for J in Display.Key_Syms'Range (2) loop  
                for K in Mod_1_Map_Index .. Mod_5_Map_Index loop  
                    Sym := Key_Code_To_Key_Sym (Display,  
                                                Map.Modifiermap (I) (K),  
                                                J);  
                    if Sym = Misc.Xk_Mode_Switch then  
                        Display.Mode_Switch :=  
                           Display.Mode_Switch or Mod_Mask (K);  
                    end if;  
                end loop;  
            end loop;  
        end loop;

        P := Display.Key_Bindings;  
        while P /= null loop  
            Compute_Mask_From_Key_Trans (Display, P);  
            P := P.Next;  
        end loop;  
        Unlock_Display (Display);  
        return True;

    end Init_Mod_Map;

--\x0c
    function Initialize (Display : X_Display) return Boolean is  
        Ks : X_Key_Sym_List_2d;  
    begin

----Let's go get the key_syms from the server.

        if Display.Key_Syms = null then

----Get the keysym array from the server.

            Ks := X_Get_Keyboard_Mapping (Display,  
                                          Display.Min_Keycode,  
                                          Display.Max_Keycode);

----Stick the table into the display.

            Lock_Display (Display);  
            Display.Key_Syms := Ks;  
            Unlock_Display (Display);  
        end if;

----Check the modifier and translation tables also.

        if Display.Modifier_Map = null and then not Init_Mod_Map (Display) then  
            return False;  
        end if;  
        return Ks /= null;

    end Initialize;

--\x0c
    function X_Key_Code_To_Key_Sym (Display  : X_Display;  
                                    Key_Code : X_Key_Code;  
                                    Column   : U_Char) return X_Key_Sym is  
    begin

        if Display.Key_Syms = null and then not Initialize (Display) then  
            return No_Symbol;  
        end if;  
        return Key_Code_To_Key_Sym (Display, Key_Code, Column);

    end X_Key_Code_To_Key_Sym;

--\x0c
    function X_Key_Sym_To_Key_Code (Display    : X_Display;  
                                    Key_Symbol : X_Key_Sym) return X_Key_Code is  
    begin

        if Display.Key_Syms = null and then not Initialize (Display) then  
            return None_X_Key_Code;  
        end if;  
        for I in Display.Key_Syms'Range (1) loop  
            for J in Display.Key_Syms'Range (2) loop
--/ if not TeleGen2_2d_Bug then
                if Key_Code_To_Key_Sym (Display, I, J) = Key_Symbol then  
                    return I;  
                end if;
--/ else
--//                 if Key_Code_To_Key_Sym (Display, X_Key_Code (I), J) = key_symbol then
--//                     return X_Key_Code (I);
--//                 end if;
--/ end if;
            end loop;  
        end loop;  
        return 0;

    end X_Key_Sym_To_Key_Code;

--\x0c
    function X_Key_Sym_To_String (Key_Symbol : X_Key_Sym) return X_String is  
        use X_Ks_Info_Map;  
        Iter  : X_Ks_Info_Map.Iter;  
        Flags : S_Long;  
        Map   : X_Ks_Info_Map.Map renames X_Lib_Ks_Info_Map;  
    begin

        if Map = None_Map then  
            Initialize_Ks_Info_Map;  
        end if;

        Initialize (Map, Iter, Key_Symbol);  
        if Done (Iter) then  
            return "";  
        else  
            declare  
                Str : constant X_String := Key (Iter);  
            begin  
                return Str;  
            end;  
        end if;

    end X_Key_Sym_To_String;

--\x0c
    function X_Lookup_Key_Sym (Event  : X_Event;  
                               Column : U_Char) return X_Key_Sym is  
    begin

        if Event.Display.Key_Syms = null and then  
           not Initialize (Event.Display) then  
            return No_Symbol;  
        end if;  
        return Key_Code_To_Key_Sym (Event.Display, Event.Key.Key_Code, Column);

    end X_Lookup_Key_Sym;

--\x0c
    procedure X_Translate_Key (Display          :     X_Display;  
                               Key_Code         :     X_Key_Code;  
                               Modifiers        :     X_Key_Button_Mask;  
                               Modifiers_Return : out X_Key_Button_Mask;  
                               Key_Sym_Return   : out X_Key_Sym;  
                               Status           : out X_Status) is  
        Per  : U_Char;  
        K1   : X_Key_Sym;  
        K2   : X_Key_Sym;  
        Sym  : X_Key_Sym;  
        Lsym : X_Key_Sym;  
        Usym : X_Key_Sym;  
    begin

        if Display.Key_Syms = null and then not Initialize (Display) then  
            Status := Failed;  
            return;  
        end if;

        Modifiers_Return              := Display.Mode_Switch;  
        Modifiers_Return (Shift_Mask) := True;  
        Modifiers_Return (Lock_Mask)  := True;
--/ if not TeleGen2_2d_Bug then
        if Key_Code not in Display.Key_Syms'Range (1) then
--/ else
--//         if TeleGen2_2d_Bug(Key_Code) not in Display.Key_Syms'Range (1) then
--/ end if;
            Key_Sym_Return := No_Symbol;  
            Status         := Successful;  
            return;  
        end if;

        Per := Display.Key_Syms'Length (2);  
        while Per > 2 and then
--/ if not TeleGen2_2d_Bug then
                 Display.Key_Syms (Key_Code, Per - 1) = No_Symbol loop
--/ else
--//                  Display.Key_Syms (TeleGen2_2d_Bug(Key_Code), Per - 1) =
--//                         No_Symbol loop
--/ end if;
            Per := Per - 1;  
        end loop;
--/ if not TeleGen2_2d_Bug then
        if Per > 2 and then  
           (Modifiers and Display.Mode_Switch) /= None_X_Key_Button_Mask then  
            K1 := Display.Key_Syms (Key_Code, 2);  
            if Per > 3 then  
                K2 := Display.Key_Syms (Key_Code, 3);  
            else  
                K2 := No_Symbol;  
            end if;  
            Per := Per - 2;  
        else  
            K1 := Display.Key_Syms (Key_Code, 0);  
            if Per > 1 then  
                K2 := Display.Key_Syms (Key_Code, 1);  
            else  
                K2 := No_Symbol;  
            end if;  
        end if;
--/ else
--//         if Per > 2 and then
--//            (Modifiers and Display.Mode_Switch) /= None_X_Key_Button_Mask then
--//             K1 := Display.Key_Syms (TeleGen2_2d_Bug (Key_Code), 2);
--//             if Per > 3 then
--//                 K2 := Display.Key_Syms (TeleGen2_2d_Bug (Key_Code), 3);
--//             else
--//                 K2 := No_Symbol;
--//             end if;
--//             Per := Per - 2;
--//         else
--//             K1 := Display.Key_Syms (TeleGen2_2d_Bug (Key_Code), 0);
--//             if Per > 1 then
--//                 K2 := Display.Key_Syms (TeleGen2_2d_Bug (Key_Code), 1);
--//             else
--//                 K2 := No_Symbol;
--//             end if;
--//         end if;
--//
--/ end if;

        if not Modifiers (Shift_Mask) and then  
           (not Modifiers (Lock_Mask) or else  
            Display.Lock_Meaning = No_Symbol) then  
            if Per = 1 or else K2 = No_Symbol then  
                X_Convert_Case (Display, K1, Lsym, Usym);  
                Usym := Lsym;  
            else  
                Usym := K1;  
            end if;  
        elsif not Modifiers (Lock_Mask) or else  
              Display.Lock_Meaning /= Misc.Xk_Caps_Lock then  
            if Per = 1 or else K2 = No_Symbol then  
                X_Convert_Case (Display, K1, Lsym, Usym);  
            else  
                Usym := K2;  
            end if;  
        else  
            if Per = 1 or else K2 = No_Symbol then  
                Sym := K1;  
            else  
                Sym := K2;  
            end if;  
            X_Convert_Case (Display, Sym, Lsym, Usym);  
            if not Modifiers (Shift_Mask) and then  
               (Sym /= K1) and then  
               ((Sym /= Usym) or else (Lsym = Usym)) then  
                X_Convert_Case (Display, K1, Lsym, Usym);  
            end if;  
        end if;  
        if Usym = Misc.Xk_Void_Symbol then  
            Key_Sym_Return := No_Symbol;  
        else  
            Key_Sym_Return := Usym;  
        end if;  
        Status := Successful;

    end X_Translate_Key;

--\x0c
    procedure X_Translate_Key_Sym (Display   :        X_Display;  
                                   Symbol    :        X_Key_Sym;  
                                   Modifiers :        X_Key_Button_Mask;  
                                   Buffer    : in out X_String;  
                                   Result    : out    S_Natural;  
                                   Status    : out    X_Status) is  
        P        : X_Key_Trans;  
        Hi_Bytes : S_Long;  
        C        : S_Long;  
    begin

        if Symbol = No_Symbol then  
            Result := 0;  
            Status := Failed;  
            return;  
        end if;

----See if symbol is rebound, if so, return that string.

        P := Display.Key_Bindings;  
        while P /= None_X_Key_Trans loop  
            if (Modifiers and All_Mods) = P.State and then  
               Symbol = P.Key then  
                if P.Str'Length > Buffer'Length then  
                    Result := Buffer'Length;  
                    Buffer := P.Str (P.Str'First ..  
                                        P.Str'First + Buffer'Length - 1);  
                else  
                    Result := P.Str'Length;  
                    Buffer (Buffer'First .. Buffer'First + P.Str'Length - 1) :=  
                       P.Str.all;  
                end if;  
                Status := Successful;  
                return;  
            end if;  
            P := P.Next;  
        end loop;

----Try to convert to Latin-1, handling control.

        Hi_Bytes := S_Long (Symbol) / 2 ** 8;  
        if Buffer'Length = 0 or else  
           Hi_Bytes in 1 .. 16#FE# or else  
           (Hi_Bytes = 16#FF# and then  
            not (Symbol in Misc.Xk_Backspace .. Misc.Xk_Clear or else  
                 Symbol = Misc.Xk_Return or else  
                 Symbol = Misc.Xk_Escape or else  
                 Symbol = Latin1.Xk_Space or else  
                 Symbol = Misc.Xk_Tab or else  
                 Symbol = Misc.Xk_Kp_Enter or else  
                 Symbol in Misc.Xk_Kp_Multiply .. Misc.Xk_Kp_9 or else  
                 Symbol = Misc.Xk_Kp_Equal or else  
                 Symbol = Misc.Xk_Delete)) then  
            Result := 0;  
            Status := Failed;  
            return;  
        end if;

----If X keysym, convert to ascii by grabbing low 7 bits.

        if Symbol = Misc.Xk_Kp_Space then  
            C := S_Long (Latin1.Xk_Space) rem 16#0080#; -- patch encoding botch
        elsif Symbol = Latin1.Xk_Hyphen then  
            C := S_Long (Latin1.Xk_Minus) rem  
                    16#0100#; -- map to equiv character */
        elsif Hi_Bytes = 16#FF# then  
            C := S_Long (Symbol) rem 16#0080#;  
        else  
            C := S_Long (Symbol) rem 16#0100#;  
        end if;

----Only apply Control key if it makes sense, else ignore it.

        if Modifiers (Control_Mask) then  
            if (C >= Character'Pos ('@') and then  
                C < Character'Pos (Ascii.Del)) or else  
               C = Character'Pos (' ') then  
                C := C rem 16#20#;  
            elsif C = Character'Pos ('2') then  
                C := 0;  
            elsif C >= Character'Pos ('3') and then  
                  C <= Character'Pos ('7') then  
                C := C - (Character'Pos ('3') - Character'Pos (Ascii.Esc));  
            elsif C = Character'Pos ('8') then  
                C := Character'Pos (Ascii.Del);  
            elsif C = Character'Pos ('/') then  
                C := Character'Pos ('_') rem 16#20#;  
            end if;  
        end if;  
        Buffer (Buffer'First) := X_Character'Val (C);  
        Result                := 1;  
        Status                := Successful;

    end X_Translate_Key_Sym;

--\x0c
    procedure X_Lookup_String (Event      :        X_Event;  
                               Buffer     : in out X_String;  
                               Result     : out    S_Natural;  
                               Key_Symbol : out    X_Key_Sym;  
                               Status     : out    X_Compose_Status) is  
        Modifiers : X_Key_Button_Mask;  
        Symbol    : X_Key_Sym;  
        Succ      : X_Status;  
    begin

        Status := (Compose_Ptr => None_X_String_Pointer, Chars_Matched => 0);  
        X_Translate_Key (Event.Display, Event.Key.Key_Code,  
                         Event.Key.State, Modifiers, Symbol, Succ);  
        if Succ /= Successful then  
            Key_Symbol := No_Symbol;  
            Result     := 0;  
            return;  
        end if;

        Key_Symbol := Symbol;  
        X_Translate_Key_Sym (Event.Display, Symbol, Event.Key.State,  
                             Buffer, Result, Succ);
        --We don't care what the Succ is from this.

    end X_Lookup_String;

--\x0c
    procedure X_Rebind_Key_Sym (Display       : X_Display;  
                                Key_Symbol    : X_Key_Sym;  
                                Modifier_List : X_Key_Sym_Array;  
                                Binding       : X_String) is  
        P : X_Key_Trans;  
    begin

        if Display.Key_Syms = null and then not Initialize (Display) then  
            return;  
        end if;  
        P := new X_Key_Trans_Rec;  
        Lock_Display (Display);  
        begin  
            P.Next := Display.Key_Bindings;  -- chain onto list

            Display.Key_Bindings := P;  
            P.Str                := new X_String'(Binding);  
            P.Modifiers          := new X_Key_Sym_Array'(Modifier_List);  
            P.Key                := Key_Symbol;  
            Compute_Mask_From_Key_Trans (Display, P);  
        exception  
            when others =>  
                Display.Key_Bindings := P.Next;  
                Free_X_String_Pointer (P.Str);  
                Free_X_Key_Sym_List (P.Modifiers);  
                Free_X_Key_Trans (P);  
                Unlock_Display (Display);  
                raise;  
        end;  
        Unlock_Display (Display);

    end X_Rebind_Key_Sym;

--\x0c
    function X_String_To_Key_Sym (Name : X_String) return X_Key_Sym is  
        use X_Ks_Info_Map;  
        Ks    : X_Key_Sym := No_Symbol;  
        Succ  : Boolean;  
        Flags : S_Long;  
        Map   : X_Ks_Info_Map.Map renames X_Lib_Ks_Info_Map;  
    begin

        if Map = None_Map then  
            Initialize_Ks_Info_Map;  
        end if;

        Find (Map, Name, Ks, Succ);  
        if Succ then  
            return Ks;  
        else  
            return No_Symbol;  
        end if;

    end X_String_To_Key_Sym;

--\x0c
    procedure X_Refresh_Keyboard_Mapping (Event : X_Event) is  
        Modifier : Boolean := False;  
    begin

        Lock_Display (Event.Display);  
        begin
            -- X_XX should really only refresh what is necessary, for now, make
            -- initialize test fail
            if Event.Mapping.Request = Mapping_Keyboard then  
                if Event.Display.Key_Syms /= null then  
                    Free_X_Key_Sym_List_2d (Event.Display.Key_Syms);  
                end if;  
            elsif Event.Mapping.Request = Mapping_Modifier then  
                Free_X_Modifier_Keymap (Event.Display.Modifier_Map);  
                Event.Display.Key_Syms :=  
                   null;-- X_XX - looks like astorage leak
                Modifier               := True;  
            end if;  
        exception  
            when others =>  
                Unlock_Display (Event.Display);  
                raise;  
        end;  
        Unlock_Display (Event.Display);  
        if Modifier then  
            Modifier := Init_Mod_Map (Event.Display);  
        end if;

    end X_Refresh_Keyboard_Mapping;

--\x0c
    function X_Is_Keypad_Key (Key_Symbol : X_Key_Sym) return Boolean is
        --#define Is_Keypad_Key(key_symbol) \
        --  (((unsigned)(key_symbol) >= XK_KP_Space) &&
        --  ((unsigned)(key_symbol) <= XK_KP_Equal))
    begin  
        return Key_Symbol >= Misc.Xk_Kp_Space and then  
                  Key_Symbol <= Misc.Xk_Kp_Equal;  
    end X_Is_Keypad_Key;

    function X_Is_Cursor_Key (Key_Symbol : X_Key_Sym) return Boolean is
        --#define Is_Cursor_Key(key_symbol) \
        --  (((unsigned)(key_symbol) >= XK_Home)     &&
        --  ((unsigned)(key_symbol) <  XK_Select))
    begin  
        return Key_Symbol >= Misc.Xk_Home and then Key_Symbol < Misc.Xk_Select;  
    end X_Is_Cursor_Key;

    function X_Is_Pf_Key (Key_Symbol : X_Key_Sym) return Boolean is
        --#define Is_PF_Key(key_symbol) \
        --  (((unsigned)(key_symbol) >= XK_KP_F1)    &&
        --  ((unsigned)(key_symbol) <= XK_KP_F4))
    begin  
        return Key_Symbol >= Misc.Xk_Kp_F1 and then Key_Symbol <= Misc.Xk_Kp_F4;  
    end X_Is_Pf_Key;

    function X_Is_Function_Key (Key_Symbol : X_Key_Sym) return Boolean is
        --#define Is_Function_Key(key_symbol) \
        --  (((unsigned)(key_symbol) >= XK_F1)       &&
        --  ((unsigned)(key_symbol) <= XK_F35))
    begin  
        return Key_Symbol >= Misc.Xk_F1 and then Key_Symbol <= Misc.Xk_F35;  
    end X_Is_Function_Key;

    function X_Is_Misc_Function_Key (Key_Symbol : X_Key_Sym) return Boolean is
        --#define Is_Misc_Function_Key(key_symbol) \
        --  (((unsigned)(key_symbol) >= XK_Select)   &&
        --  ((unsigned)(key_symbol) <  XK_KP_Space))
    begin  
        return Key_Symbol >= Misc.Xk_Select and then  
                  Key_Symbol < Misc.Xk_Kp_Space;  
    end X_Is_Misc_Function_Key;

    function X_Is_Modifier_Key (Key_Symbol : X_Key_Sym) return Boolean is
        --#define Is_Modifier_Key(key_symbol) \
        --  (((unsigned)(key_symbol) >= XK_Shift_L)  &&
        --  ((unsigned)(key_symbol) <= XK_Hyper_R))
    begin  
        return Key_Symbol >= Misc.Xk_Shift_L and then  
                  Key_Symbol <= Misc.Xk_Hyper_R;  
    end X_Is_Modifier_Key;

--\x0c
    procedure Init_Ks_Info_File is  
        File   : Text_Io.File_Type;  
        Line   : String (1 .. 128);  
        Len    : Natural;  
        Namef  : Natural;  
        Namel  : Natural;  
        Valuef : Natural;  
        Valuel : Natural;  
        Flag   : Boolean;  
    begin

----Open the file, if it exists at all.

        begin  
            Text_Io.Open (File, Text_Io.In_File, X_Key_Sym_Db_File);  
        exception  
            when others =>  
                return;  
        end;

----Read every line in the file.

        while not Text_Io.End_Of_File (File) loop  
            Text_Io.Get_Line (File, Line, Len);  
            Namef  := 0;  
            Namel  := 0;  
            Valuef := 0;  
            Valuel := 0;

----Find the name.  The line may be blank or it may be a '!' comment line.

            for I in 1 .. Len loop  
                if Line (I) = '!' then  
                    goto Continue;  
                elsif Line (I) /= ' ' and then  
                      Line (I) /= Ascii.Ht then  
                    Namef := I;  
                    exit;  
                end if;  
            end loop;  
            if Namef = 0 then  
                goto Continue;  
            end if;

----Find the end of the name.

            for I in Namef + 1 .. Len loop  
                if Line (I) = ' ' or else  
                   Line (I) = Ascii.Ht or else  
                   Line (I) = ':' then  
                    Namel := I - 1;  
                    exit;  
                end if;  
            end loop;  
            if Namel = 0 then  
                goto Bad_Line;  
            end if;

----Find the beginning of the value.  Make sure we have a ':'.

            for I in Namel + 1 .. Len loop  
                if Line (I) = ':' then  
                    if Valuel /= 0 then  
                        goto Bad_Line;  
                    end if;  
                    Valuel := I;  
                elsif Line (I) /= ' ' and then  
                      Line (I) /= Ascii.Ht then  
                    Valuef := I;  
                    exit;  
                end if;  
            end loop;  
            if Valuef = 0 or else Valuel = 0 then  
                goto Bad_Line;  
            end if;

----Find the end of the value.  Convert it to a key_sym and put it into the
--  map.

            for I in reverse Namef .. Len loop  
                if Line (I) /= ' ' and then  
                   Line (I) /= Ascii.Ht then  
                    begin  
                        X_Ks_Info_Map.Insert  
                           (X_Lib_Ks_Info_Map,  
                            To_X_String (Line (Namef .. Namel)),  
                            X_Key_Sym'Value ("16#" & Line (Valuef .. I) & "#"),  
                            True);  
                    exception  
                        when others =>  
                            goto Bad_Line;  
                    end;  
                    goto Continue;  
                end if;  
            end loop;

----Come here on bad lines.

            <<Bad_Line>> null;  
            X_Report_Error ("XKsInfoDb", "BadLine",  
                            "Xlib; Badly formed line in file %1." & Lf &  
                               "Line: {%2}", To_X_String (X_Key_Sym_Db_File),  
                            To_X_String (Line (1 .. Len)));

----Come here to process the next line.

            <<Continue>> null;  
        end loop;  
        Text_Io.Close (File);

    exception

        when others =>  
            Text_Io.Close (File);  
            raise;

    end Init_Ks_Info_File;

--\x0c
    procedure Init_Ks_Info_Names is

        use Xlbt_Key_Defs;  
        procedure I (M       : in X_Ks_Info_Map.Map;  
                     Key     : in X_String;  
                     Rt      : in X_Key_Sym;  
                     Dups_Ok : in Boolean := False)  
            renames X_Ks_Info_Map.Insert;  
        Map : X_Ks_Info_Map.Map renames X_Lib_Ks_Info_Map;  
    begin
--
-- This list is based on X_Key_Defs.@.  Update it when you update that.
--

        X_Ks_Info_Map.New_Map (Map);

        I (Map, "leftcaret", Apl.Xk_Leftcaret);  
        I (Map, "rightcaret", Apl.Xk_Rightcaret);  
        I (Map, "downcaret", Apl.Xk_Downcaret);  
        I (Map, "upcaret", Apl.Xk_Upcaret);  
        I (Map, "overbar", Apl.Xk_Overbar);  
        I (Map, "downtack", Apl.Xk_Downtack);  
        I (Map, "upshoe", Apl.Xk_Upshoe);  
        I (Map, "downstile", Apl.Xk_Downstile);  
        I (Map, "underbar", Apl.Xk_Underbar);  
        I (Map, "jot", Apl.Xk_Jot);  
        I (Map, "quad", Apl.Xk_Quad);  
        I (Map, "uptack", Apl.Xk_Uptack);  
        I (Map, "circle", Apl.Xk_Circle);  
        I (Map, "upstile", Apl.Xk_Upstile);  
        I (Map, "downshoe", Apl.Xk_Downshoe);  
        I (Map, "rightshoe", Apl.Xk_Rightshoe);  
        I (Map, "leftshoe", Apl.Xk_Leftshoe);  
        I (Map, "lefttack", Apl.Xk_Lefttack);  
        I (Map, "righttack", Apl.Xk_Righttack);  
        I (Map, "Arabic_comma", Arabic.Xk_Arabic_Comma);  
        I (Map, "Arabic_semicolon", Arabic.Xk_Arabic_Semicolon);  
        I (Map, "Arabic_question_mark", Arabic.Xk_Arabic_Question_Mark);  
        I (Map, "Arabic_hamza", Arabic.Xk_Arabic_Hamza);  
        I (Map, "Arabic_maddaonalef", Arabic.Xk_Arabic_Maddaonalef);  
        I (Map, "Arabic_hamzaonalef", Arabic.Xk_Arabic_Hamzaonalef);  
        I (Map, "Arabic_hamzaonwaw", Arabic.Xk_Arabic_Hamzaonwaw);  
        I (Map, "Arabic_hamzaunderalef", Arabic.Xk_Arabic_Hamzaunderalef);  
        I (Map, "Arabic_hamzaonyeh", Arabic.Xk_Arabic_Hamzaonyeh);  
        I (Map, "Arabic_alef", Arabic.Xk_Arabic_Alef);  
        I (Map, "Arabic_beh", Arabic.Xk_Arabic_Beh);  
        I (Map, "Arabic_tehmarbuta", Arabic.Xk_Arabic_Tehmarbuta);  
        I (Map, "Arabic_teh", Arabic.Xk_Arabic_Teh);  
        I (Map, "Arabic_theh", Arabic.Xk_Arabic_Theh);  
        I (Map, "Arabic_jeem", Arabic.Xk_Arabic_Jeem);  
        I (Map, "Arabic_hah", Arabic.Xk_Arabic_Hah);  
        I (Map, "Arabic_khah", Arabic.Xk_Arabic_Khah);  
        I (Map, "Arabic_dal", Arabic.Xk_Arabic_Dal);  
        I (Map, "Arabic_thal", Arabic.Xk_Arabic_Thal);  
        I (Map, "Arabic_ra", Arabic.Xk_Arabic_Ra);  
        I (Map, "Arabic_zain", Arabic.Xk_Arabic_Zain);  
        I (Map, "Arabic_seen", Arabic.Xk_Arabic_Seen);  
        I (Map, "Arabic_sheen", Arabic.Xk_Arabic_Sheen);  
        I (Map, "Arabic_sad", Arabic.Xk_Arabic_Sad);  
        I (Map, "Arabic_dad", Arabic.Xk_Arabic_Dad);  
        I (Map, "Arabic_tah", Arabic.Xk_Arabic_Tah);  
        I (Map, "Arabic_zah", Arabic.Xk_Arabic_Zah);  
        I (Map, "Arabic_ain", Arabic.Xk_Arabic_Ain);  
        I (Map, "Arabic_ghain", Arabic.Xk_Arabic_Ghain);  
        I (Map, "Arabic_tatweel", Arabic.Xk_Arabic_Tatweel);  
        I (Map, "Arabic_feh", Arabic.Xk_Arabic_Feh);  
        I (Map, "Arabic_qaf", Arabic.Xk_Arabic_Qaf);  
        I (Map, "Arabic_kaf", Arabic.Xk_Arabic_Kaf);  
        I (Map, "Arabic_lam", Arabic.Xk_Arabic_Lam);  
        I (Map, "Arabic_meem", Arabic.Xk_Arabic_Meem);  
        I (Map, "Arabic_noon", Arabic.Xk_Arabic_Noon);  
        I (Map, "Arabic_ha", Arabic.Xk_Arabic_Ha);  
        I (Map, "Arabic_waw", Arabic.Xk_Arabic_Waw);  
        I (Map, "Arabic_alefmaksura", Arabic.Xk_Arabic_Alefmaksura);  
        I (Map, "Arabic_yeh", Arabic.Xk_Arabic_Yeh);  
        I (Map, "Arabic_fathatan", Arabic.Xk_Arabic_Fathatan);  
        I (Map, "Arabic_dammatan", Arabic.Xk_Arabic_Dammatan);  
        I (Map, "Arabic_kasratan", Arabic.Xk_Arabic_Kasratan);  
        I (Map, "Arabic_fatha", Arabic.Xk_Arabic_Fatha);  
        I (Map, "Arabic_damma", Arabic.Xk_Arabic_Damma);  
        I (Map, "Arabic_kasra", Arabic.Xk_Arabic_Kasra);  
        I (Map, "Arabic_shadda", Arabic.Xk_Arabic_Shadda);  
        I (Map, "Arabic_sukun", Arabic.Xk_Arabic_Sukun);  
        I (Map, "Arabic_switch", Arabic.Xk_Arabic_Switch);  
        I (Map, "Serbian_dje", Cyrillic.Xk_Serbian_Dje);  
        I (Map, "Macedonia_gje", Cyrillic.Xk_Macedonia_Gje);  
        I (Map, "Cyrillic_io", Cyrillic.Xk_Cyrillic_Io);  
        I (Map, "Ukrainian_ie", Cyrillic.Xk_Ukrainian_Ie);  
        I (Map, "Macedonia_dse", Cyrillic.Xk_Macedonia_Dse);  
        I (Map, "Ukrainian_i", Cyrillic.Xk_Ukrainian_I);  
        I (Map, "Ukrainian_yi", Cyrillic.Xk_Ukrainian_Yi);  
        I (Map, "Cyrillic_je", Cyrillic.Xk_Cyrillic_Je);  
        I (Map, "Cyrillic_lje", Cyrillic.Xk_Cyrillic_Lje);  
        I (Map, "Cyrillic_nje", Cyrillic.Xk_Cyrillic_Nje);  
        I (Map, "Serbian_tshe", Cyrillic.Xk_Serbian_Tshe);  
        I (Map, "Macedonia_kje", Cyrillic.Xk_Macedonia_Kje);  
        I (Map, "Byelorussian_shortu", Cyrillic.Xk_Byelorussian_Shortu);  
        I (Map, "Cyrillic_dzhe", Cyrillic.Xk_Cyrillic_Dzhe);  
        I (Map, "numerosign", Cyrillic.Xk_Numerosign);  
        I (Map, "Serbian_DJE", Cyrillic.Xk_Serbian_S_Dje);  
        I (Map, "Macedonia_GJE", Cyrillic.Xk_Macedonia_S_Gje);  
        I (Map, "Cyrillic_IO", Cyrillic.Xk_Cyrillic_S_Io);  
        I (Map, "Ukrainian_IE", Cyrillic.Xk_Ukrainian_S_Ie);  
        I (Map, "Macedonia_DSE", Cyrillic.Xk_Macedonia_S_Dse);  
        I (Map, "Ukrainian_I", Cyrillic.Xk_Ukrainian_S_I);  
        I (Map, "Ukrainian_YI", Cyrillic.Xk_Ukrainian_S_Yi);  
        I (Map, "Cyrillic_JE", Cyrillic.Xk_Cyrillic_S_Je);  
        I (Map, "Cyrillic_LJE", Cyrillic.Xk_Cyrillic_S_Lje);  
        I (Map, "Cyrillic_NJE", Cyrillic.Xk_Cyrillic_S_Nje);  
        I (Map, "Serbian_TSHE", Cyrillic.Xk_Serbian_S_Tshe);  
        I (Map, "Macedonia_KJE", Cyrillic.Xk_Macedonia_S_Kje);  
        I (Map, "Byelorussian_SHORTU", Cyrillic.Xk_Byelorussian_S_Shortu);  
        I (Map, "Cyrillic_DZHE", Cyrillic.Xk_Cyrillic_S_Dzhe);  
        I (Map, "Cyrillic_yu", Cyrillic.Xk_Cyrillic_Yu);  
        I (Map, "Cyrillic_a", Cyrillic.Xk_Cyrillic_A);  
        I (Map, "Cyrillic_be", Cyrillic.Xk_Cyrillic_Be);  
        I (Map, "Cyrillic_tse", Cyrillic.Xk_Cyrillic_Tse);  
        I (Map, "Cyrillic_de", Cyrillic.Xk_Cyrillic_De);  
        I (Map, "Cyrillic_ie", Cyrillic.Xk_Cyrillic_Ie);  
        I (Map, "Cyrillic_ef", Cyrillic.Xk_Cyrillic_Ef);  
        I (Map, "Cyrillic_ghe", Cyrillic.Xk_Cyrillic_Ghe);  
        I (Map, "Cyrillic_ha", Cyrillic.Xk_Cyrillic_Ha);  
        I (Map, "Cyrillic_i", Cyrillic.Xk_Cyrillic_I);  
        I (Map, "Cyrillic_shorti", Cyrillic.Xk_Cyrillic_Shorti);  
        I (Map, "Cyrillic_ka", Cyrillic.Xk_Cyrillic_Ka);  
        I (Map, "Cyrillic_el", Cyrillic.Xk_Cyrillic_El);  
        I (Map, "Cyrillic_em", Cyrillic.Xk_Cyrillic_Em);  
        I (Map, "Cyrillic_en", Cyrillic.Xk_Cyrillic_En);  
        I (Map, "Cyrillic_o", Cyrillic.Xk_Cyrillic_O);  
        I (Map, "Cyrillic_pe", Cyrillic.Xk_Cyrillic_Pe);  
        I (Map, "Cyrillic_ya", Cyrillic.Xk_Cyrillic_Ya);  
        I (Map, "Cyrillic_er", Cyrillic.Xk_Cyrillic_Er);  
        I (Map, "Cyrillic_es", Cyrillic.Xk_Cyrillic_Es);  
        I (Map, "Cyrillic_te", Cyrillic.Xk_Cyrillic_Te);  
        I (Map, "Cyrillic_u", Cyrillic.Xk_Cyrillic_U);  
        I (Map, "Cyrillic_zhe", Cyrillic.Xk_Cyrillic_Zhe);  
        I (Map, "Cyrillic_ve", Cyrillic.Xk_Cyrillic_Ve);  
        I (Map, "Cyrillic_softsign", Cyrillic.Xk_Cyrillic_Softsign);  
        I (Map, "Cyrillic_yeru", Cyrillic.Xk_Cyrillic_Yeru);  
        I (Map, "Cyrillic_ze", Cyrillic.Xk_Cyrillic_Ze);  
        I (Map, "Cyrillic_sha", Cyrillic.Xk_Cyrillic_Sha);  
        I (Map, "Cyrillic_e", Cyrillic.Xk_Cyrillic_E);  
        I (Map, "Cyrillic_shcha", Cyrillic.Xk_Cyrillic_Shcha);  
        I (Map, "Cyrillic_che", Cyrillic.Xk_Cyrillic_Che);  
        I (Map, "Cyrillic_hardsign", Cyrillic.Xk_Cyrillic_Hardsign);  
        I (Map, "Cyrillic_YU", Cyrillic.Xk_Cyrillic_S_Yu);  
        I (Map, "Cyrillic_A", Cyrillic.Xk_Cyrillic_S_A);  
        I (Map, "Cyrillic_BE", Cyrillic.Xk_Cyrillic_S_Be);  
        I (Map, "Cyrillic_TSE", Cyrillic.Xk_Cyrillic_S_Tse);  
        I (Map, "Cyrillic_DE", Cyrillic.Xk_Cyrillic_S_De);  
        I (Map, "Cyrillic_IE", Cyrillic.Xk_Cyrillic_S_Ie);  
        I (Map, "Cyrillic_EF", Cyrillic.Xk_Cyrillic_S_Ef);  
        I (Map, "Cyrillic_GHE", Cyrillic.Xk_Cyrillic_S_Ghe);  
        I (Map, "Cyrillic_HA", Cyrillic.Xk_Cyrillic_S_Ha);  
        I (Map, "Cyrillic_I", Cyrillic.Xk_Cyrillic_S_I);  
        I (Map, "Cyrillic_SHORTI", Cyrillic.Xk_Cyrillic_S_Shorti);  
        I (Map, "Cyrillic_KA", Cyrillic.Xk_Cyrillic_S_Ka);  
        I (Map, "Cyrillic_EL", Cyrillic.Xk_Cyrillic_S_El);  
        I (Map, "Cyrillic_EM", Cyrillic.Xk_Cyrillic_S_Em);  
        I (Map, "Cyrillic_EN", Cyrillic.Xk_Cyrillic_S_En);  
        I (Map, "Cyrillic_O", Cyrillic.Xk_Cyrillic_S_O);  
        I (Map, "Cyrillic_PE", Cyrillic.Xk_Cyrillic_S_Pe);  
        I (Map, "Cyrillic_YA", Cyrillic.Xk_Cyrillic_S_Ya);  
        I (Map, "Cyrillic_ER", Cyrillic.Xk_Cyrillic_S_Er);  
        I (Map, "Cyrillic_ES", Cyrillic.Xk_Cyrillic_S_Es);  
        I (Map, "Cyrillic_TE", Cyrillic.Xk_Cyrillic_S_Te);  
        I (Map, "Cyrillic_U", Cyrillic.Xk_Cyrillic_S_U);  
        I (Map, "Cyrillic_ZHE", Cyrillic.Xk_Cyrillic_S_Zhe);  
        I (Map, "Cyrillic_VE", Cyrillic.Xk_Cyrillic_S_Ve);  
        I (Map, "Cyrillic_SOFTSIGN", Cyrillic.Xk_Cyrillic_S_Softsign);  
        I (Map, "Cyrillic_YERU", Cyrillic.Xk_Cyrillic_S_Yeru);  
        I (Map, "Cyrillic_ZE", Cyrillic.Xk_Cyrillic_S_Ze);  
        I (Map, "Cyrillic_SHA", Cyrillic.Xk_Cyrillic_S_Sha);  
        I (Map, "Cyrillic_E", Cyrillic.Xk_Cyrillic_S_E);  
        I (Map, "Cyrillic_SHCHA", Cyrillic.Xk_Cyrillic_S_Shcha);  
        I (Map, "Cyrillic_CHE", Cyrillic.Xk_Cyrillic_S_Che);  
        I (Map, "Cyrillic_HARDSIGN", Cyrillic.Xk_Cyrillic_S_Hardsign);  
        I (Map, "Greek_ALPHAaccent", Greek.Xk_Greek_S_Alphaaccent);  
        I (Map, "Greek_EPSILONaccent", Greek.Xk_Greek_S_Epsilonaccent);  
        I (Map, "Greek_ETAaccent", Greek.Xk_Greek_S_Etaaccent);  
        I (Map, "Greek_IOTAaccent", Greek.Xk_Greek_S_Iotaaccent);  
        I (Map, "Greek_IOTAdiaeresis", Greek.Xk_Greek_Iotadiaeresis);  
        I (Map, "Greek_OMICRONaccent", Greek.Xk_Greek_S_Omicronaccent);  
        I (Map, "Greek_UPSILONaccent", Greek.Xk_Greek_S_Upsilonaccent);  
        I (Map, "Greek_UPSILONdieresis", Greek.Xk_Greek_S_Upsilondieresis);  
        I (Map, "Greek_OMEGAaccent", Greek.Xk_Greek_S_Omegaaccent);  
        I (Map, "Greek_accentdieresis", Greek.Xk_Greek_Accentdieresis);  
        I (Map, "Greek_horizbar", Greek.Xk_Greek_Horizbar);  
        I (Map, "Greek_alphaaccent", Greek.Xk_Greek_Alphaaccent);  
        I (Map, "Greek_epsilonaccent", Greek.Xk_Greek_Epsilonaccent);  
        I (Map, "Greek_etaaccent", Greek.Xk_Greek_Etaaccent);  
        I (Map, "Greek_iotaaccent", Greek.Xk_Greek_Iotaaccent);  
        I (Map, "Greek_iotadieresis", Greek.Xk_Greek_Iotadieresis);  
        I (Map, "Greek_iotaaccentdieresis", Greek.Xk_Greek_Iotaaccentdieresis);  
        I (Map, "Greek_omicronaccent", Greek.Xk_Greek_Omicronaccent);  
        I (Map, "Greek_upsilonaccent", Greek.Xk_Greek_Upsilonaccent);  
        I (Map, "Greek_upsilondieresis", Greek.Xk_Greek_Upsilondieresis);  
        I (Map, "Greek_upsilonaccentdieresis",  
           Greek.Xk_Greek_Upsilonaccentdieresis);  
        I (Map, "Greek_omegaaccent", Greek.Xk_Greek_Omegaaccent);  
        I (Map, "Greek_ALPHA", Greek.Xk_Greek_S_Alpha);  
        I (Map, "Greek_BETA", Greek.Xk_Greek_S_Beta);  
        I (Map, "Greek_GAMMA", Greek.Xk_Greek_S_Gamma);  
        I (Map, "Greek_DELTA", Greek.Xk_Greek_S_Delta);  
        I (Map, "Greek_EPSILON", Greek.Xk_Greek_S_Epsilon);  
        I (Map, "Greek_ZETA", Greek.Xk_Greek_S_Zeta);  
        I (Map, "Greek_ETA", Greek.Xk_Greek_S_Eta);  
        I (Map, "Greek_THETA", Greek.Xk_Greek_S_Theta);  
        I (Map, "Greek_IOTA", Greek.Xk_Greek_S_Iota);  
        I (Map, "Greek_KAPPA", Greek.Xk_Greek_S_Kappa);  
        I (Map, "Greek_LAMBDA", Greek.Xk_Greek_S_Lambda);  
        I (Map, "Greek_LAMDA", Greek.Xk_Greek_S_Lamda);  
        I (Map, "Greek_MU", Greek.Xk_Greek_S_Mu);  
        I (Map, "Greek_NU", Greek.Xk_Greek_S_Nu);  
        I (Map, "Greek_XI", Greek.Xk_Greek_S_Xi);  
        I (Map, "Greek_OMICRON", Greek.Xk_Greek_S_Omicron);  
        I (Map, "Greek_PI", Greek.Xk_Greek_S_Pi);  
        I (Map, "Greek_RHO", Greek.Xk_Greek_S_Rho);  
        I (Map, "Greek_SIGMA", Greek.Xk_Greek_S_Sigma);  
        I (Map, "Greek_TAU", Greek.Xk_Greek_S_Tau);  
        I (Map, "Greek_UPSILON", Greek.Xk_Greek_S_Upsilon);  
        I (Map, "Greek_PHI", Greek.Xk_Greek_S_Phi);  
        I (Map, "Greek_CHI", Greek.Xk_Greek_S_Chi);  
        I (Map, "Greek_PSI", Greek.Xk_Greek_S_Psi);  
        I (Map, "Greek_OMEGA", Greek.Xk_Greek_S_Omega);  
        I (Map, "Greek_alpha", Greek.Xk_Greek_Alpha);  
        I (Map, "Greek_beta", Greek.Xk_Greek_Beta);  
        I (Map, "Greek_gamma", Greek.Xk_Greek_Gamma);  
        I (Map, "Greek_delta", Greek.Xk_Greek_Delta);  
        I (Map, "Greek_epsilon", Greek.Xk_Greek_Epsilon);  
        I (Map, "Greek_zeta", Greek.Xk_Greek_Zeta);  
        I (Map, "Greek_eta", Greek.Xk_Greek_Eta);  
        I (Map, "Greek_theta", Greek.Xk_Greek_Theta);  
        I (Map, "Greek_iota", Greek.Xk_Greek_Iota);  
        I (Map, "Greek_kappa", Greek.Xk_Greek_Kappa);  
        I (Map, "Greek_lambda", Greek.Xk_Greek_Lambda);  
        I (Map, "Greek_lamda", Greek.Xk_Greek_Lamda);  
        I (Map, "Greek_mu", Greek.Xk_Greek_Mu);  
        I (Map, "Greek_nu", Greek.Xk_Greek_Nu);  
        I (Map, "Greek_xi", Greek.Xk_Greek_Xi);  
        I (Map, "Greek_omicron", Greek.Xk_Greek_Omicron);  
        I (Map, "Greek_pi", Greek.Xk_Greek_Pi);  
        I (Map, "Greek_rho", Greek.Xk_Greek_Rho);  
        I (Map, "Greek_sigma", Greek.Xk_Greek_Sigma);  
        I (Map, "Greek_finalsmallsigma", Greek.Xk_Greek_Finalsmallsigma);  
        I (Map, "Greek_tau", Greek.Xk_Greek_Tau);  
        I (Map, "Greek_upsilon", Greek.Xk_Greek_Upsilon);  
        I (Map, "Greek_phi", Greek.Xk_Greek_Phi);  
        I (Map, "Greek_chi", Greek.Xk_Greek_Chi);  
        I (Map, "Greek_psi", Greek.Xk_Greek_Psi);  
        I (Map, "Greek_omega", Greek.Xk_Greek_Omega);  
        I (Map, "Greek_switch", Greek.Xk_Greek_Switch);  
        I (Map, "hebrew_doublelowline", Hebrew.Xk_Hebrew_Doublelowline);  
        I (Map, "hebrew_aleph", Hebrew.Xk_Hebrew_Aleph);  
        I (Map, "hebrew_bet", Hebrew.Xk_Hebrew_Bet);  
        I (Map, "hebrew_gimel", Hebrew.Xk_Hebrew_Gimel);  
        I (Map, "hebrew_dalet", Hebrew.Xk_Hebrew_Dalet);  
        I (Map, "hebrew_he", Hebrew.Xk_Hebrew_He);  
        I (Map, "hebrew_waw", Hebrew.Xk_Hebrew_Waw);  
        I (Map, "hebrew_zain", Hebrew.Xk_Hebrew_Zain);  
        I (Map, "hebrew_chet", Hebrew.Xk_Hebrew_Chet);  
        I (Map, "hebrew_tet", Hebrew.Xk_Hebrew_Tet);  
        I (Map, "hebrew_yod", Hebrew.Xk_Hebrew_Yod);  
        I (Map, "hebrew_finalkaph", Hebrew.Xk_Hebrew_Finalkaph);  
        I (Map, "hebrew_kaph", Hebrew.Xk_Hebrew_Kaph);  
        I (Map, "hebrew_lamed", Hebrew.Xk_Hebrew_Lamed);  
        I (Map, "hebrew_finalmem", Hebrew.Xk_Hebrew_Finalmem);  
        I (Map, "hebrew_mem", Hebrew.Xk_Hebrew_Mem);  
        I (Map, "hebrew_finalnun", Hebrew.Xk_Hebrew_Finalnun);  
        I (Map, "hebrew_nun", Hebrew.Xk_Hebrew_Nun);  
        I (Map, "hebrew_samech", Hebrew.Xk_Hebrew_Samech);  
        I (Map, "hebrew_ayin", Hebrew.Xk_Hebrew_Ayin);  
        I (Map, "hebrew_finalpe", Hebrew.Xk_Hebrew_Finalpe);  
        I (Map, "hebrew_pe", Hebrew.Xk_Hebrew_Pe);  
        I (Map, "hebrew_finalzade", Hebrew.Xk_Hebrew_Finalzade);  
        I (Map, "hebrew_zade", Hebrew.Xk_Hebrew_Zade);  
        I (Map, "hebrew_qoph", Hebrew.Xk_Hebrew_Goph);  
        I (Map, "hebrew_resh", Hebrew.Xk_Hebrew_Resh);  
        I (Map, "hebrew_shin", Hebrew.Xk_Hebrew_Shin);  
        I (Map, "hebrew_taw", Hebrew.Xk_Hebrew_Taw);  
        I (Map, "Hebrew_switch", Hebrew.Xk_Hebrew_Switch);  
        I (Map, "overline", Katakana.Xk_Overline);  
        I (Map, "kana_fullstop", Katakana.Xk_Kana_Fullstop);  
        I (Map, "kana_openingbracket", Katakana.Xk_Kana_Openingbracket);  
        I (Map, "kana_closingbracket", Katakana.Xk_Kana_Closingbracket);  
        I (Map, "kana_comma", Katakana.Xk_Kana_Comma);  
        I (Map, "kana_conjunctive", Katakana.Xk_Kana_Conjunctive);  
        I (Map, "kana_WO", Katakana.Xk_Kana_Wo);  
        I (Map, "kana_a", Katakana.Xk_Kana_A);  
        I (Map, "kana_i", Katakana.Xk_Kana_I);  
        I (Map, "kana_u", Katakana.Xk_Kana_U);  
        I (Map, "kana_e", Katakana.Xk_Kana_E);  
        I (Map, "kana_o", Katakana.Xk_Kana_O);  
        I (Map, "kana_ya", Katakana.Xk_Kana_Ya);  
        I (Map, "kana_yu", Katakana.Xk_Kana_Yu);  
        I (Map, "kana_yo", Katakana.Xk_Kana_Yo);  
        I (Map, "kana_tsu", Katakana.Xk_Kana_Tsu);  
        I (Map, "prolongedsound", Katakana.Xk_Prolongedsound);  
        I (Map, "kana_A", Katakana.Xk_Kana_S_A);  
        I (Map, "kana_I", Katakana.Xk_Kana_S_I);  
        I (Map, "kana_U", Katakana.Xk_Kana_S_U);  
        I (Map, "kana_E", Katakana.Xk_Kana_S_E);  
        I (Map, "kana_O", Katakana.Xk_Kana_S_O);  
        I (Map, "kana_KA", Katakana.Xk_Kana_Ka);  
        I (Map, "kana_KI", Katakana.Xk_Kana_Ki);  
        I (Map, "kana_KU", Katakana.Xk_Kana_Ku);  
        I (Map, "kana_KE", Katakana.Xk_Kana_Ke);  
        I (Map, "kana_KO", Katakana.Xk_Kana_Ko);  
        I (Map, "kana_SA", Katakana.Xk_Kana_Sa);  
        I (Map, "kana_SHI", Katakana.Xk_Kana_Shi);  
        I (Map, "kana_SU", Katakana.Xk_Kana_Su);  
        I (Map, "kana_SE", Katakana.Xk_Kana_Se);  
        I (Map, "kana_SO", Katakana.Xk_Kana_So);  
        I (Map, "kana_TA", Katakana.Xk_Kana_Ta);  
        I (Map, "kana_CHI", Katakana.Xk_Kana_Chi);  
        I (Map, "kana_TSU", Katakana.Xk_Kana_S_Tsu);  
        I (Map, "kana_TE", Katakana.Xk_Kana_Te);  
        I (Map, "kana_TO", Katakana.Xk_Kana_To);  
        I (Map, "kana_NA", Katakana.Xk_Kana_Na);  
        I (Map, "kana_NI", Katakana.Xk_Kana_Ni);  
        I (Map, "kana_NU", Katakana.Xk_Kana_Nu);  
        I (Map, "kana_NE", Katakana.Xk_Kana_Ne);  
        I (Map, "kana_NO", Katakana.Xk_Kana_No);  
        I (Map, "kana_HA", Katakana.Xk_Kana_Ha);  
        I (Map, "kana_HI", Katakana.Xk_Kana_Hi);  
        I (Map, "kana_FU", Katakana.Xk_Kana_Fu);  
        I (Map, "kana_HE", Katakana.Xk_Kana_He);  
        I (Map, "kana_HO", Katakana.Xk_Kana_Ho);  
        I (Map, "kana_MA", Katakana.Xk_Kana_Ma);  
        I (Map, "kana_MI", Katakana.Xk_Kana_Mi);  
        I (Map, "kana_MU", Katakana.Xk_Kana_Mu);  
        I (Map, "kana_ME", Katakana.Xk_Kana_Me);  
        I (Map, "kana_MO", Katakana.Xk_Kana_Mo);  
        I (Map, "kana_YA", Katakana.Xk_Kana_S_Ya);  
        I (Map, "kana_YU", Katakana.Xk_Kana_S_Yu);  
        I (Map, "kana_YO", Katakana.Xk_Kana_S_Yo);  
        I (Map, "kana_RA", Katakana.Xk_Kana_Ra);  
        I (Map, "kana_RI", Katakana.Xk_Kana_Ri);  
        I (Map, "kana_RU", Katakana.Xk_Kana_Ru);  
        I (Map, "kana_RE", Katakana.Xk_Kana_Re);  
        I (Map, "kana_RO", Katakana.Xk_Kana_Ro);  
        I (Map, "kana_WA", Katakana.Xk_Kana_Wa);  
        I (Map, "kana_N", Katakana.Xk_Kana_N);  
        I (Map, "voicedsound", Katakana.Xk_Voicedsound);  
        I (Map, "semivoicedsound", Katakana.Xk_Semivoicedsound);  
        I (Map, "Kana_switch", Katakana.Xk_Kana_Switch);  
        I (Map, "space", Latin1.Xk_Space);  
        I (Map, "exclam", Latin1.Xk_Exclam);  
        I (Map, "quotedbl", Latin1.Xk_Quotedbl);  
        I (Map, "numbersign", Latin1.Xk_Numbersign);  
        I (Map, "dollar", Latin1.Xk_Dollar);  
        I (Map, "percent", Latin1.Xk_Percent);  
        I (Map, "ampersand", Latin1.Xk_Ampersand);  
        I (Map, "apostrophe", Latin1.Xk_Apostrophe);  
        I (Map, "parenleft", Latin1.Xk_Parenleft);  
        I (Map, "parenright", Latin1.Xk_Parenright);  
        I (Map, "asterisk", Latin1.Xk_Asterisk);  
        I (Map, "plus", Latin1.Xk_Plus);  
        I (Map, "comma", Latin1.Xk_Comma);  
        I (Map, "minus", Latin1.Xk_Minus);  
        I (Map, "period", Latin1.Xk_Period);  
        I (Map, "slash", Latin1.Xk_Slash);  
        I (Map, "0", Latin1.Xk_0);  
        I (Map, "1", Latin1.Xk_1);  
        I (Map, "2", Latin1.Xk_2);  
        I (Map, "3", Latin1.Xk_3);  
        I (Map, "4", Latin1.Xk_4);  
        I (Map, "5", Latin1.Xk_5);  
        I (Map, "6", Latin1.Xk_6);  
        I (Map, "7", Latin1.Xk_7);  
        I (Map, "8", Latin1.Xk_8);  
        I (Map, "9", Latin1.Xk_9);  
        I (Map, "colon", Latin1.Xk_Colon);  
        I (Map, "semicolon", Latin1.Xk_Semicolon);  
        I (Map, "less", Latin1.Xk_Less);  
        I (Map, "equal", Latin1.Xk_Equal);  
        I (Map, "greater", Latin1.Xk_Greater);  
        I (Map, "question", Latin1.Xk_Question);  
        I (Map, "at", Latin1.Xk_At);  
        I (Map, "A", Latin1.Xk_S_A);  
        I (Map, "B", Latin1.Xk_S_B);  
        I (Map, "C", Latin1.Xk_S_C);  
        I (Map, "D", Latin1.Xk_S_D);  
        I (Map, "E", Latin1.Xk_S_E);  
        I (Map, "F", Latin1.Xk_S_F);  
        I (Map, "G", Latin1.Xk_S_G);  
        I (Map, "H", Latin1.Xk_S_H);  
        I (Map, "I", Latin1.Xk_S_I);  
        I (Map, "J", Latin1.Xk_S_J);  
        I (Map, "K", Latin1.Xk_S_K);  
        I (Map, "L", Latin1.Xk_S_L);  
        I (Map, "M", Latin1.Xk_S_M);  
        I (Map, "N", Latin1.Xk_S_N);  
        I (Map, "O", Latin1.Xk_S_O);  
        I (Map, "P", Latin1.Xk_S_P);  
        I (Map, "Q", Latin1.Xk_S_Q);  
        I (Map, "R", Latin1.Xk_S_R);  
        I (Map, "S", Latin1.Xk_S_S);  
        I (Map, "T", Latin1.Xk_S_T);  
        I (Map, "U", Latin1.Xk_S_U);  
        I (Map, "V", Latin1.Xk_S_V);  
        I (Map, "W", Latin1.Xk_S_W);  
        I (Map, "X", Latin1.Xk_S_X);  
        I (Map, "Y", Latin1.Xk_S_Y);  
        I (Map, "Z", Latin1.Xk_S_Z);  
        I (Map, "bracketleft", Latin1.Xk_Bracketleft);  
        I (Map, "backslash", Latin1.Xk_Backslash);  
        I (Map, "bracketright", Latin1.Xk_Bracketright);  
        I (Map, "asciicircum", Latin1.Xk_Asciicircum);  
        I (Map, "underscore", Latin1.Xk_Underscore);  
        I (Map, "grave", Latin1.Xk_Grave);  
        I (Map, "a", Latin1.Xk_A);  
        I (Map, "b", Latin1.Xk_B);  
        I (Map, "c", Latin1.Xk_C);  
        I (Map, "d", Latin1.Xk_D);  
        I (Map, "e", Latin1.Xk_E);  
        I (Map, "f", Latin1.Xk_F);  
        I (Map, "g", Latin1.Xk_G);  
        I (Map, "h", Latin1.Xk_H);  
        I (Map, "i", Latin1.Xk_I);  
        I (Map, "j", Latin1.Xk_J);  
        I (Map, "k", Latin1.Xk_K);  
        I (Map, "l", Latin1.Xk_L);  
        I (Map, "m", Latin1.Xk_M);         I (Map, "n", Latin1.Xk_N);  
        I (Map, "o", Latin1.Xk_O);  
        I (Map, "p", Latin1.Xk_P);  
        I (Map, "q", Latin1.Xk_Q);  
        I (Map, "r", Latin1.Xk_R);  
        I (Map, "s", Latin1.Xk_S);  
        I (Map, "t", Latin1.Xk_T);  
        I (Map, "u", Latin1.Xk_U);  
        I (Map, "v", Latin1.Xk_V);  
        I (Map, "w", Latin1.Xk_W);  
        I (Map, "x", Latin1.Xk_X);  
        I (Map, "y", Latin1.Xk_Y);  
        I (Map, "z", Latin1.Xk_Z);  
        I (Map, "braceleft", Latin1.Xk_Braceleft);  
        I (Map, "bar", Latin1.Xk_Bar);  
        I (Map, "braceright", Latin1.Xk_Braceright);  
        I (Map, "asciitilde", Latin1.Xk_Asciitilde);  
        I (Map, "nobreakspace", Latin1.Xk_Nobreakspace);  
        I (Map, "exclamdown", Latin1.Xk_Exclamdown);  
        I (Map, "cent", Latin1.Xk_Cent);  
        I (Map, "sterling", Latin1.Xk_Sterling);  
        I (Map, "currency", Latin1.Xk_Currency);  
        I (Map, "yen", Latin1.Xk_Yen);  
        I (Map, "brokenbar", Latin1.Xk_Brokenbar);  
        I (Map, "section", Latin1.Xk_Section);  
        I (Map, "diaeresis", Latin1.Xk_Diaeresis);  
        I (Map, "copyright", Latin1.Xk_Copyright);  
        I (Map, "ordfeminine", Latin1.Xk_Ordfeminine);  
        I (Map, "guillemotleft", Latin1.Xk_Guillemotleft);  
        I (Map, "notsign", Latin1.Xk_Notsign);  
        I (Map, "hyphen", Latin1.Xk_Hyphen);  
        I (Map, "registered", Latin1.Xk_Registered);  
        I (Map, "macron", Latin1.Xk_Macron);  
        I (Map, "degree", Latin1.Xk_Degree);  
        I (Map, "plusminus", Latin1.Xk_Plusminus);  
        I (Map, "twosuperior", Latin1.Xk_Twosuperior);  
        I (Map, "threesuperior", Latin1.Xk_Threesuperior);  
        I (Map, "acute", Latin1.Xk_Acute);  
        I (Map, "mu", Latin1.Xk_Mu);  
        I (Map, "paragraph", Latin1.Xk_Paragraph);  
        I (Map, "periodcentered", Latin1.Xk_Periodcentered);  
        I (Map, "cedilla", Latin1.Xk_Cedilla);  
        I (Map, "onesuperior", Latin1.Xk_Onesuperior);  
        I (Map, "masculine", Latin1.Xk_Masculine);  
        I (Map, "guillemotright", Latin1.Xk_Guillemotright);  
        I (Map, "onequarter", Latin1.Xk_Onequarter);  
        I (Map, "onehalf", Latin1.Xk_Onehalf);  
        I (Map, "threequarters", Latin1.Xk_Threequarters);  
        I (Map, "questiondown", Latin1.Xk_Questiondown);  
        I (Map, "Agrave", Latin1.Xk_S_Agrave);  
        I (Map, "Aacute", Latin1.Xk_S_Aacute);  
        I (Map, "Acircumflex", Latin1.Xk_S_Acircumflex);  
        I (Map, "Atilde", Latin1.Xk_S_Atilde);  
        I (Map, "Adiaeresis", Latin1.Xk_S_Adiaeresis);  
        I (Map, "Aring", Latin1.Xk_S_Aring);  
        I (Map, "AE", Latin1.Xk_S_Ae);  
        I (Map, "Ccedilla", Latin1.Xk_S_Ccedilla);  
        I (Map, "Egrave", Latin1.Xk_S_Egrave);  
        I (Map, "Eacute", Latin1.Xk_S_Eacute);  
        I (Map, "Ecircumflex", Latin1.Xk_S_Ecircumflex);  
        I (Map, "Ediaeresis", Latin1.Xk_S_Ediaeresis);  
        I (Map, "Igrave", Latin1.Xk_S_Igrave);  
        I (Map, "Iacute", Latin1.Xk_S_Iacute);  
        I (Map, "Icircumflex", Latin1.Xk_S_Icircumflex);  
        I (Map, "Idiaeresis", Latin1.Xk_S_Idiaeresis);  
        I (Map, "ETH", Latin1.Xk_S_Eth);  
        I (Map, "Ntilde", Latin1.Xk_S_Ntilde);  
        I (Map, "Ograve", Latin1.Xk_S_Ograve);  
        I (Map, "Oacute", Latin1.Xk_S_Oacute);  
        I (Map, "Ocircumflex", Latin1.Xk_S_Ocircumflex);  
        I (Map, "Otilde", Latin1.Xk_S_Otilde);  
        I (Map, "Odiaeresis", Latin1.Xk_S_Odiaeresis);  
        I (Map, "multiply", Latin1.Xk_Multiply);  
        I (Map, "Ooblique", Latin1.Xk_Ooblique);  
        I (Map, "Ugrave", Latin1.Xk_S_Ugrave);  
        I (Map, "Uacute", Latin1.Xk_S_Uacute);  
        I (Map, "Ucircumflex", Latin1.Xk_S_Ucircumflex);  
        I (Map, "Udiaeresis", Latin1.Xk_S_Udiaeresis);  
        I (Map, "Yacute", Latin1.Xk_S_Yacute);  
        I (Map, "THORN", Latin1.Xk_S_Thorn);  
        I (Map, "ssharp", Latin1.Xk_Ssharp);  
        I (Map, "agrave", Latin1.Xk_Agrave);  
        I (Map, "aacute", Latin1.Xk_Aacute);  
        I (Map, "acircumflex", Latin1.Xk_Acircumflex);  
        I (Map, "atilde", Latin1.Xk_Atilde);  
        I (Map, "adiaeresis", Latin1.Xk_Adiaeresis);  
        I (Map, "aring", Latin1.Xk_Aring);  
        I (Map, "ae", Latin1.Xk_Ae);  
        I (Map, "ccedilla", Latin1.Xk_Ccedilla);  
        I (Map, "egrave", Latin1.Xk_Egrave);  
        I (Map, "eacute", Latin1.Xk_Eacute);  
        I (Map, "ecircumflex", Latin1.Xk_Ecircumflex);  
        I (Map, "ediaeresis", Latin1.Xk_Ediaeresis);  
        I (Map, "igrave", Latin1.Xk_Igrave);  
        I (Map, "iacute", Latin1.Xk_Iacute);  
        I (Map, "icircumflex", Latin1.Xk_Icircumflex);  
        I (Map, "idiaeresis", Latin1.Xk_Idiaeresis);  
        I (Map, "eth", Latin1.Xk_Eth);  
        I (Map, "ntilde", Latin1.Xk_Ntilde);  
        I (Map, "ograve", Latin1.Xk_Ograve);  
        I (Map, "oacute", Latin1.Xk_Oacute);  
        I (Map, "ocircumflex", Latin1.Xk_Ocircumflex);  
        I (Map, "otilde", Latin1.Xk_Otilde);  
        I (Map, "odiaeresis", Latin1.Xk_Odiaeresis);  
        I (Map, "division", Latin1.Xk_Division);  
        I (Map, "oslash", Latin1.Xk_Oslash);  
        I (Map, "ugrave", Latin1.Xk_Ugrave);  
        I (Map, "uacute", Latin1.Xk_Uacute);  
        I (Map, "ucircumflex", Latin1.Xk_Ucircumflex);  
        I (Map, "udiaeresis", Latin1.Xk_Udiaeresis);  
        I (Map, "yacute", Latin1.Xk_Yacute);  
        I (Map, "thorn", Latin1.Xk_Thorn);  
        I (Map, "ydiaeresis", Latin1.Xk_Ydiaeresis);  
        I (Map, "Aogonek", Latin2.Xk_S_Aogonek);  
        I (Map, "breve", Latin2.Xk_Breve);  
        I (Map, "Lstroke", Latin2.Xk_S_Lstroke);  
        I (Map, "Lcaron", Latin2.Xk_S_Lcaron);  
        I (Map, "Sacute", Latin2.Xk_S_Sacute);  
        I (Map, "Scaron", Latin2.Xk_S_Scaron);  
        I (Map, "Scedilla", Latin2.Xk_S_Scedilla);  
        I (Map, "Tcaron", Latin2.Xk_S_Tcaron);  
        I (Map, "Zacute", Latin2.Xk_S_Zacute);  
        I (Map, "Zcaron", Latin2.Xk_S_Zcaron);  
        I (Map, "Zabovedot", Latin2.Xk_S_Zabovedot);  
        I (Map, "aogonek", Latin2.Xk_Aogonek);  
        I (Map, "ogonek", Latin2.Xk_Ogonek);  
        I (Map, "lstroke", Latin2.Xk_Lstroke);  
        I (Map, "lcaron", Latin2.Xk_Lcaron);  
        I (Map, "sacute", Latin2.Xk_Sacute);  
        I (Map, "caron", Latin2.Xk_Caron);  
        I (Map, "scaron", Latin2.Xk_Scaron);  
        I (Map, "scedilla", Latin2.Xk_Scedilla);  
        I (Map, "tcaron", Latin2.Xk_Tcaron);  
        I (Map, "zacute", Latin2.Xk_Zacute);  
        I (Map, "doubleacute", Latin2.Xk_Doubleacute);  
        I (Map, "zcaron", Latin2.Xk_Zcaron);  
        I (Map, "zabovedot", Latin2.Xk_Zabovedot);  
        I (Map, "Racute", Latin2.Xk_S_Racute);  
        I (Map, "Abreve", Latin2.Xk_S_Abreve);  
        I (Map, "Lacute", Latin2.Xk_S_Lacute);  
        I (Map, "Cacute", Latin2.Xk_S_Cacute);  
        I (Map, "Ccaron", Latin2.Xk_S_Ccaron);  
        I (Map, "Eogonek", Latin2.Xk_S_Eogonek);  
        I (Map, "Ecaron", Latin2.Xk_S_Ecaron);  
        I (Map, "Dcaron", Latin2.Xk_S_Dcaron);  
        I (Map, "Dstroke", Latin2.Xk_S_Dstroke);  
        I (Map, "Nacute", Latin2.Xk_S_Nacute);  
        I (Map, "Ncaron", Latin2.Xk_S_Ncaron);  
        I (Map, "Odoubleacute", Latin2.Xk_S_Odoubleacute);  
        I (Map, "Rcaron", Latin2.Xk_S_Rcaron);  
        I (Map, "Uring", Latin2.Xk_S_Uring);  
        I (Map, "Udoubleacute", Latin2.Xk_S_Udoubleacute);  
        I (Map, "Tcedilla", Latin2.Xk_S_Tcedilla);  
        I (Map, "racute", Latin2.Xk_Racute);  
        I (Map, "abreve", Latin2.Xk_Abreve);  
        I (Map, "lactue", Latin2.Xk_Lacute);  
        I (Map, "cacute", Latin2.Xk_Cacute);  
        I (Map, "ccaron", Latin2.Xk_Ccaron);  
        I (Map, "eogonek", Latin2.Xk_Eogonek);  
        I (Map, "ecaron", Latin2.Xk_Ecaron);  
        I (Map, "dcaron", Latin2.Xk_Dcaron);  
        I (Map, "dstroke", Latin2.Xk_Dstroke);  
        I (Map, "nacute", Latin2.Xk_Nacute);  
        I (Map, "ncaron", Latin2.Xk_Ncaron);  
        I (Map, "odoubleacute", Latin2.Xk_Odoubleacute);  
        I (Map, "udoubleacute", Latin2.Xk_Udoubleacute);  
        I (Map, "rcaron", Latin2.Xk_Rcaron);  
        I (Map, "uring", Latin2.Xk_Uring);  
        I (Map, "tcedilla", Latin2.Xk_Tcedilla);  
        I (Map, "abovedot", Latin2.Xk_Abovedot);  
        I (Map, "Hstroke", Latin3.Xk_S_Hstroke);  
        I (Map, "Hcircumflex", Latin3.Xk_S_Hcircumflex);  
        I (Map, "Iabovedot", Latin3.Xk_Iabovedot);  
        I (Map, "Gbreve", Latin3.Xk_S_Gbreve);  
        I (Map, "Jcircumflex", Latin3.Xk_S_Jcircumflex);  
        I (Map, "hstroke", Latin3.Xk_Hstroke);  
        I (Map, "hcircumflex", Latin3.Xk_Hcircumflex);  
        I (Map, "idotless", Latin3.Xk_Idotless);  
        I (Map, "gbreve", Latin3.Xk_Gbreve);  
        I (Map, "jcircumflex", Latin3.Xk_Jcircumflex);  
        I (Map, "Cabovedot", Latin3.Xk_S_Cabovedot);  
        I (Map, "Ccircumflex", Latin3.Xk_S_Ccircumflex);  
        I (Map, "Gabovedot", Latin3.Xk_S_Gabovedot);  
        I (Map, "Gcircumflex", Latin3.Xk_S_Gcircumflex);  
        I (Map, "Ubreve", Latin3.Xk_S_Ubreve);  
        I (Map, "Scircumflex", Latin3.Xk_S_Scircumflex);  
        I (Map, "cabovedot", Latin3.Xk_Cabovedot);  
        I (Map, "ccircumflex", Latin3.Xk_Ccircumflex);  
        I (Map, "gabovedot", Latin3.Xk_Gabovedot);  
        I (Map, "gcircumflex", Latin3.Xk_Gcircumflex);  
        I (Map, "ubreve", Latin3.Xk_Ubreve);  
        I (Map, "scircumflex", Latin3.Xk_Scircumflex);  
        I (Map, "kra", Latin4.Xk_Kra);  
        I (Map, "Rcedilla", Latin4.Xk_S_Rcedilla);  
        I (Map, "Itilde", Latin4.Xk_S_Itilde);  
        I (Map, "Lcedilla", Latin4.Xk_S_Lcedilla);  
        I (Map, "Emacron", Latin4.Xk_S_Emacron);  
        I (Map, "Gcedilla", Latin4.Xk_S_Gcedilla);  
        I (Map, "Tslash", Latin4.Xk_S_Tslash);  
        I (Map, "rcedilla", Latin4.Xk_Rcedilla);  
        I (Map, "itilde", Latin4.Xk_Itilde);  
        I (Map, "lcedilla", Latin4.Xk_Lcedilla);  
        I (Map, "emacron", Latin4.Xk_Emacron);  
        I (Map, "gcedilla", Latin4.Xk_Gcedilla);  
        I (Map, "tslash", Latin4.Xk_Tslash);  
        I (Map, "ENG", Latin4.Xk_S_Eng);  
        I (Map, "eng", Latin4.Xk_Eng);  
        I (Map, "Amacron", Latin4.Xk_S_Amacron);  
        I (Map, "Iogonek", Latin4.Xk_S_Iogonek);  
        I (Map, "Eabovedot", Latin4.Xk_S_Eabovedot);  
        I (Map, "Imacron", Latin4.Xk_S_Imacron);  
        I (Map, "Ncedilla", Latin4.Xk_S_Ncedilla);  
        I (Map, "Omacron", Latin4.Xk_S_Omacron);  
        I (Map, "Kcedilla", Latin4.Xk_S_Kcedilla);  
        I (Map, "Uogonek", Latin4.Xk_S_Uogonek);  
        I (Map, "Utilde", Latin4.Xk_S_Utilde);  
        I (Map, "Umacron", Latin4.Xk_S_Umacron);  
        I (Map, "amacron", Latin4.Xk_Amacron);  
        I (Map, "iogonek", Latin4.Xk_Iogonek);  
        I (Map, "eabovedot", Latin4.Xk_Eabovedot);  
        I (Map, "imacron", Latin4.Xk_Imacron);  
        I (Map, "ncedilla", Latin4.Xk_Ncedilla);  
        I (Map, "omacron", Latin4.Xk_Omacron);  
        I (Map, "kcedilla", Latin4.Xk_Kcedilla);  
        I (Map, "uogonek", Latin4.Xk_Uogonek);  
        I (Map, "utilde", Latin4.Xk_Utilde);  
        I (Map, "umacron", Latin4.Xk_Umacron);  
        I (Map, "VoidSymbol", Misc.Xk_Void_Symbol);  
        I (Map, "BackSpace", Misc.Xk_Backspace);  
        I (Map, "Tab", Misc.Xk_Tab);  
        I (Map, "Linefeed", Misc.Xk_Linefeed);  
        I (Map, "Clear", Misc.Xk_Clear);  
        I (Map, "Return", Misc.Xk_Return);  
        I (Map, "Pause", Misc.Xk_Pause);  
        I (Map, "Scroll_Lock", Misc.Xk_Scroll_Lock);  
        I (Map, "Escape", Misc.Xk_Escape);  
        I (Map, "Delete", Misc.Xk_Delete);  
        I (Map, "Multi_key", Misc.Xk_Multi_Key);  
        I (Map, "Kanji", Misc.Xk_Kanji);  
        I (Map, "Muhenkan", Misc.Xk_Muhenkan);  
        I (Map, "Henkan_Mode", Misc.Xk_Henkan_Mode);  
        I (Map, "Henkan", Misc.Xk_Henkan);  
        I (Map, "Romaji", Misc.Xk_Romaji);  
        I (Map, "Hiragana", Misc.Xk_Hiragana);  
        I (Map, "Katakana", Misc.Xk_Katakana);  
        I (Map, "Hiragana_Katakana", Misc.Xk_Hiragana_Katakana);  
        I (Map, "Zenkaku", Misc.Xk_Zenkaku);  
        I (Map, "Hankaku", Misc.Xk_Hankaku);  
        I (Map, "Zenkaku_Hankaku", Misc.Xk_Zenkaku_Hankaku);  
        I (Map, "Touroku", Misc.Xk_Touroku);  
        I (Map, "Massyo", Misc.Xk_Massyo);  
        I (Map, "Kana_Lock", Misc.Xk_Kana_Lock);  
        I (Map, "Kana_Shift", Misc.Xk_Kana_Shift);  
        I (Map, "Eisu_Shift", Misc.Xk_Eisu_Lock);  
        I (Map, "Eisu_toggle", Misc.Xk_Eisu_Toggle);  
        I (Map, "Home", Misc.Xk_Home);  
        I (Map, "Left", Misc.Xk_Left);  
        I (Map, "Up", Misc.Xk_Up);  
        I (Map, "Right", Misc.Xk_Right);  
        I (Map, "Down", Misc.Xk_Down);  
        I (Map, "Prior", Misc.Xk_Prior);  
        I (Map, "Next", Misc.Xk_Next);  
        I (Map, "End", Misc.Xk_End);  
        I (Map, "Begin", Misc.Xk_Begin);  
        I (Map, "Select", Misc.Xk_Select);  
        I (Map, "Print", Misc.Xk_Print);  
        I (Map, "Execute", Misc.Xk_Execute);  
        I (Map, "Insert", Misc.Xk_Insert);  
        I (Map, "Undo", Misc.Xk_Undo);  
        I (Map, "Redo", Misc.Xk_Redo);  
        I (Map, "Menu", Misc.Xk_Menu);  
        I (Map, "Find", Misc.Xk_Find);  
        I (Map, "Cancel", Misc.Xk_Cancel);  
        I (Map, "Help", Misc.Xk_Help);  
        I (Map, "Break", Misc.Xk_Break);  
        I (Map, "Mode_switch", Misc.Xk_Mode_Switch);  
        I (Map, "script_switch", Misc.Xk_Script_Switch);  
        I (Map, "Num_Lock", Misc.Xk_Num_Lock);  
        I (Map, "KP_Space", Misc.Xk_Kp_Space);  
        I (Map, "KP_Tab", Misc.Xk_Kp_Tab);  
        I (Map, "KP_Enter", Misc.Xk_Kp_Enter);  
        I (Map, "KP_F1", Misc.Xk_Kp_F1);  
        I (Map, "KP_F2", Misc.Xk_Kp_F2);  
        I (Map, "KP_F3", Misc.Xk_Kp_F3);  
        I (Map, "KP_F4", Misc.Xk_Kp_F4);  
        I (Map, "KP_Equal", Misc.Xk_Kp_Equal);  
        I (Map, "KP_Multiply", Misc.Xk_Kp_Multiply);  
        I (Map, "KP_Add", Misc.Xk_Kp_Add);  
        I (Map, "KP_Separator", Misc.Xk_Kp_Separator);  
        I (Map, "KP_Subtract", Misc.Xk_Kp_Subtract);  
        I (Map, "KP_Decimal", Misc.Xk_Kp_Decimal);  
        I (Map, "KP_Divide", Misc.Xk_Kp_Divide);  
        I (Map, "KP_0", Misc.Xk_Kp_0);  
        I (Map, "KP_1", Misc.Xk_Kp_1);  
        I (Map, "KP_2", Misc.Xk_Kp_2);  
        I (Map, "KP_3", Misc.Xk_Kp_3);  
        I (Map, "KP_4", Misc.Xk_Kp_4);  
        I (Map, "KP_5", Misc.Xk_Kp_5);  
        I (Map, "KP_6", Misc.Xk_Kp_6);  
        I (Map, "KP_7", Misc.Xk_Kp_7);  
        I (Map, "KP_8", Misc.Xk_Kp_8);  
        I (Map, "KP_9", Misc.Xk_Kp_9);  
        I (Map, "F1", Misc.Xk_F1);  
        I (Map, "F2", Misc.Xk_F2);  
        I (Map, "F3", Misc.Xk_F3);  
        I (Map, "F4", Misc.Xk_F4);  
        I (Map, "F5", Misc.Xk_F5);  
        I (Map, "F6", Misc.Xk_F6);  
        I (Map, "F7", Misc.Xk_F7);  
        I (Map, "F8", Misc.Xk_F8);  
        I (Map, "F9", Misc.Xk_F9);  
        I (Map, "F10", Misc.Xk_F10);  
        I (Map, "F11", Misc.Xk_F11);  
        I (Map, "L1", Misc.Xk_L1);  
        I (Map, "F12", Misc.Xk_F12);  
        I (Map, "L2", Misc.Xk_L2);  
        I (Map, "F13", Misc.Xk_F13);  
        I (Map, "L3", Misc.Xk_L3);  
        I (Map, "F14", Misc.Xk_F14);  
        I (Map, "L4", Misc.Xk_L4);  
        I (Map, "F15", Misc.Xk_F15);  
        I (Map, "L5", Misc.Xk_L5);  
        I (Map, "F16", Misc.Xk_F16);  
        I (Map, "L6", Misc.Xk_L6);  
        I (Map, "F17", Misc.Xk_F17);  
        I (Map, "L7", Misc.Xk_L7);  
        I (Map, "F18", Misc.Xk_F18);  
        I (Map, "L8", Misc.Xk_L8);  
        I (Map, "F19", Misc.Xk_F19);  
        I (Map, "L9", Misc.Xk_L9);  
        I (Map, "F20", Misc.Xk_F20);  
        I (Map, "L10", Misc.Xk_L10);  
        I (Map, "F21", Misc.Xk_F21);  
        I (Map, "R1", Misc.Xk_R1);  
        I (Map, "F22", Misc.Xk_F22);  
        I (Map, "R2", Misc.Xk_R2);  
        I (Map, "F23", Misc.Xk_F23);  
        I (Map, "R3", Misc.Xk_R3);  
        I (Map, "F24", Misc.Xk_F24);  
        I (Map, "R4", Misc.Xk_R4);  
        I (Map, "F25", Misc.Xk_F25);  
        I (Map, "R5", Misc.Xk_R5);  
        I (Map, "F26", Misc.Xk_F26);  
        I (Map, "R6", Misc.Xk_R6);  
        I (Map, "F27", Misc.Xk_F27);  
        I (Map, "R7", Misc.Xk_R7);  
        I (Map, "F28", Misc.Xk_F28);  
        I (Map, "R8", Misc.Xk_R8);  
        I (Map, "F29", Misc.Xk_F29);  
        I (Map, "R9", Misc.Xk_R9);  
        I (Map, "F30", Misc.Xk_F30);  
        I (Map, "R10", Misc.Xk_R10);  
        I (Map, "F31", Misc.Xk_F31);  
        I (Map, "R11", Misc.Xk_R11);  
        I (Map, "F32", Misc.Xk_F32);  
        I (Map, "R12", Misc.Xk_R12);  
        I (Map, "R13", Misc.Xk_R13);  
        I (Map, "F33", Misc.Xk_F33);  
        I (Map, "F34", Misc.Xk_F34);  
        I (Map, "R14", Misc.Xk_R14);  
        I (Map, "F35", Misc.Xk_F35);  
        I (Map, "R15", Misc.Xk_R15);  
        I (Map, "Shift_L", Misc.Xk_Shift_L);  
        I (Map, "Shift_R", Misc.Xk_Shift_R);  
        I (Map, "Control_L", Misc.Xk_Control_L);  
        I (Map, "Control_R", Misc.Xk_Control_R);  
        I (Map, "Caps_Lock", Misc.Xk_Caps_Lock);  
        I (Map, "Shift_Lock", Misc.Xk_Shift_Lock);  
        I (Map, "Meta_L", Misc.Xk_Meta_L);  
        I (Map, "Meta_R", Misc.Xk_Meta_R);  
        I (Map, "Alt_L", Misc.Xk_Alt_L);  
        I (Map, "Alt_R", Misc.Xk_Alt_R);  
        I (Map, "Super_L", Misc.Xk_Super_L);  
        I (Map, "Super_R", Misc.Xk_Super_R);  
        I (Map, "Hyper_L", Misc.Xk_Hyper_L);  
        I (Map, "Hyper_R", Misc.Xk_Hyper_R);  
        I (Map, "emspace", Publishing.Xk_Emspace);  
        I (Map, "enspace", Publishing.Xk_Enspace);  
        I (Map, "em3space", Publishing.Xk_Em3space);  
        I (Map, "em4space", Publishing.Xk_Em4space);  
        I (Map, "digitspace", Publishing.Xk_Digitspace);  
        I (Map, "punctspace", Publishing.Xk_Punctspace);  
        I (Map, "thinspace", Publishing.Xk_Thinspace);  
        I (Map, "hairspace", Publishing.Xk_Hairspace);  
        I (Map, "emdash", Publishing.Xk_Emdash);  
        I (Map, "endash", Publishing.Xk_Endash);  
        I (Map, "signifblank", Publishing.Xk_Signifblank);  
        I (Map, "ellipsis", Publishing.Xk_Ellipsis);  
        I (Map, "doubbaselinedot", Publishing.Xk_Doubbaselinedot);  
        I (Map, "onethird", Publishing.Xk_Onethird);  
        I (Map, "twothirds", Publishing.Xk_Twothirds);  
        I (Map, "onefifth", Publishing.Xk_Onefifth);  
        I (Map, "twofifths", Publishing.Xk_Twofifths);  
        I (Map, "threefifths", Publishing.Xk_Threefifths);  
        I (Map, "fourfifths", Publishing.Xk_Fourfifths);  
        I (Map, "onesixth", Publishing.Xk_Onesixth);  
        I (Map, "fivesixths", Publishing.Xk_Fivesixths);  
        I (Map, "careof", Publishing.Xk_Careof);  
        I (Map, "figdash", Publishing.Xk_Figdash);  
        I (Map, "leftanglebracket", Publishing.Xk_Leftanglebracket);  
        I (Map, "decimalpoint", Publishing.Xk_Decimalpoint);  
        I (Map, "rightanglebracket", Publishing.Xk_Rightanglebracket);  
        I (Map, "marker", Publishing.Xk_Marker);  
        I (Map, "oneeighth", Publishing.Xk_Oneeighth);  
        I (Map, "threeeighths", Publishing.Xk_Threeeighths);  
        I (Map, "fiveeighths", Publishing.Xk_Fiveeighths);  
        I (Map, "seveneighths", Publishing.Xk_Seveneighths);  
        I (Map, "trademark", Publishing.Xk_Trademark);  
        I (Map, "signaturemark", Publishing.Xk_Signaturemark);  
        I (Map, "trademarkincircle", Publishing.Xk_Trademarkincircle);  
        I (Map, "leftopentriangle", Publishing.Xk_Leftopentriangle);  
        I (Map, "rightopentriangle", Publishing.Xk_Rightopentriangle);  
        I (Map, "emopencircle", Publishing.Xk_Emopencircle);  
        I (Map, "emopenrectangle", Publishing.Xk_Emopenrectangle);  
        I (Map, "leftsinglequotemark", Publishing.Xk_Leftsinglequotemark);  
        I (Map, "rightsinglequotemark", Publishing.Xk_Rightsinglequotemark);  
        I (Map, "leftdoublequotemark", Publishing.Xk_Leftdoublequotemark);  
        I (Map, "rightdoublequotemark", Publishing.Xk_Rightdoublequotemark);  
        I (Map, "prescription", Publishing.Xk_Prescription);  
        I (Map, "minutes", Publishing.Xk_Minutes);  
        I (Map, "seconds", Publishing.Xk_Seconds);  
        I (Map, "latincross", Publishing.Xk_Latincross);  
        I (Map, "hexagram", Publishing.Xk_Hexagram);  
        I (Map, "filledrectbullet", Publishing.Xk_Filledrectbullet);  
        I (Map, "filledlefttribullet", Publishing.Xk_Filledlefttribullet);  
        I (Map, "filledrighttribullet", Publishing.Xk_Filledrighttribullet);  
        I (Map, "emfilledcircle", Publishing.Xk_Emfilledcircle);  
        I (Map, "emfilledrect", Publishing.Xk_Emfilledrect);  
        I (Map, "enopencircbullet", Publishing.Xk_Enopencircbullet);  
        I (Map, "enopensquarebullet", Publishing.Xk_Enopensquarebullet);  
        I (Map, "openrectbullet", Publishing.Xk_Openrectbullet);  
        I (Map, "opentribulletup", Publishing.Xk_Opentribulletup);  
        I (Map, "opentribulletdown", Publishing.Xk_Opentribulletdown);  
        I (Map, "openstar", Publishing.Xk_Openstar);  
        I (Map, "enfilledcircbullet", Publishing.Xk_Enfilledcircbullet);  
        I (Map, "enfilledsqbullet", Publishing.Xk_Enfilledsqbullet);  
        I (Map, "filledtribulletup", Publishing.Xk_Filledtribulletup);  
        I (Map, "filledtribulletdown", Publishing.Xk_Filledtribulletdown);  
        I (Map, "leftpointer", Publishing.Xk_Leftpointer);  
        I (Map, "rightpointer", Publishing.Xk_Rightpointer);  
        I (Map, "club", Publishing.Xk_Club);  
        I (Map, "diamond", Publishing.Xk_Diamond);  
        I (Map, "heart", Publishing.Xk_Heart);  
        I (Map, "maltesecross", Publishing.Xk_Maltesecross);  
        I (Map, "dagger", Publishing.Xk_Dagger);  
        I (Map, "doubledagger", Publishing.Xk_Doubledagger);  
        I (Map, "checkmark", Publishing.Xk_Checkmark);  
        I (Map, "ballotcross", Publishing.Xk_Ballotcross);  
        I (Map, "musicalsharp", Publishing.Xk_Musicalsharp);  
        I (Map, "musicalflat", Publishing.Xk_Musicalflat);  
        I (Map, "malesymbol", Publishing.Xk_Malesymbol);  
        I (Map, "femalesymbol", Publishing.Xk_Femalesymbol);  
        I (Map, "telephone", Publishing.Xk_Telephone);  
        I (Map, "telephonerecorder", Publishing.Xk_Telephonerecorder);  
        I (Map, "phonographcopyright", Publishing.Xk_Phonographcopyright);  
        I (Map, "caret", Publishing.Xk_Caret);  
        I (Map, "singlelowquotemark", Publishing.Xk_Singlelowquotemark);  
        I (Map, "doublelowquotemark", Publishing.Xk_Doublelowquotemark);  
        I (Map, "cursor", Publishing.Xk_Cursor);  
        I (Map, "blank", Special.Xk_Blank);  
        I (Map, "soliddiamond", Special.Xk_Soliddiamond);  
        I (Map, "checkerboard", Special.Xk_Checkerboard);  
        I (Map, "ht", Special.Xk_Ht);  
        I (Map, "ff", Special.Xk_Ff);  
        I (Map, "cr", Special.Xk_Cr);  
        I (Map, "lf", Special.Xk_Lf);  
        I (Map, "nl", Special.Xk_Nl);  
        I (Map, "vt", Special.Xk_Vt);  
        I (Map, "lowrightcorner", Special.Xk_Lowrightcorner);  
        I (Map, "uprightcorner", Special.Xk_Uprightcorner);  
        I (Map, "upleftcorner", Special.Xk_Upleftcorner);  
        I (Map, "lowleftcorner", Special.Xk_Lowleftcorner);  
        I (Map, "crossinglines", Special.Xk_Crossinglines);  
        I (Map, "horizlinescan1", Special.Xk_Horizlinescan1);  
        I (Map, "horizlinescan3", Special.Xk_Horizlinescan3);  
        I (Map, "horizlinescan5", Special.Xk_Horizlinescan5);  
        I (Map, "horizlinescan7", Special.Xk_Horizlinescan7);  
        I (Map, "horizlinescan9", Special.Xk_Horizlinescan9);  
        I (Map, "leftt", Special.Xk_Leftt);  
        I (Map, "rightt", Special.Xk_Rightt);  
        I (Map, "bott", Special.Xk_Bott);  
        I (Map, "topt", Special.Xk_Topt);  
        I (Map, "vertbar", Special.Xk_Vertbar);  
        I (Map, "leftradical", Technical.Xk_Leftradical);  
        I (Map, "topleftradical", Technical.Xk_Topleftradical);  
        I (Map, "horizconnector", Technical.Xk_Horizconnector);  
        I (Map, "topintegral", Technical.Xk_Topintegral);  
        I (Map, "botintegral", Technical.Xk_Botintegral);  
        I (Map, "vertconnector", Technical.Xk_Vertconnector);  
        I (Map, "topleftsqbracket", Technical.Xk_Topleftsqbracket);  
        I (Map, "botleftsqbracket", Technical.Xk_Botleftsqbracket);  
        I (Map, "toprightsqbracket", Technical.Xk_Toprightsqbracket);  
        I (Map, "botrightsqbracket", Technical.Xk_Botrightsqbracket);  
        I (Map, "topleftparens", Technical.Xk_Topleftparens);  
        I (Map, "botleftparens", Technical.Xk_Botleftparens);  
        I (Map, "toprightparens", Technical.Xk_Toprightparens);  
        I (Map, "botrightparens", Technical.Xk_Botrightparens);  
        I (Map, "leftmiddlecurlybrace", Technical.Xk_Leftmiddlecurlybrace);  
        I (Map, "rightmiddlecurlybrace", Technical.Xk_Rightmiddlecurlybrace);  
        I (Map, "topleftsummation", Technical.Xk_Topleftsummation);  
        I (Map, "botleftsummation", Technical.Xk_Botleftsummation);  
        I (Map, "topvertsummationconnector",  
           Technical.Xk_Topvertsummationconnector);  
        I (Map, "botvertsummationconnector",  
           Technical.Xk_Botvertsummationconnector);  
        I (Map, "toprightsummation", Technical.Xk_Toprightsummation);  
        I (Map, "botrightsummation", Technical.Xk_Botrightsummation);  
        I (Map, "rightmiddlesummation", Technical.Xk_Rightmiddlesummation);  
        I (Map, "lessthanequal", Technical.Xk_Lessthanequal);  
        I (Map, "notequal", Technical.Xk_Notequal);  
        I (Map, "greaterthanequal", Technical.Xk_Greaterthanequal);  
        I (Map, "integral", Technical.Xk_Integral);  
        I (Map, "therefore", Technical.Xk_Therefore);  
        I (Map, "variation", Technical.Xk_Variation);  
        I (Map, "infinity", Technical.Xk_Infinity);  
        I (Map, "nabla", Technical.Xk_Nabla);  
        I (Map, "approximate", Technical.Xk_Approximate);  
        I (Map, "similarequal", Technical.Xk_Similarequal);  
        I (Map, "ifonlyif", Technical.Xk_Ifonlyif);  
        I (Map, "implies", Technical.Xk_Implies);  
        I (Map, "identical", Technical.Xk_Identical);  
        I (Map, "radical", Technical.Xk_Radical);  
        I (Map, "includedin", Technical.Xk_Includedin);  
        I (Map, "includes", Technical.Xk_Includes);  
        I (Map, "intersection", Technical.Xk_Intersection);  
        I (Map, "union", Technical.Xk_Union);  
        I (Map, "logicaland", Technical.Xk_Logicaland);  
        I (Map, "logicalor", Technical.Xk_Logicalor);  
        I (Map, "partialderivative", Technical.Xk_Partialderivative);  
        I (Map, "function", Technical.Xk_Function);  
        I (Map, "leftarrow", Technical.Xk_Leftarrow);  
        I (Map, "uparrow", Technical.Xk_Uparrow);  
        I (Map, "rightarrow", Technical.Xk_Rightarrow);  
        I (Map, "downarrow", Technical.Xk_Downarrow);

    end Init_Ks_Info_Names;
--\x0c
    procedure Initialize_Ks_Info_Map is
------------------------------------------------------------------------------
-- Initialize an empty X_Lib_Ks_Info_map.  Lock the mutex, init the names,
-- init the site names, unlock the mutex, return.
------------------------------------------------------------------------------
        use X_Ks_Info_Map;  
    begin

----Lock the mutex, then make sure that we really have something to do.  We
--  may be the 2nd simultaneous task to attempt this.  No need to do it twice.

        Lock_Mutex (Mutex);  
        if X_Lib_Ks_Info_Map /= None_Map then  
            Unlock_Mutex (Mutex);       -- Some other task beat us to it.
            return;  
        end if;

----Init the map, trap exceptions.

        begin  
            Init_Ks_Info_Names;  
            Init_Ks_Info_File;  
        exception  
            when others =>  
                Unlock_Mutex (Mutex);  
                X_Report_Exception ("XlibError",  
                                    "UnexpException",  
                                    "Unexpected exception during: %1" & Lf &  
                                       "Exception: %6",  
                                    "Initialize_Ks_Info_Map");  
                return;  
        end;

----All done.

        Unlock_Mutex (Mutex);

    end Initialize_Ks_Info_Map;

--\x0c
end Xlbp_Key;  

E3 Meta Data

    nblk1=68
    nid=68
    hdr6=ce
        [0x00] rec0=2c rec1=00 rec2=01 rec3=02c
        [0x01] rec0=11 rec1=00 rec2=02 rec3=05e
        [0x02] rec0=13 rec1=00 rec2=03 rec3=072
        [0x03] rec0=15 rec1=00 rec2=04 rec3=04a
        [0x04] rec0=1c rec1=00 rec2=05 rec3=082
        [0x05] rec0=14 rec1=00 rec2=06 rec3=046
        [0x06] rec0=00 rec1=00 rec2=67 rec3=006
        [0x07] rec0=18 rec1=00 rec2=07 rec3=018
        [0x08] rec0=18 rec1=00 rec2=08 rec3=012
        [0x09] rec0=1c rec1=00 rec2=09 rec3=03c
        [0x0a] rec0=00 rec1=00 rec2=66 rec3=024
        [0x0b] rec0=1c rec1=00 rec2=0a rec3=060
        [0x0c] rec0=00 rec1=00 rec2=65 rec3=004
        [0x0d] rec0=17 rec1=00 rec2=0b rec3=03a
        [0x0e] rec0=20 rec1=00 rec2=0c rec3=052
        [0x0f] rec0=00 rec1=00 rec2=64 rec3=026
        [0x10] rec0=1a rec1=00 rec2=0d rec3=02a
        [0x11] rec0=1c rec1=00 rec2=0e rec3=042
        [0x12] rec0=20 rec1=00 rec2=0f rec3=070
        [0x13] rec0=1c rec1=00 rec2=10 rec3=004
        [0x14] rec0=24 rec1=00 rec2=11 rec3=014
        [0x15] rec0=00 rec1=00 rec2=63 rec3=006
        [0x16] rec0=1b rec1=00 rec2=12 rec3=00c
        [0x17] rec0=00 rec1=00 rec2=61 rec3=00c
        [0x18] rec0=19 rec1=00 rec2=62 rec3=066
        [0x19] rec0=01 rec1=00 rec2=13 rec3=026
        [0x1a] rec0=1a rec1=00 rec2=14 rec3=03c
        [0x1b] rec0=1b rec1=00 rec2=15 rec3=038
        [0x1c] rec0=1a rec1=00 rec2=16 rec3=036
        [0x1d] rec0=1b rec1=00 rec2=17 rec3=004
        [0x1e] rec0=00 rec1=00 rec2=60 rec3=01c
        [0x1f] rec0=1a rec1=00 rec2=18 rec3=02e
        [0x20] rec0=18 rec1=00 rec2=19 rec3=012
        [0x21] rec0=18 rec1=00 rec2=1a rec3=04e
        [0x22] rec0=00 rec1=00 rec2=5f rec3=04c
        [0x23] rec0=1b rec1=00 rec2=1b rec3=046
        [0x24] rec0=01 rec1=00 rec2=5e rec3=008
        [0x25] rec0=1b rec1=00 rec2=1c rec3=00c
        [0x26] rec0=01 rec1=00 rec2=5d rec3=02e
        [0x27] rec0=1e rec1=00 rec2=1d rec3=086
        [0x28] rec0=1c rec1=00 rec2=1e rec3=01c
        [0x29] rec0=00 rec1=00 rec2=5c rec3=01c
        [0x2a] rec0=17 rec1=00 rec2=1f rec3=062
        [0x2b] rec0=1a rec1=00 rec2=20 rec3=020
        [0x2c] rec0=00 rec1=00 rec2=5b rec3=012
        [0x2d] rec0=22 rec1=00 rec2=21 rec3=01a
        [0x2e] rec0=00 rec1=00 rec2=5a rec3=008
        [0x2f] rec0=1e rec1=00 rec2=22 rec3=02c
        [0x30] rec0=1c rec1=00 rec2=23 rec3=02c
        [0x31] rec0=1f rec1=00 rec2=24 rec3=088
        [0x32] rec0=18 rec1=00 rec2=25 rec3=042
        [0x33] rec0=0f rec1=00 rec2=26 rec3=06a
        [0x34] rec0=12 rec1=00 rec2=27 rec3=02c
        [0x35] rec0=10 rec1=00 rec2=28 rec3=066
        [0x36] rec0=10 rec1=00 rec2=29 rec3=064
        [0x37] rec0=10 rec1=00 rec2=2a rec3=032
        [0x38] rec0=10 rec1=00 rec2=2b rec3=074
        [0x39] rec0=10 rec1=00 rec2=2c rec3=07c
        [0x3a] rec0=11 rec1=00 rec2=2d rec3=006
        [0x3b] rec0=0f rec1=00 rec2=2e rec3=018
        [0x3c] rec0=0e rec1=00 rec2=2f rec3=00e
        [0x3d] rec0=10 rec1=00 rec2=30 rec3=03a
        [0x3e] rec0=12 rec1=00 rec2=31 rec3=010
        [0x3f] rec0=11 rec1=00 rec2=32 rec3=05a
        [0x40] rec0=12 rec1=00 rec2=33 rec3=00a
        [0x41] rec0=10 rec1=00 rec2=34 rec3=04c
        [0x42] rec0=12 rec1=00 rec2=35 rec3=012
        [0x43] rec0=12 rec1=00 rec2=36 rec3=06c
        [0x44] rec0=14 rec1=00 rec2=37 rec3=00c
        [0x45] rec0=12 rec1=00 rec2=38 rec3=05e
        [0x46] rec0=17 rec1=00 rec2=39 rec3=02e
        [0x47] rec0=18 rec1=00 rec2=3a rec3=044
        [0x48] rec0=18 rec1=00 rec2=3b rec3=002
        [0x49] rec0=16 rec1=00 rec2=3c rec3=03c
        [0x4a] rec0=13 rec1=00 rec2=3d rec3=034
        [0x4b] rec0=12 rec1=00 rec2=3e rec3=074
        [0x4c] rec0=13 rec1=00 rec2=3f rec3=04e
        [0x4d] rec0=14 rec1=00 rec2=40 rec3=040
        [0x4e] rec0=14 rec1=00 rec2=41 rec3=01a
        [0x4f] rec0=14 rec1=00 rec2=42 rec3=008
        [0x50] rec0=13 rec1=00 rec2=43 rec3=03c
        [0x51] rec0=13 rec1=00 rec2=44 rec3=058
        [0x52] rec0=13 rec1=00 rec2=45 rec3=010
        [0x53] rec0=13 rec1=00 rec2=46 rec3=048
        [0x54] rec0=14 rec1=00 rec2=47 rec3=054
        [0x55] rec0=14 rec1=00 rec2=48 rec3=020
        [0x56] rec0=16 rec1=00 rec2=49 rec3=04a
        [0x57] rec0=15 rec1=00 rec2=4a rec3=026
        [0x58] rec0=19 rec1=00 rec2=4b rec3=03a
        [0x59] rec0=1a rec1=00 rec2=4c rec3=008
        [0x5a] rec0=16 rec1=00 rec2=4d rec3=054
        [0x5b] rec0=13 rec1=00 rec2=4e rec3=01e
        [0x5c] rec0=10 rec1=00 rec2=4f rec3=078
        [0x5d] rec0=0f rec1=00 rec2=50 rec3=036
        [0x5e] rec0=0f rec1=00 rec2=51 rec3=00a
        [0x5f] rec0=10 rec1=00 rec2=52 rec3=024
        [0x60] rec0=12 rec1=00 rec2=53 rec3=012
        [0x61] rec0=11 rec1=00 rec2=54 rec3=004
        [0x62] rec0=0e rec1=00 rec2=55 rec3=046
        [0x63] rec0=11 rec1=00 rec2=56 rec3=010
    tail 0x217006d94819782d94f97 0x42a00088462063203
Free Block Chain:
  0x68: 0000  00 00 09 80 2b 80 01 b0 05 80 ac 20 00 b2 00 7f  ┆    +           ┆