1 /* 2 * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 * This file was originally generated by a tool that embedded much of 28 * an X11 keysym header file, keysym2ucs.h, turned into a Java program, 29 * and which also consumed an UnicodeData.txt database file. 30 * keysym2ucs.h and a genhash.awk script were checked in alongside this 31 * source file. Maintaining the Java program to match updated versions 32 * of keysym2ucs.h is too burdensome, since it is rarely, needed and any 33 * updates will be minimal, so they have been removed and 34 * this file can now be hand maintained. If it ever becomes necessary 35 * to re-generate it, then the deleted files can be recovered from 36 * the history. 37 */ 38 39 package sun.awt.X11; 40 import java.util.Hashtable; 41 import jdk.internal.misc.Unsafe; 42 43 import sun.util.logging.PlatformLogger; 44 45 public class XKeysym { 46 XKeysym()47 private XKeysym() {} 48 49 static class Keysym2JavaKeycode { 50 int jkeycode; 51 int keyLocation; getJavaKeycode()52 int getJavaKeycode() { 53 return jkeycode; 54 } getKeyLocation()55 int getKeyLocation() { 56 return keyLocation; 57 } Keysym2JavaKeycode(int jk, int loc)58 Keysym2JavaKeycode(int jk, int loc) { 59 jkeycode = jk; 60 keyLocation = loc; 61 } 62 }; 63 private static Unsafe unsafe = XlibWrapper.unsafe; 64 static Hashtable<Long, Keysym2JavaKeycode> keysym2JavaKeycodeHash = new Hashtable<Long, Keysym2JavaKeycode>(); 65 static Hashtable<Long, Character> keysym2UCSHash = new Hashtable<Long, Character>(); 66 static Hashtable<Long, Long> uppercaseHash = new Hashtable<Long, Long>(); 67 // TODO: or not to do: add reverse lookup javakeycode2keysym, 68 // for robot only it seems to me. After that, we can remove lookup table 69 // from XWindow.c altogether. 70 // Another use for reverse lookup: query keyboard state, for some keys. 71 static Hashtable<Integer, Long> javaKeycode2KeysymHash = new Hashtable<Integer, Long>(); 72 static long keysym_lowercase = unsafe.allocateMemory(Native.getLongSize()); 73 static long keysym_uppercase = unsafe.allocateMemory(Native.getLongSize()); 74 static Keysym2JavaKeycode kanaLock = new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KANA_LOCK, 75 java.awt.event.KeyEvent.KEY_LOCATION_STANDARD); 76 private static PlatformLogger keyEventLog = PlatformLogger.getLogger("sun.awt.X11.key.XKeysym"); convertKeysym( long ks, int state )77 public static char convertKeysym( long ks, int state ) { 78 79 /* First check for Latin-1 characters (1:1 mapping) */ 80 if ((ks >= 0x0020 && ks <= 0x007e) || 81 (ks >= 0x00a0 && ks <= 0x00ff)) { 82 if( (state & XConstants.ControlMask) != 0 ) { 83 if ((ks >= 'A' && ks <= ']') || (ks == '_') || 84 (ks >= 'a' && ks <='z')) { 85 ks &= 0x1F; 86 } 87 } 88 return (char)ks; 89 } 90 91 /* XXX: Also check for directly encoded 24-bit UCS characters: 92 */ 93 if ((ks & 0xff000000) == 0x01000000) 94 return (char)(ks & 0x00ffffff); 95 96 Character ch = keysym2UCSHash.get(ks); 97 return ch == null ? (char)0 : ch.charValue(); 98 } xkeycode2keysym_noxkb(XKeyEvent ev, int ndx)99 static long xkeycode2keysym_noxkb(XKeyEvent ev, int ndx) { 100 XToolkit.awtLock(); 101 try { 102 return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx); 103 } finally { 104 XToolkit.awtUnlock(); 105 } 106 } xkeycode2keysym_xkb(XKeyEvent ev, int ndx)107 static long xkeycode2keysym_xkb(XKeyEvent ev, int ndx) { 108 XToolkit.awtLock(); 109 try { 110 int mods = ev.get_state(); 111 if ((ndx == 0) && ((mods & XConstants.ShiftMask) != 0)) { 112 // I don't know all possible meanings of 'ndx' in case of XKB 113 // and don't want to speculate. But this particular case 114 // clearly means that caller needs a so called primary keysym. 115 mods ^= XConstants.ShiftMask; 116 } 117 long kbdDesc = XToolkit.getXKBKbdDesc(); 118 if( kbdDesc != 0 ) { 119 XlibWrapper.XkbTranslateKeyCode(kbdDesc, ev.get_keycode(), 120 mods, XlibWrapper.iarg1, XlibWrapper.larg3); 121 }else{ 122 // xkb resources already gone 123 keyEventLog.fine("Thread race: Toolkit shutdown before the end of a key event processing."); 124 return 0; 125 } 126 //XXX unconsumed modifiers? 127 return Native.getLong(XlibWrapper.larg3); 128 } finally { 129 XToolkit.awtUnlock(); 130 } 131 } xkeycode2keysym(XKeyEvent ev, int ndx)132 static long xkeycode2keysym(XKeyEvent ev, int ndx) { 133 XToolkit.awtLock(); 134 try { 135 if (XToolkit.canUseXKBCalls()) { 136 return xkeycode2keysym_xkb(ev, ndx); 137 }else{ 138 return xkeycode2keysym_noxkb(ev, ndx); 139 } 140 } finally { 141 XToolkit.awtUnlock(); 142 } 143 } xkeycode2primary_keysym(XKeyEvent ev)144 static long xkeycode2primary_keysym(XKeyEvent ev) { 145 return xkeycode2keysym(ev, 0); 146 } isKPEvent( XKeyEvent ev )147 public static boolean isKPEvent( XKeyEvent ev ) 148 { 149 // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event. 150 // Otherwise, it is [1]. 151 int ndx = XToolkit.isXsunKPBehavior() && 152 ! XToolkit.isXKBenabled() ? 2 : 1; 153 // Even if XKB is enabled, we have another problem: some symbol tables (e.g. cz) force 154 // a regular comma instead of KP_comma for a decimal separator. Result is, 155 // bugs like 6454041. So, we will try for keypadness a keysym with ndx==0 as well. 156 XToolkit.awtLock(); 157 try { 158 return (XlibWrapper.IsKeypadKey( 159 XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx ) ) || 160 XlibWrapper.IsKeypadKey( 161 XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), 0 ) )); 162 } finally { 163 XToolkit.awtUnlock(); 164 } 165 } 166 /** 167 Return uppercase keysym correspondent to a given keysym. 168 If input keysym does not belong to any lower/uppercase pair, return -1. 169 */ getUppercaseAlphabetic( long keysym )170 public static long getUppercaseAlphabetic( long keysym ) { 171 long lc = -1; 172 long uc = -1; 173 Long stored = uppercaseHash.get(keysym); 174 if (stored != null ) { 175 return stored.longValue(); 176 } 177 XToolkit.awtLock(); 178 try { 179 XlibWrapper.XConvertCase(keysym, keysym_lowercase, keysym_uppercase); 180 lc = Native.getLong(keysym_lowercase); 181 uc = Native.getLong(keysym_uppercase); 182 if (lc == uc) { 183 //not applicable 184 uc = -1; 185 } 186 uppercaseHash.put(keysym, uc); 187 } finally { 188 XToolkit.awtUnlock(); 189 } 190 return uc; 191 } 192 /** 193 Get a keypad keysym derived from a keycode. 194 I do not check if this is a keypad event, I just presume it. 195 */ getKeypadKeysym( XKeyEvent ev )196 private static long getKeypadKeysym( XKeyEvent ev ) { 197 int ndx = 0; 198 long keysym = XConstants.NoSymbol; 199 if( XToolkit.isXsunKPBehavior() && 200 ! XToolkit.isXKBenabled() ) { 201 if( (ev.get_state() & XConstants.ShiftMask) != 0 ) { // shift modifier is on 202 ndx = 3; 203 keysym = xkeycode2keysym(ev, ndx); 204 } else { 205 ndx = 2; 206 keysym = xkeycode2keysym(ev, ndx); 207 } 208 } else { 209 if( (ev.get_state() & XConstants.ShiftMask) != 0 || // shift modifier is on 210 ((ev.get_state() & XConstants.LockMask) != 0 && // lock modifier is on 211 (XToolkit.modLockIsShiftLock != 0)) ) { // it is interpreted as ShiftLock 212 ndx = 0; 213 keysym = xkeycode2keysym(ev, ndx); 214 } else { 215 ndx = 1; 216 keysym = xkeycode2keysym(ev, ndx); 217 } 218 } 219 return keysym; 220 } 221 222 /** 223 Return java.awt.KeyEvent constant meaning (Java) keycode, derived from X keysym. 224 Some keysyms maps to more than one keycode, these would require extra processing. 225 */ getJavaKeycode( long keysym )226 static Keysym2JavaKeycode getJavaKeycode( long keysym ) { 227 if(keysym == XKeySymConstants.XK_Mode_switch){ 228 /* XK_Mode_switch on solaris maps either to VK_ALT_GRAPH (default) or VK_KANA_LOCK */ 229 if( XToolkit.isKanaKeyboard() ) { 230 return kanaLock; 231 } 232 }else if(keysym == XKeySymConstants.XK_L1){ 233 /* if it is Sun keyboard, trick hash to return VK_STOP else VK_F11 (default) */ 234 if( XToolkit.isSunKeyboard() ) { 235 keysym = XKeySymConstants.SunXK_Stop; 236 } 237 }else if(keysym == XKeySymConstants.XK_L2) { 238 /* if it is Sun keyboard, trick hash to return VK_AGAIN else VK_F12 (default) */ 239 if( XToolkit.isSunKeyboard() ) { 240 keysym = XKeySymConstants.SunXK_Again; 241 } 242 } 243 244 return keysym2JavaKeycodeHash.get( keysym ); 245 } 246 /** 247 Return java.awt.KeyEvent constant meaning (Java) keycode, derived from X Window KeyEvent. 248 Algorithm is, extract via XKeycodeToKeysym a proper keysym according to Xlib spec rules and 249 err exceptions, then search a java keycode in a table. 250 */ getJavaKeycode( XKeyEvent ev )251 static Keysym2JavaKeycode getJavaKeycode( XKeyEvent ev ) { 252 // get from keysym2JavaKeycodeHash. 253 long keysym = XConstants.NoSymbol; 254 int ndx = 0; 255 if( (ev.get_state() & XToolkit.numLockMask) != 0 && 256 isKPEvent(ev)) { 257 keysym = getKeypadKeysym( ev ); 258 } else { 259 // we only need primary-layer keysym to derive a java keycode. 260 ndx = 0; 261 keysym = xkeycode2keysym(ev, ndx); 262 } 263 264 Keysym2JavaKeycode jkc = getJavaKeycode( keysym ); 265 return jkc; 266 } getJavaKeycodeOnly( XKeyEvent ev )267 static int getJavaKeycodeOnly( XKeyEvent ev ) { 268 Keysym2JavaKeycode jkc = getJavaKeycode( ev ); 269 return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); 270 } 271 /** 272 * Return an integer java keycode apprx as it was before extending keycodes range. 273 * This call would ignore for instance XKB and process whatever is on the bottom 274 * of keysym stack. Result will not depend on actual locale, will differ between 275 * dual/multiple keyboard setup systems (e.g. English+Russian vs French+Russian) 276 * but will be someway compatible with old releases. 277 */ getLegacyJavaKeycodeOnly( XKeyEvent ev )278 static int getLegacyJavaKeycodeOnly( XKeyEvent ev ) { 279 long keysym = XConstants.NoSymbol; 280 int ndx = 0; 281 if( (ev.get_state() & XToolkit.numLockMask) != 0 && 282 isKPEvent(ev)) { 283 keysym = getKeypadKeysym( ev ); 284 } else { 285 // we only need primary-layer keysym to derive a java keycode. 286 ndx = 0; 287 keysym = xkeycode2keysym_noxkb(ev, ndx); 288 } 289 Keysym2JavaKeycode jkc = getJavaKeycode( keysym ); 290 return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); 291 } javaKeycode2Keysym( int jkey )292 static long javaKeycode2Keysym( int jkey ) { 293 Long ks = javaKeycode2KeysymHash.get( jkey ); 294 return (ks == null ? 0 : ks.longValue()); 295 } 296 /** 297 Return keysym derived from a keycode and modifiers. 298 Usually an input method does this. However non-system input methods (e.g. Java IMs) do not. 299 For rules, see "Xlib - C Language X Interface", 300 MIT X Consortium Standard 301 X Version 11, Release 6 302 Ch. 12.7 303 XXX TODO: or maybe not to do: process Mode Lock and therefore 304 not only 0-th and 1-st but 2-nd and 3-rd keysyms for a keystroke. 305 */ getKeysym( XKeyEvent ev )306 static long getKeysym( XKeyEvent ev ) { 307 long keysym = XConstants.NoSymbol; 308 long uppercaseKeysym = XConstants.NoSymbol; 309 int ndx = 0; 310 boolean getUppercase = false; 311 if ((ev.get_state() & XToolkit.numLockMask) != 0 && 312 isKPEvent(ev)) { 313 keysym = getKeypadKeysym( ev ); 314 } else { 315 // XXX: at this point, anything in keysym[23] is ignored. 316 // 317 // Shift & Lock are off ===> ndx = 0; 318 // Shift off & Lock on & Lock is CapsLock ===> ndx = 0; 319 // if keysym[ndx] is lowecase alphabetic, then corresp. uppercase used. 320 // Shift on & Lock on & Lock is CapsLock ===> ndx == 1; 321 // if keysym[ndx] is lowecase alphabetic, then corresp. uppercase used. 322 // Shift on || (Lock on & Lock is ShiftLock) ===> ndx = 1. 323 if ((ev.get_state() & XConstants.ShiftMask) == 0) { // shift is off 324 if ((ev.get_state() & XConstants.LockMask) == 0 ) { // lock is off 325 ndx = 0; 326 getUppercase = false; 327 } else if ((ev.get_state() & XConstants.LockMask) != 0 && // lock is on 328 (XToolkit.modLockIsShiftLock == 0)) { // lock is capslock 329 ndx = 0; 330 getUppercase = true; 331 } else if ((ev.get_state() & XConstants.LockMask) != 0 && // lock is on 332 (XToolkit.modLockIsShiftLock != 0)) { // lock is shift lock 333 ndx = 1; 334 getUppercase = false; 335 } 336 } else { // shift on 337 if ((ev.get_state() & XConstants.LockMask) != 0 && // lock is on 338 (XToolkit.modLockIsShiftLock == 0)) { // lock is capslock 339 ndx = 1; 340 getUppercase = true; 341 } else { 342 ndx = 1; 343 getUppercase = false; 344 } 345 } 346 keysym = xkeycode2keysym(ev, ndx); 347 if (getUppercase && (uppercaseKeysym = getUppercaseAlphabetic( keysym )) != -1) { 348 keysym = uppercaseKeysym; 349 } 350 } 351 return keysym; 352 } 353 354 static { keysym2UCSHash.put(long)0xFF08, (char)0x0008355 keysym2UCSHash.put( (long)0xFF08, (char)0x0008); // XK_BackSpace --> <control> keysym2UCSHash.put(long)0xFF09, (char)0x0009356 keysym2UCSHash.put( (long)0xFF09, (char)0x0009); // XK_Tab --> <control> keysym2UCSHash.put(long)0xFF0A, (char)0x000a357 keysym2UCSHash.put( (long)0xFF0A, (char)0x000a); // XK_Linefeed --> <control> keysym2UCSHash.put(long)0xFF0B, (char)0x000b358 keysym2UCSHash.put( (long)0xFF0B, (char)0x000b); // XK_Clear --> <control> keysym2UCSHash.put(long)0xFF0D, (char)0x000a359 keysym2UCSHash.put( (long)0xFF0D, (char)0x000a); // XK_Return --> <control> keysym2UCSHash.put(long)0xFF1B, (char)0x001B360 keysym2UCSHash.put( (long)0xFF1B, (char)0x001B); // XK_Escape --> <control> keysym2UCSHash.put(long)0xFFFF, (char)0x007F361 keysym2UCSHash.put( (long)0xFFFF, (char)0x007F); // XK_Delete --> <control> keysym2UCSHash.put(long)0xFF80, (char)0x0020362 keysym2UCSHash.put( (long)0xFF80, (char)0x0020); // XK_KP_Space --> SPACE keysym2UCSHash.put(long)0xFF89, (char)0x0009363 keysym2UCSHash.put( (long)0xFF89, (char)0x0009); // XK_KP_Tab --> <control> keysym2UCSHash.put(long)0xFF8D, (char)0x000A364 keysym2UCSHash.put( (long)0xFF8D, (char)0x000A); // XK_KP_Enter --> <control> keysym2UCSHash.put(long)0xFF9F, (char)0x007F365 keysym2UCSHash.put( (long)0xFF9F, (char)0x007F); // XK_KP_Delete --> <control> keysym2UCSHash.put(long)0xFFBD, (char)0x003d366 keysym2UCSHash.put( (long)0xFFBD, (char)0x003d); // XK_KP_Equal --> EQUALS SIGN keysym2UCSHash.put(long)0xFFAA, (char)0x002a367 keysym2UCSHash.put( (long)0xFFAA, (char)0x002a); // XK_KP_Multiply --> ASTERISK keysym2UCSHash.put(long)0xFFAB, (char)0x002b368 keysym2UCSHash.put( (long)0xFFAB, (char)0x002b); // XK_KP_Add --> PLUS SIGN keysym2UCSHash.put(long)0xFFAC, (char)0x002c369 keysym2UCSHash.put( (long)0xFFAC, (char)0x002c); // XK_KP_Separator --> COMMA keysym2UCSHash.put(long)0xFFAD, (char)0x002d370 keysym2UCSHash.put( (long)0xFFAD, (char)0x002d); // XK_KP_Subtract --> HYPHEN-MINUS keysym2UCSHash.put(long)0xFFAE, (char)0x002e371 keysym2UCSHash.put( (long)0xFFAE, (char)0x002e); // XK_KP_Decimal --> FULL STOP keysym2UCSHash.put(long)0xFFAF, (char)0x002f372 keysym2UCSHash.put( (long)0xFFAF, (char)0x002f); // XK_KP_Divide --> SOLIDUS keysym2UCSHash.put(long)0xFFB0, (char)0x0030373 keysym2UCSHash.put( (long)0xFFB0, (char)0x0030); // XK_KP_0 --> DIGIT ZERO keysym2UCSHash.put(long)0xFFB1, (char)0x0031374 keysym2UCSHash.put( (long)0xFFB1, (char)0x0031); // XK_KP_1 --> DIGIT ONE keysym2UCSHash.put(long)0xFFB2, (char)0x0032375 keysym2UCSHash.put( (long)0xFFB2, (char)0x0032); // XK_KP_2 --> DIGIT TWO keysym2UCSHash.put(long)0xFFB3, (char)0x0033376 keysym2UCSHash.put( (long)0xFFB3, (char)0x0033); // XK_KP_3 --> DIGIT THREE keysym2UCSHash.put(long)0xFFB4, (char)0x0034377 keysym2UCSHash.put( (long)0xFFB4, (char)0x0034); // XK_KP_4 --> DIGIT FOUR keysym2UCSHash.put(long)0xFFB5, (char)0x0035378 keysym2UCSHash.put( (long)0xFFB5, (char)0x0035); // XK_KP_5 --> DIGIT FIVE keysym2UCSHash.put(long)0xFFB6, (char)0x0036379 keysym2UCSHash.put( (long)0xFFB6, (char)0x0036); // XK_KP_6 --> DIGIT SIX keysym2UCSHash.put(long)0xFFB7, (char)0x0037380 keysym2UCSHash.put( (long)0xFFB7, (char)0x0037); // XK_KP_7 --> DIGIT SEVEN keysym2UCSHash.put(long)0xFFB8, (char)0x0038381 keysym2UCSHash.put( (long)0xFFB8, (char)0x0038); // XK_KP_8 --> DIGIT EIGHT keysym2UCSHash.put(long)0xFFB9, (char)0x0039382 keysym2UCSHash.put( (long)0xFFB9, (char)0x0039); // XK_KP_9 --> DIGIT NINE keysym2UCSHash.put(long)0xFE20, (char)0x0009383 keysym2UCSHash.put( (long)0xFE20, (char)0x0009); // XK_ISO_Left_Tab --> <control> keysym2UCSHash.put(long)0xFE50, (char)0x02CB384 keysym2UCSHash.put( (long)0xFE50, (char)0x02CB); // XK_dead_grave --> MODIFIER LETTER GRAVE ACCENT keysym2UCSHash.put(long)0xFE51, (char)0x02CA385 keysym2UCSHash.put( (long)0xFE51, (char)0x02CA); // XK_dead_acute --> MODIFIER LETTER ACUTE ACCENT keysym2UCSHash.put(long)0xFE52, (char)0x02C6386 keysym2UCSHash.put( (long)0xFE52, (char)0x02C6); // XK_dead_circumflex --> MODIFIER LETTER CIRCUMFLEX ACCENT keysym2UCSHash.put(long)0xFE53, (char)0x02DC387 keysym2UCSHash.put( (long)0xFE53, (char)0x02DC); // XK_dead_tilde --> SMALL TILDE keysym2UCSHash.put(long)0xFE54, (char)0x02C9388 keysym2UCSHash.put( (long)0xFE54, (char)0x02C9); // XK_dead_macron --> MODIFIER LETTER MACRON keysym2UCSHash.put(long)0xFE55, (char)0x02D8389 keysym2UCSHash.put( (long)0xFE55, (char)0x02D8); // XK_dead_breve --> BREVE keysym2UCSHash.put(long)0xFE56, (char)0x02D9390 keysym2UCSHash.put( (long)0xFE56, (char)0x02D9); // XK_dead_abovedot --> DOT ABOVE keysym2UCSHash.put(long)0xFE57, (char)0x00A8391 keysym2UCSHash.put( (long)0xFE57, (char)0x00A8); // XK_dead_diaeresis --> DIAERESIS keysym2UCSHash.put(long)0xFE58, (char)0x02DA392 keysym2UCSHash.put( (long)0xFE58, (char)0x02DA); // XK_dead_abovering --> RING ABOVE keysym2UCSHash.put(long)0xFE59, (char)0x02DD393 keysym2UCSHash.put( (long)0xFE59, (char)0x02DD); // XK_dead_doubleacute --> DOUBLE ACUTE ACCENT keysym2UCSHash.put(long)0xFE5A, (char)0x02C7394 keysym2UCSHash.put( (long)0xFE5A, (char)0x02C7); // XK_dead_caron --> CARON keysym2UCSHash.put(long)0xFE5B, (char)0x00B8395 keysym2UCSHash.put( (long)0xFE5B, (char)0x00B8); // XK_dead_cedilla --> CEDILLA keysym2UCSHash.put(long)0xFE5C, (char)0x02DB396 keysym2UCSHash.put( (long)0xFE5C, (char)0x02DB); // XK_dead_ogonek --> OGONEK keysym2UCSHash.put(long)0xFE5D, (char)0x0269397 keysym2UCSHash.put( (long)0xFE5D, (char)0x0269); // XK_dead_iota --> LATIN SMALL LETTER IOTA keysym2UCSHash.put(long)0xFE5E, (char)0x3099398 keysym2UCSHash.put( (long)0xFE5E, (char)0x3099); // XK_dead_voiced_sound --> COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK keysym2UCSHash.put(long)0xFE5F, (char)0x309A399 keysym2UCSHash.put( (long)0xFE5F, (char)0x309A); // XK_dead_semivoiced_sound --> COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK keysym2UCSHash.put(long)0xFE60, (char)0x0323400 keysym2UCSHash.put( (long)0xFE60, (char)0x0323); // XK_dead_belowdot --> COMBINING DOT BELOW keysym2UCSHash.put(long)0xFE61, (char)0x0321401 keysym2UCSHash.put( (long)0xFE61, (char)0x0321); // XK_dead_hook --> COMBINING PALATALIZED HOOK BELOW keysym2UCSHash.put(long)0xFE62, (char)0x031B402 keysym2UCSHash.put( (long)0xFE62, (char)0x031B); // XK_dead_horn --> COMBINING HORN keysym2UCSHash.put(long)0x1a1, (char)0x0104403 keysym2UCSHash.put( (long)0x1a1, (char)0x0104); // XK_Aogonek --> LATIN CAPITAL LETTER A WITH OGONEK keysym2UCSHash.put(long)0x1a2, (char)0x02d8404 keysym2UCSHash.put( (long)0x1a2, (char)0x02d8); // XK_breve --> BREVE keysym2UCSHash.put(long)0x1a3, (char)0x0141405 keysym2UCSHash.put( (long)0x1a3, (char)0x0141); // XK_Lstroke --> LATIN CAPITAL LETTER L WITH STROKE keysym2UCSHash.put(long)0x1a5, (char)0x013d406 keysym2UCSHash.put( (long)0x1a5, (char)0x013d); // XK_Lcaron --> LATIN CAPITAL LETTER L WITH CARON keysym2UCSHash.put(long)0x1a6, (char)0x015a407 keysym2UCSHash.put( (long)0x1a6, (char)0x015a); // XK_Sacute --> LATIN CAPITAL LETTER S WITH ACUTE keysym2UCSHash.put(long)0x1a9, (char)0x0160408 keysym2UCSHash.put( (long)0x1a9, (char)0x0160); // XK_Scaron --> LATIN CAPITAL LETTER S WITH CARON keysym2UCSHash.put(long)0x1aa, (char)0x015e409 keysym2UCSHash.put( (long)0x1aa, (char)0x015e); // XK_Scedilla --> LATIN CAPITAL LETTER S WITH CEDILLA keysym2UCSHash.put(long)0x1ab, (char)0x0164410 keysym2UCSHash.put( (long)0x1ab, (char)0x0164); // XK_Tcaron --> LATIN CAPITAL LETTER T WITH CARON keysym2UCSHash.put(long)0x1ac, (char)0x0179411 keysym2UCSHash.put( (long)0x1ac, (char)0x0179); // XK_Zacute --> LATIN CAPITAL LETTER Z WITH ACUTE keysym2UCSHash.put(long)0x1ae, (char)0x017d412 keysym2UCSHash.put( (long)0x1ae, (char)0x017d); // XK_Zcaron --> LATIN CAPITAL LETTER Z WITH CARON keysym2UCSHash.put(long)0x1af, (char)0x017b413 keysym2UCSHash.put( (long)0x1af, (char)0x017b); // XK_Zabovedot --> LATIN CAPITAL LETTER Z WITH DOT ABOVE keysym2UCSHash.put(long)0x1b1, (char)0x0105414 keysym2UCSHash.put( (long)0x1b1, (char)0x0105); // XK_aogonek --> LATIN SMALL LETTER A WITH OGONEK keysym2UCSHash.put(long)0x1b2, (char)0x02db415 keysym2UCSHash.put( (long)0x1b2, (char)0x02db); // XK_ogonek --> OGONEK keysym2UCSHash.put(long)0x1b3, (char)0x0142416 keysym2UCSHash.put( (long)0x1b3, (char)0x0142); // XK_lstroke --> LATIN SMALL LETTER L WITH STROKE keysym2UCSHash.put(long)0x1b5, (char)0x013e417 keysym2UCSHash.put( (long)0x1b5, (char)0x013e); // XK_lcaron --> LATIN SMALL LETTER L WITH CARON keysym2UCSHash.put(long)0x1b6, (char)0x015b418 keysym2UCSHash.put( (long)0x1b6, (char)0x015b); // XK_sacute --> LATIN SMALL LETTER S WITH ACUTE keysym2UCSHash.put(long)0x1b7, (char)0x02c7419 keysym2UCSHash.put( (long)0x1b7, (char)0x02c7); // XK_caron --> CARON keysym2UCSHash.put(long)0x1b9, (char)0x0161420 keysym2UCSHash.put( (long)0x1b9, (char)0x0161); // XK_scaron --> LATIN SMALL LETTER S WITH CARON keysym2UCSHash.put(long)0x1ba, (char)0x015f421 keysym2UCSHash.put( (long)0x1ba, (char)0x015f); // XK_scedilla --> LATIN SMALL LETTER S WITH CEDILLA keysym2UCSHash.put(long)0x1bb, (char)0x0165422 keysym2UCSHash.put( (long)0x1bb, (char)0x0165); // XK_tcaron --> LATIN SMALL LETTER T WITH CARON keysym2UCSHash.put(long)0x1bc, (char)0x017a423 keysym2UCSHash.put( (long)0x1bc, (char)0x017a); // XK_zacute --> LATIN SMALL LETTER Z WITH ACUTE keysym2UCSHash.put(long)0x1bd, (char)0x02dd424 keysym2UCSHash.put( (long)0x1bd, (char)0x02dd); // XK_doubleacute --> DOUBLE ACUTE ACCENT keysym2UCSHash.put(long)0x1be, (char)0x017e425 keysym2UCSHash.put( (long)0x1be, (char)0x017e); // XK_zcaron --> LATIN SMALL LETTER Z WITH CARON keysym2UCSHash.put(long)0x1bf, (char)0x017c426 keysym2UCSHash.put( (long)0x1bf, (char)0x017c); // XK_zabovedot --> LATIN SMALL LETTER Z WITH DOT ABOVE keysym2UCSHash.put(long)0x1c0, (char)0x0154427 keysym2UCSHash.put( (long)0x1c0, (char)0x0154); // XK_Racute --> LATIN CAPITAL LETTER R WITH ACUTE keysym2UCSHash.put(long)0x1c3, (char)0x0102428 keysym2UCSHash.put( (long)0x1c3, (char)0x0102); // XK_Abreve --> LATIN CAPITAL LETTER A WITH BREVE keysym2UCSHash.put(long)0x1c5, (char)0x0139429 keysym2UCSHash.put( (long)0x1c5, (char)0x0139); // XK_Lacute --> LATIN CAPITAL LETTER L WITH ACUTE keysym2UCSHash.put(long)0x1c6, (char)0x0106430 keysym2UCSHash.put( (long)0x1c6, (char)0x0106); // XK_Cacute --> LATIN CAPITAL LETTER C WITH ACUTE keysym2UCSHash.put(long)0x1c8, (char)0x010c431 keysym2UCSHash.put( (long)0x1c8, (char)0x010c); // XK_Ccaron --> LATIN CAPITAL LETTER C WITH CARON keysym2UCSHash.put(long)0x1ca, (char)0x0118432 keysym2UCSHash.put( (long)0x1ca, (char)0x0118); // XK_Eogonek --> LATIN CAPITAL LETTER E WITH OGONEK keysym2UCSHash.put(long)0x1cc, (char)0x011a433 keysym2UCSHash.put( (long)0x1cc, (char)0x011a); // XK_Ecaron --> LATIN CAPITAL LETTER E WITH CARON keysym2UCSHash.put(long)0x1cf, (char)0x010e434 keysym2UCSHash.put( (long)0x1cf, (char)0x010e); // XK_Dcaron --> LATIN CAPITAL LETTER D WITH CARON keysym2UCSHash.put(long)0x1d0, (char)0x0110435 keysym2UCSHash.put( (long)0x1d0, (char)0x0110); // XK_Dstroke --> LATIN CAPITAL LETTER D WITH STROKE keysym2UCSHash.put(long)0x1d1, (char)0x0143436 keysym2UCSHash.put( (long)0x1d1, (char)0x0143); // XK_Nacute --> LATIN CAPITAL LETTER N WITH ACUTE keysym2UCSHash.put(long)0x1d2, (char)0x0147437 keysym2UCSHash.put( (long)0x1d2, (char)0x0147); // XK_Ncaron --> LATIN CAPITAL LETTER N WITH CARON keysym2UCSHash.put(long)0x1d5, (char)0x0150438 keysym2UCSHash.put( (long)0x1d5, (char)0x0150); // XK_Odoubleacute --> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE keysym2UCSHash.put(long)0x1d8, (char)0x0158439 keysym2UCSHash.put( (long)0x1d8, (char)0x0158); // XK_Rcaron --> LATIN CAPITAL LETTER R WITH CARON keysym2UCSHash.put(long)0x1d9, (char)0x016e440 keysym2UCSHash.put( (long)0x1d9, (char)0x016e); // XK_Uring --> LATIN CAPITAL LETTER U WITH RING ABOVE keysym2UCSHash.put(long)0x1db, (char)0x0170441 keysym2UCSHash.put( (long)0x1db, (char)0x0170); // XK_Udoubleacute --> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE keysym2UCSHash.put(long)0x1de, (char)0x0162442 keysym2UCSHash.put( (long)0x1de, (char)0x0162); // XK_Tcedilla --> LATIN CAPITAL LETTER T WITH CEDILLA keysym2UCSHash.put(long)0x1e0, (char)0x0155443 keysym2UCSHash.put( (long)0x1e0, (char)0x0155); // XK_racute --> LATIN SMALL LETTER R WITH ACUTE keysym2UCSHash.put(long)0x1e3, (char)0x0103444 keysym2UCSHash.put( (long)0x1e3, (char)0x0103); // XK_abreve --> LATIN SMALL LETTER A WITH BREVE keysym2UCSHash.put(long)0x1e5, (char)0x013a445 keysym2UCSHash.put( (long)0x1e5, (char)0x013a); // XK_lacute --> LATIN SMALL LETTER L WITH ACUTE keysym2UCSHash.put(long)0x1e6, (char)0x0107446 keysym2UCSHash.put( (long)0x1e6, (char)0x0107); // XK_cacute --> LATIN SMALL LETTER C WITH ACUTE keysym2UCSHash.put(long)0x1e8, (char)0x010d447 keysym2UCSHash.put( (long)0x1e8, (char)0x010d); // XK_ccaron --> LATIN SMALL LETTER C WITH CARON keysym2UCSHash.put(long)0x1ea, (char)0x0119448 keysym2UCSHash.put( (long)0x1ea, (char)0x0119); // XK_eogonek --> LATIN SMALL LETTER E WITH OGONEK keysym2UCSHash.put(long)0x1ec, (char)0x011b449 keysym2UCSHash.put( (long)0x1ec, (char)0x011b); // XK_ecaron --> LATIN SMALL LETTER E WITH CARON keysym2UCSHash.put(long)0x1ef, (char)0x010f450 keysym2UCSHash.put( (long)0x1ef, (char)0x010f); // XK_dcaron --> LATIN SMALL LETTER D WITH CARON keysym2UCSHash.put(long)0x1f0, (char)0x0111451 keysym2UCSHash.put( (long)0x1f0, (char)0x0111); // XK_dstroke --> LATIN SMALL LETTER D WITH STROKE keysym2UCSHash.put(long)0x1f1, (char)0x0144452 keysym2UCSHash.put( (long)0x1f1, (char)0x0144); // XK_nacute --> LATIN SMALL LETTER N WITH ACUTE keysym2UCSHash.put(long)0x1f2, (char)0x0148453 keysym2UCSHash.put( (long)0x1f2, (char)0x0148); // XK_ncaron --> LATIN SMALL LETTER N WITH CARON keysym2UCSHash.put(long)0x1f5, (char)0x0151454 keysym2UCSHash.put( (long)0x1f5, (char)0x0151); // XK_odoubleacute --> LATIN SMALL LETTER O WITH DOUBLE ACUTE keysym2UCSHash.put(long)0x1fb, (char)0x0171455 keysym2UCSHash.put( (long)0x1fb, (char)0x0171); // XK_udoubleacute --> LATIN SMALL LETTER U WITH DOUBLE ACUTE keysym2UCSHash.put(long)0x1f8, (char)0x0159456 keysym2UCSHash.put( (long)0x1f8, (char)0x0159); // XK_rcaron --> LATIN SMALL LETTER R WITH CARON keysym2UCSHash.put(long)0x1f9, (char)0x016f457 keysym2UCSHash.put( (long)0x1f9, (char)0x016f); // XK_uring --> LATIN SMALL LETTER U WITH RING ABOVE keysym2UCSHash.put(long)0x1fe, (char)0x0163458 keysym2UCSHash.put( (long)0x1fe, (char)0x0163); // XK_tcedilla --> LATIN SMALL LETTER T WITH CEDILLA keysym2UCSHash.put(long)0x1ff, (char)0x02d9459 keysym2UCSHash.put( (long)0x1ff, (char)0x02d9); // XK_abovedot --> DOT ABOVE keysym2UCSHash.put(long)0x2a1, (char)0x0126460 keysym2UCSHash.put( (long)0x2a1, (char)0x0126); // XK_Hstroke --> LATIN CAPITAL LETTER H WITH STROKE keysym2UCSHash.put(long)0x2a6, (char)0x0124461 keysym2UCSHash.put( (long)0x2a6, (char)0x0124); // XK_Hcircumflex --> LATIN CAPITAL LETTER H WITH CIRCUMFLEX keysym2UCSHash.put(long)0x2a9, (char)0x0130462 keysym2UCSHash.put( (long)0x2a9, (char)0x0130); // XK_Iabovedot --> LATIN CAPITAL LETTER I WITH DOT ABOVE keysym2UCSHash.put(long)0x2ab, (char)0x011e463 keysym2UCSHash.put( (long)0x2ab, (char)0x011e); // XK_Gbreve --> LATIN CAPITAL LETTER G WITH BREVE keysym2UCSHash.put(long)0x2ac, (char)0x0134464 keysym2UCSHash.put( (long)0x2ac, (char)0x0134); // XK_Jcircumflex --> LATIN CAPITAL LETTER J WITH CIRCUMFLEX keysym2UCSHash.put(long)0x2b1, (char)0x0127465 keysym2UCSHash.put( (long)0x2b1, (char)0x0127); // XK_hstroke --> LATIN SMALL LETTER H WITH STROKE keysym2UCSHash.put(long)0x2b6, (char)0x0125466 keysym2UCSHash.put( (long)0x2b6, (char)0x0125); // XK_hcircumflex --> LATIN SMALL LETTER H WITH CIRCUMFLEX keysym2UCSHash.put(long)0x2b9, (char)0x0131467 keysym2UCSHash.put( (long)0x2b9, (char)0x0131); // XK_idotless --> LATIN SMALL LETTER DOTLESS I keysym2UCSHash.put(long)0x2bb, (char)0x011f468 keysym2UCSHash.put( (long)0x2bb, (char)0x011f); // XK_gbreve --> LATIN SMALL LETTER G WITH BREVE keysym2UCSHash.put(long)0x2bc, (char)0x0135469 keysym2UCSHash.put( (long)0x2bc, (char)0x0135); // XK_jcircumflex --> LATIN SMALL LETTER J WITH CIRCUMFLEX keysym2UCSHash.put(long)0x2c5, (char)0x010a470 keysym2UCSHash.put( (long)0x2c5, (char)0x010a); // XK_Cabovedot --> LATIN CAPITAL LETTER C WITH DOT ABOVE keysym2UCSHash.put(long)0x2c6, (char)0x0108471 keysym2UCSHash.put( (long)0x2c6, (char)0x0108); // XK_Ccircumflex --> LATIN CAPITAL LETTER C WITH CIRCUMFLEX keysym2UCSHash.put(long)0x2d5, (char)0x0120472 keysym2UCSHash.put( (long)0x2d5, (char)0x0120); // XK_Gabovedot --> LATIN CAPITAL LETTER G WITH DOT ABOVE keysym2UCSHash.put(long)0x2d8, (char)0x011c473 keysym2UCSHash.put( (long)0x2d8, (char)0x011c); // XK_Gcircumflex --> LATIN CAPITAL LETTER G WITH CIRCUMFLEX keysym2UCSHash.put(long)0x2dd, (char)0x016c474 keysym2UCSHash.put( (long)0x2dd, (char)0x016c); // XK_Ubreve --> LATIN CAPITAL LETTER U WITH BREVE keysym2UCSHash.put(long)0x2de, (char)0x015c475 keysym2UCSHash.put( (long)0x2de, (char)0x015c); // XK_Scircumflex --> LATIN CAPITAL LETTER S WITH CIRCUMFLEX keysym2UCSHash.put(long)0x2e5, (char)0x010b476 keysym2UCSHash.put( (long)0x2e5, (char)0x010b); // XK_cabovedot --> LATIN SMALL LETTER C WITH DOT ABOVE keysym2UCSHash.put(long)0x2e6, (char)0x0109477 keysym2UCSHash.put( (long)0x2e6, (char)0x0109); // XK_ccircumflex --> LATIN SMALL LETTER C WITH CIRCUMFLEX keysym2UCSHash.put(long)0x2f5, (char)0x0121478 keysym2UCSHash.put( (long)0x2f5, (char)0x0121); // XK_gabovedot --> LATIN SMALL LETTER G WITH DOT ABOVE keysym2UCSHash.put(long)0x2f8, (char)0x011d479 keysym2UCSHash.put( (long)0x2f8, (char)0x011d); // XK_gcircumflex --> LATIN SMALL LETTER G WITH CIRCUMFLEX keysym2UCSHash.put(long)0x2fd, (char)0x016d480 keysym2UCSHash.put( (long)0x2fd, (char)0x016d); // XK_ubreve --> LATIN SMALL LETTER U WITH BREVE keysym2UCSHash.put(long)0x2fe, (char)0x015d481 keysym2UCSHash.put( (long)0x2fe, (char)0x015d); // XK_scircumflex --> LATIN SMALL LETTER S WITH CIRCUMFLEX keysym2UCSHash.put(long)0x3a2, (char)0x0138482 keysym2UCSHash.put( (long)0x3a2, (char)0x0138); // XK_kra --> LATIN SMALL LETTER KRA keysym2UCSHash.put(long)0x3a3, (char)0x0156483 keysym2UCSHash.put( (long)0x3a3, (char)0x0156); // XK_Rcedilla --> LATIN CAPITAL LETTER R WITH CEDILLA keysym2UCSHash.put(long)0x3a5, (char)0x0128484 keysym2UCSHash.put( (long)0x3a5, (char)0x0128); // XK_Itilde --> LATIN CAPITAL LETTER I WITH TILDE keysym2UCSHash.put(long)0x3a6, (char)0x013b485 keysym2UCSHash.put( (long)0x3a6, (char)0x013b); // XK_Lcedilla --> LATIN CAPITAL LETTER L WITH CEDILLA keysym2UCSHash.put(long)0x3aa, (char)0x0112486 keysym2UCSHash.put( (long)0x3aa, (char)0x0112); // XK_Emacron --> LATIN CAPITAL LETTER E WITH MACRON keysym2UCSHash.put(long)0x3ab, (char)0x0122487 keysym2UCSHash.put( (long)0x3ab, (char)0x0122); // XK_Gcedilla --> LATIN CAPITAL LETTER G WITH CEDILLA keysym2UCSHash.put(long)0x3ac, (char)0x0166488 keysym2UCSHash.put( (long)0x3ac, (char)0x0166); // XK_Tslash --> LATIN CAPITAL LETTER T WITH STROKE keysym2UCSHash.put(long)0x3b3, (char)0x0157489 keysym2UCSHash.put( (long)0x3b3, (char)0x0157); // XK_rcedilla --> LATIN SMALL LETTER R WITH CEDILLA keysym2UCSHash.put(long)0x3b5, (char)0x0129490 keysym2UCSHash.put( (long)0x3b5, (char)0x0129); // XK_itilde --> LATIN SMALL LETTER I WITH TILDE keysym2UCSHash.put(long)0x3b6, (char)0x013c491 keysym2UCSHash.put( (long)0x3b6, (char)0x013c); // XK_lcedilla --> LATIN SMALL LETTER L WITH CEDILLA keysym2UCSHash.put(long)0x3ba, (char)0x0113492 keysym2UCSHash.put( (long)0x3ba, (char)0x0113); // XK_emacron --> LATIN SMALL LETTER E WITH MACRON keysym2UCSHash.put(long)0x3bb, (char)0x0123493 keysym2UCSHash.put( (long)0x3bb, (char)0x0123); // XK_gcedilla --> LATIN SMALL LETTER G WITH CEDILLA keysym2UCSHash.put(long)0x3bc, (char)0x0167494 keysym2UCSHash.put( (long)0x3bc, (char)0x0167); // XK_tslash --> LATIN SMALL LETTER T WITH STROKE keysym2UCSHash.put(long)0x3bd, (char)0x014a495 keysym2UCSHash.put( (long)0x3bd, (char)0x014a); // XK_ENG --> LATIN CAPITAL LETTER ENG keysym2UCSHash.put(long)0x3bf, (char)0x014b496 keysym2UCSHash.put( (long)0x3bf, (char)0x014b); // XK_eng --> LATIN SMALL LETTER ENG keysym2UCSHash.put(long)0x3c0, (char)0x0100497 keysym2UCSHash.put( (long)0x3c0, (char)0x0100); // XK_Amacron --> LATIN CAPITAL LETTER A WITH MACRON keysym2UCSHash.put(long)0x3c7, (char)0x012e498 keysym2UCSHash.put( (long)0x3c7, (char)0x012e); // XK_Iogonek --> LATIN CAPITAL LETTER I WITH OGONEK keysym2UCSHash.put(long)0x3cc, (char)0x0116499 keysym2UCSHash.put( (long)0x3cc, (char)0x0116); // XK_Eabovedot --> LATIN CAPITAL LETTER E WITH DOT ABOVE keysym2UCSHash.put(long)0x3cf, (char)0x012a500 keysym2UCSHash.put( (long)0x3cf, (char)0x012a); // XK_Imacron --> LATIN CAPITAL LETTER I WITH MACRON keysym2UCSHash.put(long)0x3d1, (char)0x0145501 keysym2UCSHash.put( (long)0x3d1, (char)0x0145); // XK_Ncedilla --> LATIN CAPITAL LETTER N WITH CEDILLA keysym2UCSHash.put(long)0x3d2, (char)0x014c502 keysym2UCSHash.put( (long)0x3d2, (char)0x014c); // XK_Omacron --> LATIN CAPITAL LETTER O WITH MACRON keysym2UCSHash.put(long)0x3d3, (char)0x0136503 keysym2UCSHash.put( (long)0x3d3, (char)0x0136); // XK_Kcedilla --> LATIN CAPITAL LETTER K WITH CEDILLA keysym2UCSHash.put(long)0x3d9, (char)0x0172504 keysym2UCSHash.put( (long)0x3d9, (char)0x0172); // XK_Uogonek --> LATIN CAPITAL LETTER U WITH OGONEK keysym2UCSHash.put(long)0x3dd, (char)0x0168505 keysym2UCSHash.put( (long)0x3dd, (char)0x0168); // XK_Utilde --> LATIN CAPITAL LETTER U WITH TILDE keysym2UCSHash.put(long)0x3de, (char)0x016a506 keysym2UCSHash.put( (long)0x3de, (char)0x016a); // XK_Umacron --> LATIN CAPITAL LETTER U WITH MACRON keysym2UCSHash.put(long)0x3e0, (char)0x0101507 keysym2UCSHash.put( (long)0x3e0, (char)0x0101); // XK_amacron --> LATIN SMALL LETTER A WITH MACRON keysym2UCSHash.put(long)0x3e7, (char)0x012f508 keysym2UCSHash.put( (long)0x3e7, (char)0x012f); // XK_iogonek --> LATIN SMALL LETTER I WITH OGONEK keysym2UCSHash.put(long)0x3ec, (char)0x0117509 keysym2UCSHash.put( (long)0x3ec, (char)0x0117); // XK_eabovedot --> LATIN SMALL LETTER E WITH DOT ABOVE keysym2UCSHash.put(long)0x3ef, (char)0x012b510 keysym2UCSHash.put( (long)0x3ef, (char)0x012b); // XK_imacron --> LATIN SMALL LETTER I WITH MACRON keysym2UCSHash.put(long)0x3f1, (char)0x0146511 keysym2UCSHash.put( (long)0x3f1, (char)0x0146); // XK_ncedilla --> LATIN SMALL LETTER N WITH CEDILLA keysym2UCSHash.put(long)0x3f2, (char)0x014d512 keysym2UCSHash.put( (long)0x3f2, (char)0x014d); // XK_omacron --> LATIN SMALL LETTER O WITH MACRON keysym2UCSHash.put(long)0x3f3, (char)0x0137513 keysym2UCSHash.put( (long)0x3f3, (char)0x0137); // XK_kcedilla --> LATIN SMALL LETTER K WITH CEDILLA keysym2UCSHash.put(long)0x3f9, (char)0x0173514 keysym2UCSHash.put( (long)0x3f9, (char)0x0173); // XK_uogonek --> LATIN SMALL LETTER U WITH OGONEK keysym2UCSHash.put(long)0x3fd, (char)0x0169515 keysym2UCSHash.put( (long)0x3fd, (char)0x0169); // XK_utilde --> LATIN SMALL LETTER U WITH TILDE keysym2UCSHash.put(long)0x3fe, (char)0x016b516 keysym2UCSHash.put( (long)0x3fe, (char)0x016b); // XK_umacron --> LATIN SMALL LETTER U WITH MACRON keysym2UCSHash.put(long)0x12a1, (char)0x1e02517 keysym2UCSHash.put( (long)0x12a1, (char)0x1e02); // XK_Babovedot --> LATIN CAPITAL LETTER B WITH DOT ABOVE keysym2UCSHash.put(long)0x12a2, (char)0x1e03518 keysym2UCSHash.put( (long)0x12a2, (char)0x1e03); // XK_babovedot --> LATIN SMALL LETTER B WITH DOT ABOVE keysym2UCSHash.put(long)0x12a6, (char)0x1e0a519 keysym2UCSHash.put( (long)0x12a6, (char)0x1e0a); // XK_Dabovedot --> LATIN CAPITAL LETTER D WITH DOT ABOVE keysym2UCSHash.put(long)0x12a8, (char)0x1e80520 keysym2UCSHash.put( (long)0x12a8, (char)0x1e80); // XK_Wgrave --> LATIN CAPITAL LETTER W WITH GRAVE keysym2UCSHash.put(long)0x12aa, (char)0x1e82521 keysym2UCSHash.put( (long)0x12aa, (char)0x1e82); // XK_Wacute --> LATIN CAPITAL LETTER W WITH ACUTE keysym2UCSHash.put(long)0x12ab, (char)0x1e0b522 keysym2UCSHash.put( (long)0x12ab, (char)0x1e0b); // XK_dabovedot --> LATIN SMALL LETTER D WITH DOT ABOVE keysym2UCSHash.put(long)0x12ac, (char)0x1ef2523 keysym2UCSHash.put( (long)0x12ac, (char)0x1ef2); // XK_Ygrave --> LATIN CAPITAL LETTER Y WITH GRAVE keysym2UCSHash.put(long)0x12b0, (char)0x1e1e524 keysym2UCSHash.put( (long)0x12b0, (char)0x1e1e); // XK_Fabovedot --> LATIN CAPITAL LETTER F WITH DOT ABOVE keysym2UCSHash.put(long)0x12b1, (char)0x1e1f525 keysym2UCSHash.put( (long)0x12b1, (char)0x1e1f); // XK_fabovedot --> LATIN SMALL LETTER F WITH DOT ABOVE keysym2UCSHash.put(long)0x12b4, (char)0x1e40526 keysym2UCSHash.put( (long)0x12b4, (char)0x1e40); // XK_Mabovedot --> LATIN CAPITAL LETTER M WITH DOT ABOVE keysym2UCSHash.put(long)0x12b5, (char)0x1e41527 keysym2UCSHash.put( (long)0x12b5, (char)0x1e41); // XK_mabovedot --> LATIN SMALL LETTER M WITH DOT ABOVE keysym2UCSHash.put(long)0x12b7, (char)0x1e56528 keysym2UCSHash.put( (long)0x12b7, (char)0x1e56); // XK_Pabovedot --> LATIN CAPITAL LETTER P WITH DOT ABOVE keysym2UCSHash.put(long)0x12b8, (char)0x1e81529 keysym2UCSHash.put( (long)0x12b8, (char)0x1e81); // XK_wgrave --> LATIN SMALL LETTER W WITH GRAVE keysym2UCSHash.put(long)0x12b9, (char)0x1e57530 keysym2UCSHash.put( (long)0x12b9, (char)0x1e57); // XK_pabovedot --> LATIN SMALL LETTER P WITH DOT ABOVE keysym2UCSHash.put(long)0x12ba, (char)0x1e83531 keysym2UCSHash.put( (long)0x12ba, (char)0x1e83); // XK_wacute --> LATIN SMALL LETTER W WITH ACUTE keysym2UCSHash.put(long)0x12bb, (char)0x1e60532 keysym2UCSHash.put( (long)0x12bb, (char)0x1e60); // XK_Sabovedot --> LATIN CAPITAL LETTER S WITH DOT ABOVE keysym2UCSHash.put(long)0x12bc, (char)0x1ef3533 keysym2UCSHash.put( (long)0x12bc, (char)0x1ef3); // XK_ygrave --> LATIN SMALL LETTER Y WITH GRAVE keysym2UCSHash.put(long)0x12bd, (char)0x1e84534 keysym2UCSHash.put( (long)0x12bd, (char)0x1e84); // XK_Wdiaeresis --> LATIN CAPITAL LETTER W WITH DIAERESIS keysym2UCSHash.put(long)0x12be, (char)0x1e85535 keysym2UCSHash.put( (long)0x12be, (char)0x1e85); // XK_wdiaeresis --> LATIN SMALL LETTER W WITH DIAERESIS keysym2UCSHash.put(long)0x12bf, (char)0x1e61536 keysym2UCSHash.put( (long)0x12bf, (char)0x1e61); // XK_sabovedot --> LATIN SMALL LETTER S WITH DOT ABOVE keysym2UCSHash.put(long)0x12d0, (char)0x017537 keysym2UCSHash.put( (long)0x12d0, (char)0x017); // XK_Wcircumflex --> keysym2UCSHash.put(long)0x12d7, (char)0x1e6a538 keysym2UCSHash.put( (long)0x12d7, (char)0x1e6a); // XK_Tabovedot --> LATIN CAPITAL LETTER T WITH DOT ABOVE keysym2UCSHash.put(long)0x12de, (char)0x0176539 keysym2UCSHash.put( (long)0x12de, (char)0x0176); // XK_Ycircumflex --> LATIN CAPITAL LETTER Y WITH CIRCUMFLEX keysym2UCSHash.put(long)0x12f0, (char)0x0175540 keysym2UCSHash.put( (long)0x12f0, (char)0x0175); // XK_wcircumflex --> LATIN SMALL LETTER W WITH CIRCUMFLEX keysym2UCSHash.put(long)0x12f7, (char)0x1e6b541 keysym2UCSHash.put( (long)0x12f7, (char)0x1e6b); // XK_tabovedot --> LATIN SMALL LETTER T WITH DOT ABOVE keysym2UCSHash.put(long)0x12fe, (char)0x0177542 keysym2UCSHash.put( (long)0x12fe, (char)0x0177); // XK_ycircumflex --> LATIN SMALL LETTER Y WITH CIRCUMFLEX keysym2UCSHash.put(long)0x13bc, (char)0x0152543 keysym2UCSHash.put( (long)0x13bc, (char)0x0152); // XK_OE --> LATIN CAPITAL LIGATURE OE keysym2UCSHash.put(long)0x13bd, (char)0x0153544 keysym2UCSHash.put( (long)0x13bd, (char)0x0153); // XK_oe --> LATIN SMALL LIGATURE OE keysym2UCSHash.put(long)0x13be, (char)0x0178545 keysym2UCSHash.put( (long)0x13be, (char)0x0178); // XK_Ydiaeresis --> LATIN CAPITAL LETTER Y WITH DIAERESIS keysym2UCSHash.put(long)0x47e, (char)0x203e546 keysym2UCSHash.put( (long)0x47e, (char)0x203e); // XK_overline --> OVERLINE keysym2UCSHash.put(long)0x4a1, (char)0x3002547 keysym2UCSHash.put( (long)0x4a1, (char)0x3002); // XK_kana_fullstop --> IDEOGRAPHIC FULL STOP keysym2UCSHash.put(long)0x4a2, (char)0x300c548 keysym2UCSHash.put( (long)0x4a2, (char)0x300c); // XK_kana_openingbracket --> LEFT CORNER BRACKET keysym2UCSHash.put(long)0x4a3, (char)0x300d549 keysym2UCSHash.put( (long)0x4a3, (char)0x300d); // XK_kana_closingbracket --> RIGHT CORNER BRACKET keysym2UCSHash.put(long)0x4a4, (char)0x3001550 keysym2UCSHash.put( (long)0x4a4, (char)0x3001); // XK_kana_comma --> IDEOGRAPHIC COMMA keysym2UCSHash.put(long)0x4a5, (char)0x30fb551 keysym2UCSHash.put( (long)0x4a5, (char)0x30fb); // XK_kana_conjunctive --> KATAKANA MIDDLE DOT keysym2UCSHash.put(long)0x4a6, (char)0x30f2552 keysym2UCSHash.put( (long)0x4a6, (char)0x30f2); // XK_kana_WO --> KATAKANA LETTER WO keysym2UCSHash.put(long)0x4a7, (char)0x30a1553 keysym2UCSHash.put( (long)0x4a7, (char)0x30a1); // XK_kana_a --> KATAKANA LETTER SMALL A keysym2UCSHash.put(long)0x4a8, (char)0x30a3554 keysym2UCSHash.put( (long)0x4a8, (char)0x30a3); // XK_kana_i --> KATAKANA LETTER SMALL I keysym2UCSHash.put(long)0x4a9, (char)0x30a5555 keysym2UCSHash.put( (long)0x4a9, (char)0x30a5); // XK_kana_u --> KATAKANA LETTER SMALL U keysym2UCSHash.put(long)0x4aa, (char)0x30a7556 keysym2UCSHash.put( (long)0x4aa, (char)0x30a7); // XK_kana_e --> KATAKANA LETTER SMALL E keysym2UCSHash.put(long)0x4ab, (char)0x30a9557 keysym2UCSHash.put( (long)0x4ab, (char)0x30a9); // XK_kana_o --> KATAKANA LETTER SMALL O keysym2UCSHash.put(long)0x4ac, (char)0x30e3558 keysym2UCSHash.put( (long)0x4ac, (char)0x30e3); // XK_kana_ya --> KATAKANA LETTER SMALL YA keysym2UCSHash.put(long)0x4ad, (char)0x30e5559 keysym2UCSHash.put( (long)0x4ad, (char)0x30e5); // XK_kana_yu --> KATAKANA LETTER SMALL YU keysym2UCSHash.put(long)0x4ae, (char)0x30e7560 keysym2UCSHash.put( (long)0x4ae, (char)0x30e7); // XK_kana_yo --> KATAKANA LETTER SMALL YO keysym2UCSHash.put(long)0x4af, (char)0x30c3561 keysym2UCSHash.put( (long)0x4af, (char)0x30c3); // XK_kana_tsu --> KATAKANA LETTER SMALL TU keysym2UCSHash.put(long)0x4b0, (char)0x30fc562 keysym2UCSHash.put( (long)0x4b0, (char)0x30fc); // XK_prolongedsound --> KATAKANA-HIRAGANA PROLONGED SOUND MARK keysym2UCSHash.put(long)0x4b1, (char)0x30a2563 keysym2UCSHash.put( (long)0x4b1, (char)0x30a2); // XK_kana_A --> KATAKANA LETTER A keysym2UCSHash.put(long)0x4b2, (char)0x30a4564 keysym2UCSHash.put( (long)0x4b2, (char)0x30a4); // XK_kana_I --> KATAKANA LETTER I keysym2UCSHash.put(long)0x4b3, (char)0x30a6565 keysym2UCSHash.put( (long)0x4b3, (char)0x30a6); // XK_kana_U --> KATAKANA LETTER U keysym2UCSHash.put(long)0x4b4, (char)0x30a8566 keysym2UCSHash.put( (long)0x4b4, (char)0x30a8); // XK_kana_E --> KATAKANA LETTER E keysym2UCSHash.put(long)0x4b5, (char)0x30aa567 keysym2UCSHash.put( (long)0x4b5, (char)0x30aa); // XK_kana_O --> KATAKANA LETTER O keysym2UCSHash.put(long)0x4b6, (char)0x30ab568 keysym2UCSHash.put( (long)0x4b6, (char)0x30ab); // XK_kana_KA --> KATAKANA LETTER KA keysym2UCSHash.put(long)0x4b7, (char)0x30ad569 keysym2UCSHash.put( (long)0x4b7, (char)0x30ad); // XK_kana_KI --> KATAKANA LETTER KI keysym2UCSHash.put(long)0x4b8, (char)0x30af570 keysym2UCSHash.put( (long)0x4b8, (char)0x30af); // XK_kana_KU --> KATAKANA LETTER KU keysym2UCSHash.put(long)0x4b9, (char)0x30b1571 keysym2UCSHash.put( (long)0x4b9, (char)0x30b1); // XK_kana_KE --> KATAKANA LETTER KE keysym2UCSHash.put(long)0x4ba, (char)0x30b3572 keysym2UCSHash.put( (long)0x4ba, (char)0x30b3); // XK_kana_KO --> KATAKANA LETTER KO keysym2UCSHash.put(long)0x4bb, (char)0x30b5573 keysym2UCSHash.put( (long)0x4bb, (char)0x30b5); // XK_kana_SA --> KATAKANA LETTER SA keysym2UCSHash.put(long)0x4bc, (char)0x30b7574 keysym2UCSHash.put( (long)0x4bc, (char)0x30b7); // XK_kana_SHI --> KATAKANA LETTER SI keysym2UCSHash.put(long)0x4bd, (char)0x30b9575 keysym2UCSHash.put( (long)0x4bd, (char)0x30b9); // XK_kana_SU --> KATAKANA LETTER SU keysym2UCSHash.put(long)0x4be, (char)0x30bb576 keysym2UCSHash.put( (long)0x4be, (char)0x30bb); // XK_kana_SE --> KATAKANA LETTER SE keysym2UCSHash.put(long)0x4bf, (char)0x30bd577 keysym2UCSHash.put( (long)0x4bf, (char)0x30bd); // XK_kana_SO --> KATAKANA LETTER SO keysym2UCSHash.put(long)0x4c0, (char)0x30bf578 keysym2UCSHash.put( (long)0x4c0, (char)0x30bf); // XK_kana_TA --> KATAKANA LETTER TA keysym2UCSHash.put(long)0x4c1, (char)0x30c1579 keysym2UCSHash.put( (long)0x4c1, (char)0x30c1); // XK_kana_CHI --> KATAKANA LETTER TI keysym2UCSHash.put(long)0x4c2, (char)0x30c4580 keysym2UCSHash.put( (long)0x4c2, (char)0x30c4); // XK_kana_TSU --> KATAKANA LETTER TU keysym2UCSHash.put(long)0x4c3, (char)0x30c6581 keysym2UCSHash.put( (long)0x4c3, (char)0x30c6); // XK_kana_TE --> KATAKANA LETTER TE keysym2UCSHash.put(long)0x4c4, (char)0x30c8582 keysym2UCSHash.put( (long)0x4c4, (char)0x30c8); // XK_kana_TO --> KATAKANA LETTER TO keysym2UCSHash.put(long)0x4c5, (char)0x30ca583 keysym2UCSHash.put( (long)0x4c5, (char)0x30ca); // XK_kana_NA --> KATAKANA LETTER NA keysym2UCSHash.put(long)0x4c6, (char)0x30cb584 keysym2UCSHash.put( (long)0x4c6, (char)0x30cb); // XK_kana_NI --> KATAKANA LETTER NI keysym2UCSHash.put(long)0x4c7, (char)0x30cc585 keysym2UCSHash.put( (long)0x4c7, (char)0x30cc); // XK_kana_NU --> KATAKANA LETTER NU keysym2UCSHash.put(long)0x4c8, (char)0x30cd586 keysym2UCSHash.put( (long)0x4c8, (char)0x30cd); // XK_kana_NE --> KATAKANA LETTER NE keysym2UCSHash.put(long)0x4c9, (char)0x30ce587 keysym2UCSHash.put( (long)0x4c9, (char)0x30ce); // XK_kana_NO --> KATAKANA LETTER NO keysym2UCSHash.put(long)0x4ca, (char)0x30cf588 keysym2UCSHash.put( (long)0x4ca, (char)0x30cf); // XK_kana_HA --> KATAKANA LETTER HA keysym2UCSHash.put(long)0x4cb, (char)0x30d2589 keysym2UCSHash.put( (long)0x4cb, (char)0x30d2); // XK_kana_HI --> KATAKANA LETTER HI keysym2UCSHash.put(long)0x4cc, (char)0x30d5590 keysym2UCSHash.put( (long)0x4cc, (char)0x30d5); // XK_kana_FU --> KATAKANA LETTER HU keysym2UCSHash.put(long)0x4cd, (char)0x30d8591 keysym2UCSHash.put( (long)0x4cd, (char)0x30d8); // XK_kana_HE --> KATAKANA LETTER HE keysym2UCSHash.put(long)0x4ce, (char)0x30db592 keysym2UCSHash.put( (long)0x4ce, (char)0x30db); // XK_kana_HO --> KATAKANA LETTER HO keysym2UCSHash.put(long)0x4cf, (char)0x30de593 keysym2UCSHash.put( (long)0x4cf, (char)0x30de); // XK_kana_MA --> KATAKANA LETTER MA keysym2UCSHash.put(long)0x4d0, (char)0x30df594 keysym2UCSHash.put( (long)0x4d0, (char)0x30df); // XK_kana_MI --> KATAKANA LETTER MI keysym2UCSHash.put(long)0x4d1, (char)0x30e0595