0N/A/*
2362N/A * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A/* Note that the contents of this file were taken from canvas.c
0N/A * in the old motif-based AWT.
0N/A */
0N/A
0N/A#ifdef HEADLESS
0N/A #error This file should not be included in headless library
0N/A#endif
0N/A
0N/A#include <X11/Xlib.h>
0N/A#include <X11/Xutil.h>
0N/A#include <X11/Xos.h>
0N/A#include <X11/Xatom.h>
0N/A#include <ctype.h>
0N/A
0N/A#include <jvm.h>
0N/A#include <jni.h>
0N/A#include <jlong.h>
0N/A#include <jni_util.h>
0N/A
0N/A#include "sun_awt_X11_XWindow.h"
0N/A
0N/A#include "awt_p.h"
0N/A#include "awt_GraphicsEnv.h"
0N/A#include "awt_AWTEvent.h"
0N/A
0N/A#define XK_KATAKANA
0N/A#include <X11/keysym.h> /* standard X keysyms */
0N/A#include <X11/DECkeysym.h> /* DEC vendor-specific */
0N/A#include <X11/Sunkeysym.h> /* Sun vendor-specific */
0N/A#include <X11/ap_keysym.h> /* Apollo (HP) vendor-specific */
0N/A/*
0N/A * #include <X11/HPkeysym.h> HP vendor-specific
0N/A * I checked HPkeysym.h into the workspace because although
0N/A * I think it will ship with X11R6.4.2 (and later) on Linux,
0N/A * it doesn't seem to be in Solaris 9 Update 2.
0N/A *
0N/A * This is done not only for the hp keysyms, but also to
0N/A * give us the osf keysyms that are also defined in HPkeysym.h.
0N/A * However, HPkeysym.h is missing a couple of osf keysyms,
0N/A * so I have #defined them below.
0N/A */
0N/A#include "HPkeysym.h" /* HP vendor-specific */
0N/A
0N/A#include "java_awt_event_KeyEvent.h"
0N/A#include "java_awt_event_InputEvent.h"
0N/A#include "java_awt_event_MouseEvent.h"
0N/A#include "java_awt_event_MouseWheelEvent.h"
0N/A#include "java_awt_AWTEvent.h"
0N/A
0N/A/*
0N/A * Two osf keys are not defined in standard keysym.h,
0N/A * /Xm/VirtKeys.h, or HPkeysym.h, so I added them below.
0N/A * I found them in /usr/openwin/lib/X11/XKeysymDB
0N/A */
0N/A#ifndef osfXK_Prior
0N/A#define osfXK_Prior 0x1004FF55
0N/A#endif
0N/A#ifndef osfXK_Next
0N/A#define osfXK_Next 0x1004FF56
0N/A#endif
0N/A
0N/AjfieldID windowID;
0N/AjfieldID drawStateID;
0N/AjfieldID targetID;
0N/AjfieldID graphicsConfigID;
0N/A
0N/Aextern jobject currentX11InputMethodInstance;
0N/Aextern Boolean awt_x11inputmethod_lookupString(XKeyPressedEvent *, KeySym *);
0N/ABoolean awt_UseType4Patch = False;
0N/A/* how about HEADLESS */
0N/ABoolean awt_ServerDetected = False;
0N/ABoolean awt_XKBDetected = False;
0N/ABoolean awt_IsXsun = False;
0N/ABoolean awt_UseXKB = False;
0N/A
0N/Atypedef struct KEYMAP_ENTRY {
0N/A jint awtKey;
0N/A KeySym x11Key;
0N/A Boolean mapsToUnicodeChar;
0N/A jint keyLocation;
0N/A} KeymapEntry;
0N/A
0N/A/* NB: XK_R? keysyms are for Type 4 keyboards.
0N/A * The corresponding XK_F? keysyms are for Type 5
0N/A *
0N/A * Note: this table must be kept in sorted order, since it is traversed
0N/A * according to both Java keycode and X keysym. There are a number of
0N/A * keycodes that map to more than one corresponding keysym, and we need
0N/A * to choose the right one. Unfortunately, there are some keysyms that
0N/A * can map to more than one keycode, depending on what kind of keyboard
0N/A * is in use (e.g. F11 and F12).
0N/A */
0N/A
0N/AKeymapEntry keymapTable[] =
0N/A{
0N/A {java_awt_event_KeyEvent_VK_A, XK_a, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_B, XK_b, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_C, XK_c, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_D, XK_d, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_E, XK_e, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F, XK_f, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_G, XK_g, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_H, XK_h, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_I, XK_i, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_J, XK_j, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_K, XK_k, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_L, XK_l, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_M, XK_m, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_N, XK_n, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_O, XK_o, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_P, XK_p, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_Q, XK_q, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_R, XK_r, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_S, XK_s, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_T, XK_t, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_U, XK_u, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_V, XK_v, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_W, XK_w, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_X, XK_x, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_Y, XK_y, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_Z, XK_z, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* TTY Function keys */
0N/A {java_awt_event_KeyEvent_VK_BACK_SPACE, XK_BackSpace, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_TAB, XK_Tab, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_TAB, XK_ISO_Left_Tab, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_CLEAR, XK_Clear, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_ENTER, XK_Return, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_ENTER, XK_Linefeed, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAUSE, XK_Pause, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAUSE, XK_F21, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAUSE, XK_R1, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_SCROLL_LOCK, XK_Scroll_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_SCROLL_LOCK, XK_F23, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_SCROLL_LOCK, XK_R3, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_ESCAPE, XK_Escape, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Other vendor-specific versions of TTY Function keys */
0N/A {java_awt_event_KeyEvent_VK_BACK_SPACE, osfXK_BackSpace, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_CLEAR, osfXK_Clear, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_ESCAPE, osfXK_Escape, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Modifier keys */
0N/A {java_awt_event_KeyEvent_VK_SHIFT, XK_Shift_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT},
0N/A {java_awt_event_KeyEvent_VK_SHIFT, XK_Shift_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT},
0N/A {java_awt_event_KeyEvent_VK_CONTROL, XK_Control_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT},
0N/A {java_awt_event_KeyEvent_VK_CONTROL, XK_Control_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT},
0N/A {java_awt_event_KeyEvent_VK_ALT, XK_Alt_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT},
0N/A {java_awt_event_KeyEvent_VK_ALT, XK_Alt_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT},
0N/A {java_awt_event_KeyEvent_VK_META, XK_Meta_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT},
0N/A {java_awt_event_KeyEvent_VK_META, XK_Meta_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT},
0N/A {java_awt_event_KeyEvent_VK_CAPS_LOCK, XK_Caps_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Misc Functions */
0N/A {java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_Print, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_F22, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_R2, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_CANCEL, XK_Cancel, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_HELP, XK_Help, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_NUM_LOCK, XK_Num_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A
0N/A /* Other vendor-specific versions of Misc Functions */
0N/A {java_awt_event_KeyEvent_VK_CANCEL, osfXK_Cancel, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_HELP, osfXK_Help, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Rectangular Navigation Block */
0N/A {java_awt_event_KeyEvent_VK_HOME, XK_Home, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_HOME, XK_R7, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_UP, XK_Page_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_UP, XK_Prior, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_UP, XK_R9, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_Page_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_Next, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_R15, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_END, XK_End, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_END, XK_R13, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_INSERT, XK_Insert, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DELETE, XK_Delete, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Keypad equivalents of Rectangular Navigation Block */
0N/A {java_awt_event_KeyEvent_VK_HOME, XK_KP_Home, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_UP, XK_KP_Page_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_UP, XK_KP_Prior, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_KP_Page_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_KP_Next, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_END, XK_KP_End, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_INSERT, XK_KP_Insert, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_DELETE, XK_KP_Delete, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A
0N/A /* Other vendor-specific Rectangular Navigation Block */
0N/A {java_awt_event_KeyEvent_VK_PAGE_UP, osfXK_PageUp, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_UP, osfXK_Prior, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_DOWN, osfXK_PageDown, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PAGE_DOWN, osfXK_Next, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_END, osfXK_EndLine, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_INSERT, osfXK_Insert, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DELETE, osfXK_Delete, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Triangular Navigation Block */
0N/A {java_awt_event_KeyEvent_VK_LEFT, XK_Left, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_UP, XK_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_RIGHT, XK_Right, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DOWN, XK_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Keypad equivalents of Triangular Navigation Block */
0N/A {java_awt_event_KeyEvent_VK_KP_LEFT, XK_KP_Left, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_KP_UP, XK_KP_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_KP_RIGHT, XK_KP_Right, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_KP_DOWN, XK_KP_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A
0N/A /* Other vendor-specific Triangular Navigation Block */
0N/A {java_awt_event_KeyEvent_VK_LEFT, osfXK_Left, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_UP, osfXK_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_RIGHT, osfXK_Right, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DOWN, osfXK_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Remaining Cursor control & motion */
0N/A {java_awt_event_KeyEvent_VK_BEGIN, XK_Begin, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_BEGIN, XK_KP_Begin, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A
0N/A {java_awt_event_KeyEvent_VK_0, XK_0, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_1, XK_1, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_2, XK_2, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_3, XK_3, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_4, XK_4, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_5, XK_5, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_6, XK_6, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_7, XK_7, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_8, XK_8, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_9, XK_9, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A {java_awt_event_KeyEvent_VK_SPACE, XK_space, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_EXCLAMATION_MARK, XK_exclam, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_QUOTEDBL, XK_quotedbl, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_NUMBER_SIGN, XK_numbersign, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DOLLAR, XK_dollar, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_AMPERSAND, XK_ampersand, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_QUOTE, XK_apostrophe, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_LEFT_PARENTHESIS, XK_parenleft, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_RIGHT_PARENTHESIS, XK_parenright, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_ASTERISK, XK_asterisk, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PLUS, XK_plus, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_COMMA, XK_comma, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_MINUS, XK_minus, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PERIOD, XK_period, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_SLASH, XK_slash, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A {java_awt_event_KeyEvent_VK_COLON, XK_colon, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_SEMICOLON, XK_semicolon, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_LESS, XK_less, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_EQUALS, XK_equal, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_GREATER, XK_greater, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A {java_awt_event_KeyEvent_VK_AT, XK_at, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A {java_awt_event_KeyEvent_VK_OPEN_BRACKET, XK_bracketleft, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_BACK_SLASH, XK_backslash, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_CLOSE_BRACKET, XK_bracketright, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_CIRCUMFLEX, XK_asciicircum, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_UNDERSCORE, XK_underscore, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_BACK_QUOTE, XK_grave, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A {java_awt_event_KeyEvent_VK_BRACELEFT, XK_braceleft, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_BRACERIGHT, XK_braceright, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A {java_awt_event_KeyEvent_VK_INVERTED_EXCLAMATION_MARK, XK_exclamdown, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Remaining Numeric Keypad Keys */
0N/A {java_awt_event_KeyEvent_VK_NUMPAD0, XK_KP_0, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_NUMPAD1, XK_KP_1, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_NUMPAD2, XK_KP_2, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_NUMPAD3, XK_KP_3, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_NUMPAD4, XK_KP_4, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_NUMPAD5, XK_KP_5, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_NUMPAD6, XK_KP_6, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_NUMPAD7, XK_KP_7, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_NUMPAD8, XK_KP_8, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_NUMPAD9, XK_KP_9, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_SPACE, XK_KP_Space, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_TAB, XK_KP_Tab, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_ENTER, XK_KP_Enter, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_EQUALS, XK_KP_Equal, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_EQUALS, XK_R4, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_MULTIPLY, XK_KP_Multiply, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_MULTIPLY, XK_F26, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_MULTIPLY, XK_R6, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_ADD, XK_KP_Add, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_SEPARATOR, XK_KP_Separator, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_SUBTRACT, XK_KP_Subtract, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_SUBTRACT, XK_F24, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_DECIMAL, XK_KP_Decimal, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_DIVIDE, XK_KP_Divide, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_DIVIDE, XK_F25, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A {java_awt_event_KeyEvent_VK_DIVIDE, XK_R5, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},
0N/A
0N/A /* Function Keys */
0N/A {java_awt_event_KeyEvent_VK_F1, XK_F1, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F2, XK_F2, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F3, XK_F3, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F4, XK_F4, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F5, XK_F5, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F6, XK_F6, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F7, XK_F7, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F8, XK_F8, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F9, XK_F9, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F10, XK_F10, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F11, XK_F11, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F12, XK_F12, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Sun vendor-specific version of F11 and F12 */
0N/A {java_awt_event_KeyEvent_VK_F11, SunXK_F36, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_F12, SunXK_F37, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* X11 keysym names for input method related keys don't always
0N/A * match keytop engravings or Java virtual key names, so here we
0N/A * only map constants that we've found on real keyboards.
0N/A */
0N/A /* Type 5c Japanese keyboard: kakutei */
0N/A {java_awt_event_KeyEvent_VK_ACCEPT, XK_Execute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A /* Type 5c Japanese keyboard: henkan */
0N/A {java_awt_event_KeyEvent_VK_CONVERT, XK_Kanji, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A /* Type 5c Japanese keyboard: nihongo */
0N/A {java_awt_event_KeyEvent_VK_INPUT_METHOD_ON_OFF, XK_Henkan_Mode, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A /* VK_KANA_LOCK is handled separately because it generates the
0N/A * same keysym as ALT_GRAPH in spite of its different behavior.
0N/A */
0N/A
0N/A {java_awt_event_KeyEvent_VK_COMPOSE, XK_Multi_key, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_ALT_GRAPH, XK_Mode_switch, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Editing block */
0N/A {java_awt_event_KeyEvent_VK_AGAIN, XK_Redo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_AGAIN, XK_L2, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_UNDO, XK_Undo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_UNDO, XK_L4, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_COPY, XK_L6, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PASTE, XK_L8, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_CUT, XK_L10, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_FIND, XK_Find, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_FIND, XK_L9, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PROPS, XK_L3, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_STOP, XK_L1, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Sun vendor-specific versions for editing block */
0N/A {java_awt_event_KeyEvent_VK_AGAIN, SunXK_Again, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_UNDO, SunXK_Undo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_COPY, SunXK_Copy, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PASTE, SunXK_Paste, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_CUT, SunXK_Cut, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_FIND, SunXK_Find, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PROPS, SunXK_Props, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_STOP, SunXK_Stop, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Apollo (HP) vendor-specific versions for editing block */
0N/A {java_awt_event_KeyEvent_VK_COPY, apXK_Copy, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_CUT, apXK_Cut, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PASTE, apXK_Paste, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Other vendor-specific versions for editing block */
0N/A {java_awt_event_KeyEvent_VK_COPY, osfXK_Copy, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_CUT, osfXK_Cut, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_PASTE, osfXK_Paste, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_UNDO, osfXK_Undo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Dead key mappings (for European keyboards) */
0N/A {java_awt_event_KeyEvent_VK_DEAD_GRAVE, XK_dead_grave, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_ACUTE, XK_dead_acute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, XK_dead_circumflex, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_TILDE, XK_dead_tilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_MACRON, XK_dead_macron, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_BREVE, XK_dead_breve, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_ABOVEDOT, XK_dead_abovedot, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, XK_dead_diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_ABOVERING, XK_dead_abovering, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_DOUBLEACUTE, XK_dead_doubleacute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_CARON, XK_dead_caron, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_CEDILLA, XK_dead_cedilla, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_OGONEK, XK_dead_ogonek, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_IOTA, XK_dead_iota, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_VOICED_SOUND, XK_dead_voiced_sound, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_SEMIVOICED_SOUND, XK_dead_semivoiced_sound, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Sun vendor-specific dead key mappings (for European keyboards) */
0N/A {java_awt_event_KeyEvent_VK_DEAD_GRAVE, SunXK_FA_Grave, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, SunXK_FA_Circum, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_TILDE, SunXK_FA_Tilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_ACUTE, SunXK_FA_Acute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, SunXK_FA_Diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_CEDILLA, SunXK_FA_Cedilla, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* DEC vendor-specific dead key mappings (for European keyboards) */
0N/A {java_awt_event_KeyEvent_VK_DEAD_ABOVERING, DXK_ring_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, DXK_circumflex_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_CEDILLA, DXK_cedilla_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_ACUTE, DXK_acute_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_GRAVE, DXK_grave_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_TILDE, DXK_tilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, DXK_diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A /* Other vendor-specific dead key mappings (for European keyboards) */
0N/A {java_awt_event_KeyEvent_VK_DEAD_ACUTE, hpXK_mute_acute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_GRAVE, hpXK_mute_grave, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, hpXK_mute_asciicircum, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, hpXK_mute_diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A {java_awt_event_KeyEvent_VK_DEAD_TILDE, hpXK_mute_asciitilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},
0N/A
0N/A {java_awt_event_KeyEvent_VK_UNDEFINED, NoSymbol, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN}
0N/A};
0N/A
0N/Astatic Boolean
0N/AkeyboardHasKanaLockKey()
0N/A{
0N/A static Boolean haveResult = FALSE;
0N/A static Boolean result = FALSE;
0N/A
0N/A int32_t minKeyCode, maxKeyCode, keySymsPerKeyCode;
0N/A KeySym *keySyms, *keySymsStart, keySym;
0N/A int32_t i;
0N/A int32_t kanaCount = 0;
0N/A
0N/A // Solaris doesn't let you swap keyboards without rebooting,
0N/A // so there's no need to check for the kana lock key more than once.
0N/A if (haveResult) {
0N/A return result;
0N/A }
0N/A
0N/A // There's no direct way to determine whether the keyboard has
0N/A // a kana lock key. From available keyboard mapping tables, it looks
0N/A // like only keyboards with the kana lock key can produce keysyms
0N/A // for kana characters. So, as an indirect test, we check for those.
0N/A XDisplayKeycodes(awt_display, &minKeyCode, &maxKeyCode);
0N/A keySyms = XGetKeyboardMapping(awt_display, minKeyCode, maxKeyCode - minKeyCode + 1, &keySymsPerKeyCode);
0N/A keySymsStart = keySyms;
0N/A for (i = 0; i < (maxKeyCode - minKeyCode + 1) * keySymsPerKeyCode; i++) {
0N/A keySym = *keySyms++;
0N/A if ((keySym & 0xff00) == 0x0400) {
0N/A kanaCount++;
0N/A }
0N/A }
0N/A XFree(keySymsStart);
0N/A
0N/A // use a (somewhat arbitrary) minimum so we don't get confused by a stray function key
0N/A result = kanaCount > 10;
0N/A haveResult = TRUE;
0N/A return result;
0N/A}
0N/A
0N/Astatic void
0N/AkeysymToAWTKeyCode(KeySym x11Key, jint *keycode, Boolean *mapsToUnicodeChar,
0N/A jint *keyLocation)
0N/A{
0N/A int32_t i;
0N/A
0N/A // Solaris uses XK_Mode_switch for both the non-locking AltGraph
0N/A // and the locking Kana key, but we want to keep them separate for
0N/A // KeyEvent.
0N/A if (x11Key == XK_Mode_switch && keyboardHasKanaLockKey()) {
0N/A *keycode = java_awt_event_KeyEvent_VK_KANA_LOCK;
0N/A *mapsToUnicodeChar = FALSE;
0N/A *keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN;
0N/A return;
0N/A }
0N/A
0N/A for (i = 0;
0N/A keymapTable[i].awtKey != java_awt_event_KeyEvent_VK_UNDEFINED;
0N/A i++)
0N/A {
0N/A if (keymapTable[i].x11Key == x11Key) {
0N/A *keycode = keymapTable[i].awtKey;
0N/A *mapsToUnicodeChar = keymapTable[i].mapsToUnicodeChar;
0N/A *keyLocation = keymapTable[i].keyLocation;
0N/A return;
0N/A }
0N/A }
0N/A
0N/A *keycode = java_awt_event_KeyEvent_VK_UNDEFINED;
0N/A *mapsToUnicodeChar = FALSE;
0N/A *keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN;
0N/A
0N/A DTRACE_PRINTLN1("keysymToAWTKeyCode: no key mapping found: keysym = 0x%x", x11Key);
0N/A}
0N/A
0N/AKeySym
0N/Aawt_getX11KeySym(jint awtKey)
0N/A{
0N/A int32_t i;
0N/A
0N/A if (awtKey == java_awt_event_KeyEvent_VK_KANA_LOCK && keyboardHasKanaLockKey()) {
0N/A return XK_Mode_switch;
0N/A }
0N/A
0N/A for (i = 0; keymapTable[i].awtKey != 0; i++) {
0N/A if (keymapTable[i].awtKey == awtKey) {
0N/A return keymapTable[i].x11Key;
0N/A }
0N/A }
0N/A
0N/A DTRACE_PRINTLN1("awt_getX11KeySym: no key mapping found: awtKey = 0x%x", awtKey);
0N/A return NoSymbol;
0N/A}
0N/A
0N/A/* Called from handleKeyEvent. The purpose of this function is
0N/A * to check for a list of vendor-specific keysyms, most of which
0N/A * have values greater than 0xFFFF. Most of these keys don't map
0N/A * to unicode characters, but some do.
0N/A *
0N/A * For keys that don't map to unicode characters, the keysym
0N/A * is irrelevant at this point. We set the keysym to zero
0N/A * to ensure that the switch statement immediately below
0N/A * this function call (in adjustKeySym) won't incorrectly act
0N/A * on them after the high bits are stripped off.
0N/A *
0N/A * For keys that do map to unicode characters, we change the keysym
0N/A * to the equivalent that is < 0xFFFF
0N/A */
0N/Astatic void
0N/AhandleVendorKeySyms(XEvent *event, KeySym *keysym)
0N/A{
0N/A KeySym originalKeysym = *keysym;
0N/A
0N/A switch (*keysym) {
0N/A /* Apollo (HP) vendor-specific from <X11/ap_keysym.h> */
0N/A case apXK_Copy:
0N/A case apXK_Cut:
0N/A case apXK_Paste:
0N/A /* DEC vendor-specific from <X11/DECkeysym.h> */
0N/A case DXK_ring_accent: /* syn usldead_ring */
0N/A case DXK_circumflex_accent:
0N/A case DXK_cedilla_accent: /* syn usldead_cedilla */
0N/A case DXK_acute_accent:
0N/A case DXK_grave_accent:
0N/A case DXK_tilde:
0N/A case DXK_diaeresis:
0N/A /* Sun vendor-specific from <X11/Sunkeysym.h> */
0N/A case SunXK_FA_Grave:
0N/A case SunXK_FA_Circum:
0N/A case SunXK_FA_Tilde:
0N/A case SunXK_FA_Acute:
0N/A case SunXK_FA_Diaeresis:
0N/A case SunXK_FA_Cedilla:
0N/A case SunXK_F36: /* Labeled F11 */
0N/A case SunXK_F37: /* Labeled F12 */
0N/A case SunXK_Props:
0N/A case SunXK_Copy:
0N/A case SunXK_Open:
0N/A case SunXK_Paste:
0N/A case SunXK_Cut:
0N/A /* Other vendor-specific from HPkeysym.h */
0N/A case hpXK_mute_acute: /* syn usldead_acute */
0N/A case hpXK_mute_grave: /* syn usldead_grave */
0N/A case hpXK_mute_asciicircum: /* syn usldead_asciicircum */
0N/A case hpXK_mute_diaeresis: /* syn usldead_diaeresis */
0N/A case hpXK_mute_asciitilde: /* syn usldead_asciitilde */
0N/A case osfXK_Copy:
0N/A case osfXK_Cut:
0N/A case osfXK_Paste:
0N/A case osfXK_PageUp:
0N/A case osfXK_PageDown:
0N/A case osfXK_EndLine:
0N/A case osfXK_Clear:
0N/A case osfXK_Left:
0N/A case osfXK_Up:
0N/A case osfXK_Right:
0N/A case osfXK_Down:
0N/A case osfXK_Prior:
0N/A case osfXK_Next:
0N/A case osfXK_Insert:
0N/A case osfXK_Undo:
0N/A case osfXK_Help:
0N/A *keysym = 0;
0N/A break;
0N/A /*
0N/A * The rest DO map to unicode characters, so translate them
0N/A */
0N/A case osfXK_BackSpace:
0N/A *keysym = XK_BackSpace;
0N/A break;
0N/A case osfXK_Escape:
0N/A *keysym = XK_Escape;
0N/A break;
0N/A case osfXK_Cancel:
0N/A *keysym = XK_Cancel;
0N/A break;
0N/A case osfXK_Delete:
0N/A *keysym = XK_Delete;
0N/A break;
0N/A default:
0N/A break;
0N/A }
0N/A
0N/A if (originalKeysym != *keysym) {
0N/A DTRACE_PRINTLN3("%s originalKeysym=0x%x, keysym=0x%x",
0N/A "In handleVendorKeySyms:", originalKeysym, *keysym);
0N/A }
0N/A}
0N/A
0N/A/* Called from handleKeyEvent.
0N/A * The purpose of this function is to adjust the keysym and XEvent
0N/A * keycode for a key event. This is basically a conglomeration of
0N/A * bugfixes that require these adjustments.
0N/A * Note that none of the keysyms in this function are less than 256.
0N/A */
0N/Astatic void
0N/AadjustKeySym(XEvent *event, KeySym *keysym)
0N/A{
0N/A KeySym originalKeysym = *keysym;
0N/A KeyCode originalKeycode = event->xkey.keycode;
0N/A
0N/A /* We have seen bits set in the high two bytes on Linux,
0N/A * which prevents this switch statement from executing
0N/A * correctly. Strip off the high order bits.
0N/A */
0N/A *keysym &= 0x0000FFFF;
0N/A
0N/A switch (*keysym) {
0N/A case XK_ISO_Left_Tab: /* shift-tab on Linux */
0N/A *keysym = XK_Tab;
0N/A break;
0N/A case XK_KP_Decimal:
0N/A *keysym = '.';
0N/A break;
0N/A case XK_KP_Add:
0N/A *keysym = '+';
0N/A break;
0N/A case XK_F24: /* NumLock off */
0N/A case XK_KP_Subtract: /* NumLock on */
0N/A *keysym = '-';
0N/A break;
0N/A case XK_F25: /* NumLock off */
0N/A case XK_KP_Divide: /* NumLock on */
0N/A *keysym = '/';
0N/A break;
0N/A case XK_F26: /* NumLock off */
0N/A case XK_KP_Multiply: /* NumLock on */
0N/A *keysym = '*';
0N/A break;
0N/A case XK_KP_Equal:
0N/A *keysym = '=';
0N/A break;
0N/A case XK_KP_0:
0N/A *keysym = '0';
0N/A break;
0N/A case XK_KP_1:
0N/A *keysym = '1';
0N/A break;
0N/A case XK_KP_2:
0N/A *keysym = '2';
0N/A break;
0N/A case XK_KP_3:
0N/A *keysym = '3';
0N/A break;
0N/A case XK_KP_4:
0N/A *keysym = '4';
0N/A break;
0N/A case XK_KP_5:
0N/A *keysym = '5';
0N/A break;
0N/A case XK_KP_6:
0N/A *keysym = '6';
0N/A break;
0N/A case XK_KP_7:
0N/A *keysym = '7';
0N/A break;
0N/A case XK_KP_8:
0N/A *keysym = '8';
0N/A break;
0N/A case XK_KP_9:
0N/A *keysym = '9';
0N/A break;
0N/A case XK_KP_Left: /* Bug 4350175 */
0N/A *keysym = XK_Left;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Up:
0N/A *keysym = XK_Up;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Right:
0N/A *keysym = XK_Right;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Down:
0N/A *keysym = XK_Down;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Home:
0N/A *keysym = XK_Home;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_End:
0N/A *keysym = XK_End;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Page_Up:
0N/A *keysym = XK_Page_Up;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Page_Down:
0N/A *keysym = XK_Page_Down;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Begin:
0N/A *keysym = XK_Begin;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Insert:
0N/A *keysym = XK_Insert;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Delete:
0N/A *keysym = XK_Delete;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);
0N/A break;
0N/A case XK_KP_Enter:
0N/A *keysym = XK_Linefeed;
0N/A event->xkey.keycode = XKeysymToKeycode(awt_display, XK_Return);
0N/A break;
0N/A default:
0N/A break;
0N/A }
0N/A
0N/A if (originalKeysym != *keysym) {
0N/A DTRACE_PRINTLN2("In adjustKeySym: originalKeysym=0x%x, keysym=0x%x",
0N/A originalKeysym, *keysym);
0N/A }
0N/A if (originalKeycode != event->xkey.keycode) {
0N/A DTRACE_PRINTLN2("In adjustKeySym: originalKeycode=0x%x, keycode=0x%x",
0N/A originalKeycode, event->xkey.keycode);
0N/A }
0N/A}
0N/A
0N/A/*
0N/A * What a sniffer sez?
0N/A * Xsun and Xorg if NumLock is on do two thing different:
0N/A * keep Keypad key in different places of keysyms array and
0N/A * ignore/obey "ModLock is ShiftLock", so we should choose.
0N/A * People say, it's right to use behavior and not Vendor tags to decide.
0N/A * Maybe. But why these tags were invented, then?
0N/A * TODO: use behavior, not tags. Maybe.
0N/A */
0N/Astatic Boolean
0N/AisXsunServer(XEvent *event) {
0N/A if( awt_ServerDetected ) return awt_IsXsun;
3022N/A if( (strncmp( ServerVendor( event->xkey.display ), "Sun Microsystems, Inc.", 22) != 0) &&
3022N/A (strncmp( ServerVendor( event->xkey.display ), "Oracle Corporation", 18) != 0) )
3022N/A {
0N/A awt_ServerDetected = True;
0N/A awt_IsXsun = False;
0N/A return False;
0N/A }
0N/A // Now, it's Sun. It still may be Xorg though, eg on Solaris 10, x86.
0N/A // Today (2005), VendorRelease of Xorg is a Big Number unlike Xsun.
0N/A if( VendorRelease( event->xkey.display ) > 10000 ) {
0N/A awt_ServerDetected = True;
0N/A awt_IsXsun = False;
0N/A return False;
0N/A }
0N/A awt_ServerDetected = True;
0N/A awt_IsXsun = True;
0N/A return True;
0N/A}
0N/A/*
0N/A * +kb or -kb ?
0N/A */
0N/Astatic Boolean
0N/AisXKBenabled(Display *display) {
0N/A int mop, beve, berr;
0N/A if( !awt_XKBDetected ) {
0N/A /*
0N/A * NB: TODO: hope it will return False if XkbIgnoreExtension was called!
0N/A */
0N/A awt_UseXKB = XQueryExtension(display, "XKEYBOARD", &mop, &beve, &berr);
0N/A awt_XKBDetected = True;
0N/A }
0N/A return awt_UseXKB;
0N/A}
0N/Astatic Boolean
0N/AisKPevent(XEvent *event)
0N/A{
0N/A /*
0N/A * Xlib manual, ch 12.7 says, as a first rule for choice of keysym:
0N/A * The numlock modifier is on and the second KeySym is a keypad KeySym. In this case,
0N/A * if the Shift modifier is on, or if the Lock modifier is on and is interpreted as ShiftLock,
0N/A * then the first KeySym is used, otherwise the second KeySym is used.
0N/A *
0N/A * However, Xsun server does ignore ShiftLock and always takes 3-rd element from an array.
0N/A *
0N/A * So, is it a keypad keysym?
0N/A */
0N/A Boolean bsun = isXsunServer( event );
0N/A Boolean bxkb = isXKBenabled( event->xkey.display );
0N/A return IsKeypadKey( XKeycodeToKeysym(event->xkey.display, event->xkey.keycode,(bsun && !bxkb ? 2 : 1) ) );
0N/A}
0N/Astatic void
0N/AdumpKeysymArray(XEvent *event) {
0N/A printf(" 0x%X\n",XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 0));
0N/A printf(" 0x%X\n",XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 1));
0N/A printf(" 0x%X\n",XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 2));
0N/A printf(" 0x%X\n",XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 3));
0N/A}
0N/A/*
0N/A * In a next redesign, get rid of this code altogether.
0N/A *
0N/A */
0N/Astatic void
0N/AhandleKeyEventWithNumLockMask_New(XEvent *event, KeySym *keysym)
0N/A{
0N/A KeySym originalKeysym = *keysym;
0N/A if( !isKPevent( event ) ) {
0N/A return;
0N/A }
0N/A if( isXsunServer( event ) && !awt_UseXKB) {
0N/A if( (event->xkey.state & ShiftMask) ) { // shift modifier is on
0N/A *keysym = XKeycodeToKeysym(event->xkey.display,
0N/A event->xkey.keycode, 3);
0N/A }else {
0N/A *keysym = XKeycodeToKeysym(event->xkey.display,
0N/A event->xkey.keycode, 2);
0N/A }
0N/A } else {
0N/A if( (event->xkey.state & ShiftMask) || // shift modifier is on
0N/A ((event->xkey.state & LockMask) && // lock modifier is on
0N/A (awt_ModLockIsShiftLock)) ) { // it is interpreted as ShiftLock
0N/A *keysym = XKeycodeToKeysym(event->xkey.display,
0N/A event->xkey.keycode, 0);
0N/A }else{
0N/A *keysym = XKeycodeToKeysym(event->xkey.display,
0N/A event->xkey.keycode, 1);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/* Called from handleKeyEvent.
0N/A * The purpose of this function is to make some adjustments to keysyms
0N/A * that have been found to be necessary when the NumLock mask is set.
0N/A * They come from various bug fixes and rearchitectures.
0N/A * This function is meant to be called when
0N/A * (event->xkey.state & awt_NumLockMask) is TRUE.
0N/A */
0N/Astatic void
0N/AhandleKeyEventWithNumLockMask(XEvent *event, KeySym *keysym)
0N/A{
0N/A KeySym originalKeysym = *keysym;
0N/A
4632N/A#if !defined(__linux__) && !defined(MACOSX)
0N/A /* The following code on Linux will cause the keypad keys
0N/A * not to echo on JTextField when the NumLock is on. The
0N/A * keysyms will be 0, because the last parameter 2 is not defined.
0N/A * See Xlib Programming Manual, O'Reilly & Associates, Section
0N/A * 9.1.5 "Other Keyboard-handling Routines", "The meaning of
0N/A * the keysym list beyond the first two (unmodified, Shift or
0N/A * Shift Lock) is not defined."
0N/A */
0N/A
0N/A /* Translate again with NumLock as modifier. */
0N/A /* ECH - I wonder why we think that NumLock corresponds to 2?
0N/A On Linux, we've seen xmodmap -pm yield mod2 as NumLock,
0N/A but I don't know that it will be for every configuration.
0N/A Perhaps using the index (modn in awt_MToolkit.c:setup_modifier_map)
0N/A would be more correct.
0N/A */
0N/A *keysym = XKeycodeToKeysym(event->xkey.display,
0N/A event->xkey.keycode, 2);
0N/A if (originalKeysym != *keysym) {
0N/A DTRACE_PRINTLN3("%s originalKeysym=0x%x, keysym=0x%x",
0N/A "In handleKeyEventWithNumLockMask ifndef linux:",
0N/A originalKeysym, *keysym);
0N/A }
0N/A#endif
0N/A
0N/A /* Note: the XK_R? key assignments are for Type 4 kbds */
0N/A switch (*keysym) {
0N/A case XK_R13:
0N/A *keysym = XK_KP_1;
0N/A break;
0N/A case XK_R14:
0N/A *keysym = XK_KP_2;
0N/A break;
0N/A case XK_R15:
0N/A *keysym = XK_KP_3;
0N/A break;
0N/A case XK_R10:
0N/A *keysym = XK_KP_4;
0N/A break;
0N/A case XK_R11:
0N/A *keysym = XK_KP_5;
0N/A break;
0N/A case XK_R12:
0N/A *keysym = XK_KP_6;
0N/A break;
0N/A case XK_R7:
0N/A *keysym = XK_KP_7;
0N/A break;
0N/A case XK_R8:
0N/A *keysym = XK_KP_8;
0N/A break;
0N/A case XK_R9:
0N/A *keysym = XK_KP_9;
0N/A break;
0N/A case XK_KP_Insert:
0N/A *keysym = XK_KP_0;
0N/A break;
0N/A case XK_KP_Delete:
0N/A *keysym = XK_KP_Decimal;
0N/A break;
0N/A case XK_R4:
0N/A *keysym = XK_KP_Equal; /* Type 4 kbd */
0N/A break;
0N/A case XK_R5:
0N/A *keysym = XK_KP_Divide;
0N/A break;
0N/A case XK_R6:
0N/A *keysym = XK_KP_Multiply;
0N/A break;
0N/A /*
0N/A * Need the following keysym changes for Linux key releases.
0N/A * Sometimes the modifier state gets messed up, so we get a
0N/A * KP_Left when we should get a KP_4, for example.
0N/A * XK_KP_Insert and XK_KP_Delete were already handled above.
0N/A */
0N/A case XK_KP_Left:
0N/A *keysym = XK_KP_4;
0N/A break;
0N/A case XK_KP_Up:
0N/A *keysym = XK_KP_8;
0N/A break;
0N/A case XK_KP_Right:
0N/A *keysym = XK_KP_6;
0N/A break;
0N/A case XK_KP_Down:
0N/A *keysym = XK_KP_2;
0N/A break;
0N/A case XK_KP_Home:
0N/A *keysym = XK_KP_7;
0N/A break;
0N/A case XK_KP_End:
0N/A *keysym = XK_KP_1;
0N/A break;
0N/A case XK_KP_Page_Up:
0N/A *keysym = XK_KP_9;
0N/A break;
0N/A case XK_KP_Page_Down:
0N/A *keysym = XK_KP_3;
0N/A break;
0N/A case XK_KP_Begin:
0N/A *keysym = XK_KP_5;
0N/A break;
0N/A default:
0N/A break;
0N/A }
0N/A
0N/A if (originalKeysym != *keysym) {
0N/A DTRACE_PRINTLN3("%s originalKeysym=0x%x, keysym=0x%x",
0N/A "In handleKeyEventWithNumLockMask:", originalKeysym, *keysym);
0N/A }
0N/A}
0N/A
0N/A
0N/A/* This function is called as the keyChar parameter of a call to
0N/A * awt_post_java_key_event. It depends on being called after adjustKeySym.
0N/A *
0N/A * This function just handles a few values where we know that the
0N/A * keysym is not the same as the unicode value. For values that
0N/A * we don't handle explicitly, we just cast the keysym to a jchar.
0N/A * Most of the real mapping work that gets the correct keysym is handled
0N/A * in the mapping table, adjustKeySym, etc.
0N/A *
0N/A * XXX
0N/A * Maybe we should enumerate the keysyms for which we have a mapping
0N/A * in the keyMap, but that don't map to unicode chars, and return
0N/A * CHAR_UNDEFINED? Then use the buffer value from XLookupString
0N/A * instead of the keysym as the keychar when posting. Then we don't
0N/A * need to test using mapsToUnicodeChar. That way, we would post keyTyped
0N/A * for all the chars that generate unicode chars, including LATIN2-4, etc.
0N/A * Note: what does the buffer from XLookupString contain when
0N/A * the character is a non-printable unicode character like Cancel or Delete?
0N/A */
0N/Ajchar
0N/AkeySymToUnicodeCharacter(KeySym keysym) {
0N/A jchar unicodeValue = (jchar) keysym;
0N/A
0N/A switch (keysym) {
0N/A case XK_BackSpace:
0N/A case XK_Tab:
0N/A case XK_Linefeed:
0N/A case XK_Escape:
0N/A case XK_Delete:
0N/A /* Strip off highorder bits defined in xkeysymdef.h
0N/A * I think doing this converts them to values that
0N/A * we can cast to jchars and use as java keychars.
0N/A */
0N/A unicodeValue = (jchar) (keysym & 0x007F);
0N/A break;
0N/A case XK_Return:
0N/A unicodeValue = (jchar) 0x000a; /* the unicode char for Linefeed */
0N/A break;
0N/A case XK_Cancel:
0N/A unicodeValue = (jchar) 0x0018; /* the unicode char for Cancel */
0N/A break;
0N/A default:
0N/A break;
0N/A }
0N/A
0N/A if (unicodeValue != (jchar)keysym) {
0N/A DTRACE_PRINTLN3("%s originalKeysym=0x%x, keysym=0x%x",
0N/A "In keysymToUnicode:", keysym, unicodeValue);
0N/A }
0N/A
0N/A return unicodeValue;
0N/A}
0N/A
0N/A
0N/Avoid
0N/Aawt_post_java_key_event(JNIEnv *env, jobject peer, jint id,
0N/A jlong when, jint keyCode, jchar keyChar, jint keyLocation, jint state, XEvent * event)
0N/A{
0N/A JNU_CallMethodByName(env, NULL, peer, "postKeyEvent", "(IJICIIJI)V", id,
0N/A when, keyCode, keyChar, keyLocation, state, ptr_to_jlong(event), (jint)sizeof(XEvent));
0N/A} /* awt_post_java_key_event() */
0N/A
0N/A
0N/A
0N/AJNIEXPORT jint JNICALL
0N/AJava_sun_awt_X11_XWindow_getAWTKeyCodeForKeySym(JNIEnv *env, jclass clazz, jint keysym) {
0N/A jint keycode = java_awt_event_KeyEvent_VK_UNDEFINED;
0N/A Boolean mapsToUnicodeChar;
0N/A jint keyLocation;
0N/A keysymToAWTKeyCode(keysym, &keycode, &mapsToUnicodeChar, &keyLocation);
0N/A return keycode;
0N/A}
0N/A
0N/AJNIEXPORT jboolean JNICALL Java_sun_awt_X11_XWindow_haveCurrentX11InputMethodInstance
0N/A(JNIEnv *env, jobject object) {
0N/A /*printf("Java_sun_awt_X11_XWindow_haveCurrentX11InputMethodInstance: %s\n", (currentX11InputMethodInstance==NULL? "NULL":" notnull"));
0N/A */
0N/A return currentX11InputMethodInstance != NULL ? JNI_TRUE : JNI_FALSE;
0N/A}
0N/A
0N/AJNIEXPORT jboolean JNICALL Java_sun_awt_X11_XWindow_x11inputMethodLookupString
0N/A(JNIEnv *env, jobject object, jlong event, jlongArray keysymArray) {
0N/A KeySym keysym = NoSymbol;
0N/A Boolean boo;
0N/A /* keysymArray (and testbuf[]) have dimension 2 because we put there two
0N/A * perhaps different values of keysyms.
0N/A * XXX: not anymore at the moment, but I'll still keep them as arrays
0N/A * for a while. If in the course of testing we will be satisfied with
0N/A * a current single result from awt_x11inputmethod_lookupString, we'll
0N/A * change this.
0N/A */
0N/A jlong testbuf[2];
0N/A
0N/A testbuf[1]=0;
0N/A
0N/A boo = awt_x11inputmethod_lookupString((XKeyPressedEvent*)jlong_to_ptr(event), &keysym);
0N/A testbuf[0] = keysym;
0N/A
0N/A (*env)->SetLongArrayRegion(env, keysymArray, 0, 2, (jlong *)(testbuf));
0N/A return boo ? JNI_TRUE : JNI_FALSE;
0N/A}
0N/A
0N/A
0N/Aextern struct X11GraphicsConfigIDs x11GraphicsConfigIDs;
0N/A
0N/A/*
0N/A * Class: Java_sun_awt_X11_XWindow_getNativeColor
0N/A * Method: getNativeColor
0N/A * Signature (Ljava/awt/Color;Ljava/awt/GraphicsConfiguration;)I
0N/A */
0N/AJNIEXPORT jint JNICALL Java_sun_awt_X11_XWindow_getNativeColor
0N/A(JNIEnv *env, jobject this, jobject color, jobject gc_object) {
0N/A AwtGraphicsConfigDataPtr adata;
0N/A /* fire warning because JNU_GetLongFieldAsPtr casts jlong to (void *) */
0N/A adata = (AwtGraphicsConfigDataPtr) JNU_GetLongFieldAsPtr(env, gc_object, x11GraphicsConfigIDs.aData);
0N/A return awtJNI_GetColorForVis(env, color, adata);
0N/A}
0N/A
0N/A/* syncTopLevelPos() is necessary to insure that the window manager has in
0N/A * fact moved us to our final position relative to the reParented WM window.
0N/A * We have noted a timing window which our shell has not been moved so we
0N/A * screw up the insets thinking they are 0,0. Wait (for a limited period of
0N/A * time to let the WM hava a chance to move us
0N/A */
0N/Avoid syncTopLevelPos( Display *d, Window w, XWindowAttributes *winAttr ) {
0N/A int32_t i = 0;
0N/A do {
0N/A XGetWindowAttributes( d, w, winAttr );
0N/A /* Sometimes we get here before the WM has updated the
0N/A ** window data struct with the correct position. Loop
0N/A ** until we get a non-zero position.
0N/A */
0N/A if ((winAttr->x != 0) || (winAttr->y != 0)) {
0N/A break;
0N/A }
0N/A else {
0N/A /* What we really want here is to sync with the WM,
0N/A ** but there's no explicit way to do this, so we
0N/A ** call XSync for a delay.
0N/A */
0N/A XSync(d, False);
0N/A }
0N/A } while (i++ < 50);
0N/A}
0N/A
0N/Astatic Window getTopWindow(Window win, Window *rootWin)
0N/A{
0N/A Window root=None, current_window=win, parent=None, *ignore_children=NULL;
0N/A Window prev_window=None;
0N/A unsigned int ignore_uint=0;
0N/A Status status = 0;
0N/A
0N/A if (win == None) return None;
0N/A do {
0N/A status = XQueryTree(awt_display,
0N/A current_window,
0N/A &root,
0N/A &parent,
0N/A &ignore_children,
0N/A &ignore_uint);
0N/A XFree(ignore_children);
0N/A if (status == 0) return None;
0N/A prev_window = current_window;
0N/A current_window = parent;
0N/A } while (parent != root);
0N/A *rootWin = root;
0N/A return prev_window;
0N/A}
0N/A
0N/AJNIEXPORT jlong JNICALL Java_sun_awt_X11_XWindow_getTopWindow
0N/A(JNIEnv *env, jclass clazz, jlong win, jlong rootWin) {
0N/A return getTopWindow((Window) win, (Window*) jlong_to_ptr(rootWin));
0N/A}
0N/A
0N/Astatic void
0N/AgetWMInsets
0N/A(Window window, int *left, int *top, int *right, int *bottom, int *border) {
0N/A // window is event->xreparent.window
0N/A Window topWin = None, rootWin = None, containerWindow = None;
0N/A XWindowAttributes winAttr, topAttr;
0N/A int screenX, screenY;
0N/A topWin = getTopWindow(window, &rootWin);
0N/A syncTopLevelPos(awt_display, topWin, &topAttr);
0N/A // (screenX, screenY) is (0,0) of the reparented window
0N/A // converted to screen coordinates.
0N/A XTranslateCoordinates(awt_display, window, rootWin,
0N/A 0,0, &screenX, &screenY, &containerWindow);
0N/A *left = screenX - topAttr.x - topAttr.border_width;
0N/A *top = screenY - topAttr.y - topAttr.border_width;
0N/A XGetWindowAttributes(awt_display, window, &winAttr);
0N/A *right = topAttr.width - ((winAttr.width) + *left);
0N/A *bottom = topAttr.height - ((winAttr.height) + *top);
0N/A *border = topAttr.border_width;
0N/A}
0N/A
0N/AJNIEXPORT void JNICALL Java_sun_awt_X11_XWindow_getWMInsets
0N/A(JNIEnv *env, jclass clazz, jlong window, jlong left, jlong top, jlong right, jlong bottom, jlong border) {
0N/A getWMInsets((Window) window,
0N/A (int*) jlong_to_ptr(left),
0N/A (int*) jlong_to_ptr(top),
0N/A (int*) jlong_to_ptr(right),
0N/A (int*) jlong_to_ptr(bottom),
0N/A (int*) jlong_to_ptr(border));
0N/A}
0N/A
0N/Astatic void
0N/AgetWindowBounds
0N/A(Window window, int *x, int *y, int *width, int *height) {
0N/A XWindowAttributes winAttr;
0N/A XSync(awt_display, False);
0N/A XGetWindowAttributes(awt_display, window, &winAttr);
0N/A *x = winAttr.x;
0N/A *y = winAttr.y;
0N/A *width = winAttr.width;
0N/A *height = winAttr.height;
0N/A}
0N/A
0N/AJNIEXPORT void JNICALL Java_sun_awt_X11_XWindow_getWindowBounds
0N/A(JNIEnv *env, jclass clazz, jlong window, jlong x, jlong y, jlong width, jlong height) {
0N/A getWindowBounds((Window) window, (int*) jlong_to_ptr(x), (int*) jlong_to_ptr(y),
0N/A (int*) jlong_to_ptr(width), (int*) jlong_to_ptr(height));
0N/A}
0N/A
0N/AJNIEXPORT void JNICALL Java_sun_awt_X11_XWindow_setSizeHints
0N/A(JNIEnv *env, jclass clazz, jlong window, jlong x, jlong y, jlong width, jlong height) {
0N/A XSizeHints *size_hints = XAllocSizeHints();
0N/A size_hints->flags = USPosition | PPosition | PSize;
0N/A size_hints->x = (int)x;
0N/A size_hints->y = (int)y;
0N/A size_hints->width = (int)width;
0N/A size_hints->height = (int)height;
0N/A XSetWMNormalHints(awt_display, (Window)window, size_hints);
0N/A XFree((char*)size_hints);
0N/A}
0N/A
0N/A
0N/AJNIEXPORT void JNICALL
0N/AJava_sun_awt_X11_XWindow_initIDs
0N/A (JNIEnv *env, jclass clazz)
0N/A{
0N/A char *ptr = NULL;
0N/A windowID = (*env)->GetFieldID(env, clazz, "window", "J");
0N/A targetID = (*env)->GetFieldID(env, clazz, "target", "Ljava/awt/Component;");
0N/A graphicsConfigID = (*env)->GetFieldID(env, clazz, "graphicsConfig", "Lsun/awt/X11GraphicsConfig;");
0N/A drawStateID = (*env)->GetFieldID(env, clazz, "drawState", "I");
0N/A ptr = getenv("_AWT_USE_TYPE4_PATCH");
0N/A if( ptr != NULL && ptr[0] != 0 ) {
0N/A if( strncmp("true", ptr, 4) == 0 ) {
0N/A awt_UseType4Patch = True;
0N/A }else if( strncmp("false", ptr, 5) == 0 ) {
0N/A awt_UseType4Patch = False;
0N/A }
0N/A }
0N/A}
0N/A
210N/AJNIEXPORT jint JNICALL
0N/AJava_sun_awt_X11_XWindow_getKeySymForAWTKeyCode(JNIEnv* env, jclass clazz, jint keycode) {
0N/A return awt_getX11KeySym(keycode);
0N/A}