Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/xawt/XWindow.c
32287 views
/*1* Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425/* Note that the contents of this file were taken from canvas.c26* in the old motif-based AWT.27*/2829#ifdef HEADLESS30#error This file should not be included in headless library31#endif3233#include <X11/Xlib.h>34#include <X11/Xutil.h>35#include <X11/Xos.h>36#include <X11/Xatom.h>37#include <ctype.h>3839#include <jvm.h>40#include <jni.h>41#include <jlong.h>42#include <jni_util.h>4344#include "sun_awt_X11_XWindow.h"4546#include "awt_p.h"47#include "awt_GraphicsEnv.h"48#include "awt_AWTEvent.h"4950#define XK_KATAKANA51#include <X11/keysym.h> /* standard X keysyms */52#include <X11/DECkeysym.h> /* DEC vendor-specific */53#include <X11/Sunkeysym.h> /* Sun vendor-specific */54#include <X11/ap_keysym.h> /* Apollo (HP) vendor-specific */55/*56* #include <X11/HPkeysym.h> HP vendor-specific57* I checked HPkeysym.h into the workspace because although58* I think it will ship with X11R6.4.2 (and later) on Linux,59* it doesn't seem to be in Solaris 9 Update 2.60*61* This is done not only for the hp keysyms, but also to62* give us the osf keysyms that are also defined in HPkeysym.h.63* However, HPkeysym.h is missing a couple of osf keysyms,64* so I have #defined them below.65*/66#include "HPkeysym.h" /* HP vendor-specific */6768#include "java_awt_event_KeyEvent.h"69#include "java_awt_event_InputEvent.h"70#include "java_awt_event_MouseEvent.h"71#include "java_awt_event_MouseWheelEvent.h"72#include "java_awt_AWTEvent.h"7374/*75* Two osf keys are not defined in standard keysym.h,76* /Xm/VirtKeys.h, or HPkeysym.h, so I added them below.77* I found them in /usr/openwin/lib/X11/XKeysymDB78*/79#ifndef osfXK_Prior80#define osfXK_Prior 0x1004FF5581#endif82#ifndef osfXK_Next83#define osfXK_Next 0x1004FF5684#endif8586jfieldID windowID;87jfieldID drawStateID;88jfieldID targetID;89jfieldID graphicsConfigID;9091extern jobject currentX11InputMethodInstance;92extern Boolean awt_x11inputmethod_lookupString(XKeyPressedEvent *, KeySym *);93Boolean awt_UseType4Patch = False;94/* how about HEADLESS */95Boolean awt_ServerDetected = False;96Boolean awt_XKBDetected = False;97Boolean awt_IsXsun = False;98Boolean awt_UseXKB = False;99100typedef struct KEYMAP_ENTRY {101jint awtKey;102KeySym x11Key;103Boolean mapsToUnicodeChar;104jint keyLocation;105} KeymapEntry;106107/* NB: XK_R? keysyms are for Type 4 keyboards.108* The corresponding XK_F? keysyms are for Type 5109*110* Note: this table must be kept in sorted order, since it is traversed111* according to both Java keycode and X keysym. There are a number of112* keycodes that map to more than one corresponding keysym, and we need113* to choose the right one. Unfortunately, there are some keysyms that114* can map to more than one keycode, depending on what kind of keyboard115* is in use (e.g. F11 and F12).116*/117118KeymapEntry keymapTable[] =119{120{java_awt_event_KeyEvent_VK_A, XK_a, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},121{java_awt_event_KeyEvent_VK_B, XK_b, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},122{java_awt_event_KeyEvent_VK_C, XK_c, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},123{java_awt_event_KeyEvent_VK_D, XK_d, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},124{java_awt_event_KeyEvent_VK_E, XK_e, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},125{java_awt_event_KeyEvent_VK_F, XK_f, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},126{java_awt_event_KeyEvent_VK_G, XK_g, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},127{java_awt_event_KeyEvent_VK_H, XK_h, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},128{java_awt_event_KeyEvent_VK_I, XK_i, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},129{java_awt_event_KeyEvent_VK_J, XK_j, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},130{java_awt_event_KeyEvent_VK_K, XK_k, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},131{java_awt_event_KeyEvent_VK_L, XK_l, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},132{java_awt_event_KeyEvent_VK_M, XK_m, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},133{java_awt_event_KeyEvent_VK_N, XK_n, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},134{java_awt_event_KeyEvent_VK_O, XK_o, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},135{java_awt_event_KeyEvent_VK_P, XK_p, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},136{java_awt_event_KeyEvent_VK_Q, XK_q, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},137{java_awt_event_KeyEvent_VK_R, XK_r, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},138{java_awt_event_KeyEvent_VK_S, XK_s, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},139{java_awt_event_KeyEvent_VK_T, XK_t, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},140{java_awt_event_KeyEvent_VK_U, XK_u, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},141{java_awt_event_KeyEvent_VK_V, XK_v, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},142{java_awt_event_KeyEvent_VK_W, XK_w, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},143{java_awt_event_KeyEvent_VK_X, XK_x, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},144{java_awt_event_KeyEvent_VK_Y, XK_y, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},145{java_awt_event_KeyEvent_VK_Z, XK_z, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},146147/* TTY Function keys */148{java_awt_event_KeyEvent_VK_BACK_SPACE, XK_BackSpace, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},149{java_awt_event_KeyEvent_VK_TAB, XK_Tab, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},150{java_awt_event_KeyEvent_VK_TAB, XK_ISO_Left_Tab, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},151{java_awt_event_KeyEvent_VK_CLEAR, XK_Clear, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},152{java_awt_event_KeyEvent_VK_ENTER, XK_Return, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},153{java_awt_event_KeyEvent_VK_ENTER, XK_Linefeed, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},154{java_awt_event_KeyEvent_VK_PAUSE, XK_Pause, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},155{java_awt_event_KeyEvent_VK_PAUSE, XK_F21, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},156{java_awt_event_KeyEvent_VK_PAUSE, XK_R1, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},157{java_awt_event_KeyEvent_VK_SCROLL_LOCK, XK_Scroll_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},158{java_awt_event_KeyEvent_VK_SCROLL_LOCK, XK_F23, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},159{java_awt_event_KeyEvent_VK_SCROLL_LOCK, XK_R3, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},160{java_awt_event_KeyEvent_VK_ESCAPE, XK_Escape, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},161162/* Other vendor-specific versions of TTY Function keys */163{java_awt_event_KeyEvent_VK_BACK_SPACE, osfXK_BackSpace, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},164{java_awt_event_KeyEvent_VK_CLEAR, osfXK_Clear, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},165{java_awt_event_KeyEvent_VK_ESCAPE, osfXK_Escape, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},166167/* Modifier keys */168{java_awt_event_KeyEvent_VK_SHIFT, XK_Shift_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT},169{java_awt_event_KeyEvent_VK_SHIFT, XK_Shift_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT},170{java_awt_event_KeyEvent_VK_CONTROL, XK_Control_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT},171{java_awt_event_KeyEvent_VK_CONTROL, XK_Control_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT},172{java_awt_event_KeyEvent_VK_ALT, XK_Alt_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT},173{java_awt_event_KeyEvent_VK_ALT, XK_Alt_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT},174{java_awt_event_KeyEvent_VK_META, XK_Meta_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT},175{java_awt_event_KeyEvent_VK_META, XK_Meta_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT},176{java_awt_event_KeyEvent_VK_CAPS_LOCK, XK_Caps_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},177{java_awt_event_KeyEvent_VK_CAPS_LOCK, XK_Shift_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},178179/* Misc Functions */180{java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_Print, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},181{java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_F22, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},182{java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_R2, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},183{java_awt_event_KeyEvent_VK_CANCEL, XK_Cancel, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},184{java_awt_event_KeyEvent_VK_HELP, XK_Help, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},185{java_awt_event_KeyEvent_VK_NUM_LOCK, XK_Num_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},186187/* Other vendor-specific versions of Misc Functions */188{java_awt_event_KeyEvent_VK_CANCEL, osfXK_Cancel, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},189{java_awt_event_KeyEvent_VK_HELP, osfXK_Help, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},190191/* Rectangular Navigation Block */192{java_awt_event_KeyEvent_VK_HOME, XK_Home, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},193{java_awt_event_KeyEvent_VK_HOME, XK_R7, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},194{java_awt_event_KeyEvent_VK_PAGE_UP, XK_Page_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},195{java_awt_event_KeyEvent_VK_PAGE_UP, XK_Prior, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},196{java_awt_event_KeyEvent_VK_PAGE_UP, XK_R9, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},197{java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_Page_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},198{java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_Next, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},199{java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_R15, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},200{java_awt_event_KeyEvent_VK_END, XK_End, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},201{java_awt_event_KeyEvent_VK_END, XK_R13, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},202{java_awt_event_KeyEvent_VK_INSERT, XK_Insert, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},203{java_awt_event_KeyEvent_VK_DELETE, XK_Delete, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},204205/* Keypad equivalents of Rectangular Navigation Block */206{java_awt_event_KeyEvent_VK_HOME, XK_KP_Home, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},207{java_awt_event_KeyEvent_VK_PAGE_UP, XK_KP_Page_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},208{java_awt_event_KeyEvent_VK_PAGE_UP, XK_KP_Prior, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},209{java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_KP_Page_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},210{java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_KP_Next, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},211{java_awt_event_KeyEvent_VK_END, XK_KP_End, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},212{java_awt_event_KeyEvent_VK_INSERT, XK_KP_Insert, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},213{java_awt_event_KeyEvent_VK_DELETE, XK_KP_Delete, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},214215/* Other vendor-specific Rectangular Navigation Block */216{java_awt_event_KeyEvent_VK_PAGE_UP, osfXK_PageUp, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},217{java_awt_event_KeyEvent_VK_PAGE_UP, osfXK_Prior, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},218{java_awt_event_KeyEvent_VK_PAGE_DOWN, osfXK_PageDown, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},219{java_awt_event_KeyEvent_VK_PAGE_DOWN, osfXK_Next, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},220{java_awt_event_KeyEvent_VK_END, osfXK_EndLine, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},221{java_awt_event_KeyEvent_VK_INSERT, osfXK_Insert, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},222{java_awt_event_KeyEvent_VK_DELETE, osfXK_Delete, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},223224/* Triangular Navigation Block */225{java_awt_event_KeyEvent_VK_LEFT, XK_Left, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},226{java_awt_event_KeyEvent_VK_UP, XK_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},227{java_awt_event_KeyEvent_VK_RIGHT, XK_Right, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},228{java_awt_event_KeyEvent_VK_DOWN, XK_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},229230/* Keypad equivalents of Triangular Navigation Block */231{java_awt_event_KeyEvent_VK_KP_LEFT, XK_KP_Left, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},232{java_awt_event_KeyEvent_VK_KP_UP, XK_KP_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},233{java_awt_event_KeyEvent_VK_KP_RIGHT, XK_KP_Right, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},234{java_awt_event_KeyEvent_VK_KP_DOWN, XK_KP_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},235236/* Other vendor-specific Triangular Navigation Block */237{java_awt_event_KeyEvent_VK_LEFT, osfXK_Left, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},238{java_awt_event_KeyEvent_VK_UP, osfXK_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},239{java_awt_event_KeyEvent_VK_RIGHT, osfXK_Right, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},240{java_awt_event_KeyEvent_VK_DOWN, osfXK_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},241242/* Remaining Cursor control & motion */243{java_awt_event_KeyEvent_VK_BEGIN, XK_Begin, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},244{java_awt_event_KeyEvent_VK_BEGIN, XK_KP_Begin, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},245246{java_awt_event_KeyEvent_VK_0, XK_0, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},247{java_awt_event_KeyEvent_VK_1, XK_1, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},248{java_awt_event_KeyEvent_VK_2, XK_2, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},249{java_awt_event_KeyEvent_VK_3, XK_3, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},250{java_awt_event_KeyEvent_VK_4, XK_4, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},251{java_awt_event_KeyEvent_VK_5, XK_5, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},252{java_awt_event_KeyEvent_VK_6, XK_6, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},253{java_awt_event_KeyEvent_VK_7, XK_7, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},254{java_awt_event_KeyEvent_VK_8, XK_8, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},255{java_awt_event_KeyEvent_VK_9, XK_9, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},256257{java_awt_event_KeyEvent_VK_SPACE, XK_space, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},258{java_awt_event_KeyEvent_VK_EXCLAMATION_MARK, XK_exclam, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},259{java_awt_event_KeyEvent_VK_QUOTEDBL, XK_quotedbl, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},260{java_awt_event_KeyEvent_VK_NUMBER_SIGN, XK_numbersign, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},261{java_awt_event_KeyEvent_VK_DOLLAR, XK_dollar, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},262{java_awt_event_KeyEvent_VK_AMPERSAND, XK_ampersand, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},263{java_awt_event_KeyEvent_VK_QUOTE, XK_apostrophe, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},264{java_awt_event_KeyEvent_VK_LEFT_PARENTHESIS, XK_parenleft, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},265{java_awt_event_KeyEvent_VK_RIGHT_PARENTHESIS, XK_parenright, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},266{java_awt_event_KeyEvent_VK_ASTERISK, XK_asterisk, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},267{java_awt_event_KeyEvent_VK_PLUS, XK_plus, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},268{java_awt_event_KeyEvent_VK_COMMA, XK_comma, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},269{java_awt_event_KeyEvent_VK_MINUS, XK_minus, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},270{java_awt_event_KeyEvent_VK_PERIOD, XK_period, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},271{java_awt_event_KeyEvent_VK_SLASH, XK_slash, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},272273{java_awt_event_KeyEvent_VK_COLON, XK_colon, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},274{java_awt_event_KeyEvent_VK_SEMICOLON, XK_semicolon, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},275{java_awt_event_KeyEvent_VK_LESS, XK_less, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},276{java_awt_event_KeyEvent_VK_EQUALS, XK_equal, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},277{java_awt_event_KeyEvent_VK_GREATER, XK_greater, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},278279{java_awt_event_KeyEvent_VK_AT, XK_at, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},280281{java_awt_event_KeyEvent_VK_OPEN_BRACKET, XK_bracketleft, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},282{java_awt_event_KeyEvent_VK_BACK_SLASH, XK_backslash, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},283{java_awt_event_KeyEvent_VK_CLOSE_BRACKET, XK_bracketright, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},284{java_awt_event_KeyEvent_VK_CIRCUMFLEX, XK_asciicircum, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},285{java_awt_event_KeyEvent_VK_UNDERSCORE, XK_underscore, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},286{java_awt_event_KeyEvent_VK_BACK_QUOTE, XK_grave, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},287288{java_awt_event_KeyEvent_VK_BRACELEFT, XK_braceleft, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},289{java_awt_event_KeyEvent_VK_BRACERIGHT, XK_braceright, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},290291{java_awt_event_KeyEvent_VK_INVERTED_EXCLAMATION_MARK, XK_exclamdown, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},292293/* Remaining Numeric Keypad Keys */294{java_awt_event_KeyEvent_VK_NUMPAD0, XK_KP_0, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},295{java_awt_event_KeyEvent_VK_NUMPAD1, XK_KP_1, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},296{java_awt_event_KeyEvent_VK_NUMPAD2, XK_KP_2, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},297{java_awt_event_KeyEvent_VK_NUMPAD3, XK_KP_3, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},298{java_awt_event_KeyEvent_VK_NUMPAD4, XK_KP_4, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},299{java_awt_event_KeyEvent_VK_NUMPAD5, XK_KP_5, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},300{java_awt_event_KeyEvent_VK_NUMPAD6, XK_KP_6, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},301{java_awt_event_KeyEvent_VK_NUMPAD7, XK_KP_7, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},302{java_awt_event_KeyEvent_VK_NUMPAD8, XK_KP_8, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},303{java_awt_event_KeyEvent_VK_NUMPAD9, XK_KP_9, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},304{java_awt_event_KeyEvent_VK_SPACE, XK_KP_Space, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},305{java_awt_event_KeyEvent_VK_TAB, XK_KP_Tab, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},306{java_awt_event_KeyEvent_VK_ENTER, XK_KP_Enter, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},307{java_awt_event_KeyEvent_VK_EQUALS, XK_KP_Equal, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},308{java_awt_event_KeyEvent_VK_EQUALS, XK_R4, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},309{java_awt_event_KeyEvent_VK_MULTIPLY, XK_KP_Multiply, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},310{java_awt_event_KeyEvent_VK_MULTIPLY, XK_F26, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},311{java_awt_event_KeyEvent_VK_MULTIPLY, XK_R6, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},312{java_awt_event_KeyEvent_VK_ADD, XK_KP_Add, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},313{java_awt_event_KeyEvent_VK_SEPARATOR, XK_KP_Separator, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},314{java_awt_event_KeyEvent_VK_SUBTRACT, XK_KP_Subtract, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},315{java_awt_event_KeyEvent_VK_SUBTRACT, XK_F24, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},316{java_awt_event_KeyEvent_VK_DECIMAL, XK_KP_Decimal, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},317{java_awt_event_KeyEvent_VK_DIVIDE, XK_KP_Divide, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},318{java_awt_event_KeyEvent_VK_DIVIDE, XK_F25, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},319{java_awt_event_KeyEvent_VK_DIVIDE, XK_R5, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD},320321/* Function Keys */322{java_awt_event_KeyEvent_VK_F1, XK_F1, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},323{java_awt_event_KeyEvent_VK_F2, XK_F2, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},324{java_awt_event_KeyEvent_VK_F3, XK_F3, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},325{java_awt_event_KeyEvent_VK_F4, XK_F4, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},326{java_awt_event_KeyEvent_VK_F5, XK_F5, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},327{java_awt_event_KeyEvent_VK_F6, XK_F6, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},328{java_awt_event_KeyEvent_VK_F7, XK_F7, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},329{java_awt_event_KeyEvent_VK_F8, XK_F8, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},330{java_awt_event_KeyEvent_VK_F9, XK_F9, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},331{java_awt_event_KeyEvent_VK_F10, XK_F10, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},332{java_awt_event_KeyEvent_VK_F11, XK_F11, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},333{java_awt_event_KeyEvent_VK_F12, XK_F12, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},334335/* Sun vendor-specific version of F11 and F12 */336{java_awt_event_KeyEvent_VK_F11, SunXK_F36, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},337{java_awt_event_KeyEvent_VK_F12, SunXK_F37, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},338339/* X11 keysym names for input method related keys don't always340* match keytop engravings or Java virtual key names, so here we341* only map constants that we've found on real keyboards.342*/343/* Type 5c Japanese keyboard: kakutei */344{java_awt_event_KeyEvent_VK_ACCEPT, XK_Execute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},345/* Type 5c Japanese keyboard: henkan */346{java_awt_event_KeyEvent_VK_CONVERT, XK_Kanji, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},347/* Type 5c Japanese keyboard: nihongo */348{java_awt_event_KeyEvent_VK_INPUT_METHOD_ON_OFF, XK_Henkan_Mode, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},349/* VK_KANA_LOCK is handled separately because it generates the350* same keysym as ALT_GRAPH in spite of its different behavior.351*/352353{java_awt_event_KeyEvent_VK_ALL_CANDIDATES, XK_Zen_Koho, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},354{java_awt_event_KeyEvent_VK_ALPHANUMERIC, XK_Eisu_Shift, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},355{java_awt_event_KeyEvent_VK_ALPHANUMERIC, XK_Eisu_toggle, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},356{java_awt_event_KeyEvent_VK_CODE_INPUT, XK_Kanji_Bangou, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},357{java_awt_event_KeyEvent_VK_FULL_WIDTH, XK_Zenkaku, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},358{java_awt_event_KeyEvent_VK_HALF_WIDTH, XK_Hankaku, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},359{java_awt_event_KeyEvent_VK_HIRAGANA, XK_Hiragana, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},360{java_awt_event_KeyEvent_VK_JAPANESE_HIRAGANA, XK_Hiragana, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},361{java_awt_event_KeyEvent_VK_KATAKANA, XK_Katakana, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},362{java_awt_event_KeyEvent_VK_JAPANESE_KATAKANA, XK_Katakana, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},363{java_awt_event_KeyEvent_VK_JAPANESE_ROMAN, XK_Romaji, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},364{java_awt_event_KeyEvent_VK_KANA, XK_Kana_Shift, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},365{java_awt_event_KeyEvent_VK_KANA_LOCK, XK_Kana_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},366{java_awt_event_KeyEvent_VK_KANJI, XK_Kanji, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},367{java_awt_event_KeyEvent_VK_NONCONVERT, XK_Muhenkan, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},368{java_awt_event_KeyEvent_VK_PREVIOUS_CANDIDATE, XK_Mae_Koho, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},369{java_awt_event_KeyEvent_VK_ROMAN_CHARACTERS, XK_Romaji, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},370371{java_awt_event_KeyEvent_VK_COMPOSE, XK_Multi_key, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},372{java_awt_event_KeyEvent_VK_ALT_GRAPH, XK_Mode_switch, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},373374/* Editing block */375{java_awt_event_KeyEvent_VK_AGAIN, XK_Redo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},376{java_awt_event_KeyEvent_VK_AGAIN, XK_L2, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},377{java_awt_event_KeyEvent_VK_UNDO, XK_Undo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},378{java_awt_event_KeyEvent_VK_UNDO, XK_L4, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},379{java_awt_event_KeyEvent_VK_COPY, XK_L6, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},380{java_awt_event_KeyEvent_VK_PASTE, XK_L8, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},381{java_awt_event_KeyEvent_VK_CUT, XK_L10, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},382{java_awt_event_KeyEvent_VK_FIND, XK_Find, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},383{java_awt_event_KeyEvent_VK_FIND, XK_L9, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},384{java_awt_event_KeyEvent_VK_PROPS, XK_L3, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},385{java_awt_event_KeyEvent_VK_STOP, XK_L1, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},386387/* Sun vendor-specific versions for editing block */388{java_awt_event_KeyEvent_VK_AGAIN, SunXK_Again, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},389{java_awt_event_KeyEvent_VK_UNDO, SunXK_Undo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},390{java_awt_event_KeyEvent_VK_COPY, SunXK_Copy, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},391{java_awt_event_KeyEvent_VK_PASTE, SunXK_Paste, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},392{java_awt_event_KeyEvent_VK_CUT, SunXK_Cut, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},393{java_awt_event_KeyEvent_VK_FIND, SunXK_Find, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},394{java_awt_event_KeyEvent_VK_PROPS, SunXK_Props, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},395{java_awt_event_KeyEvent_VK_STOP, SunXK_Stop, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},396397/* Apollo (HP) vendor-specific versions for editing block */398{java_awt_event_KeyEvent_VK_COPY, apXK_Copy, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},399{java_awt_event_KeyEvent_VK_CUT, apXK_Cut, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},400{java_awt_event_KeyEvent_VK_PASTE, apXK_Paste, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},401402/* Other vendor-specific versions for editing block */403{java_awt_event_KeyEvent_VK_COPY, osfXK_Copy, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},404{java_awt_event_KeyEvent_VK_CUT, osfXK_Cut, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},405{java_awt_event_KeyEvent_VK_PASTE, osfXK_Paste, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},406{java_awt_event_KeyEvent_VK_UNDO, osfXK_Undo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},407408/* Dead key mappings (for European keyboards) */409{java_awt_event_KeyEvent_VK_DEAD_GRAVE, XK_dead_grave, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},410{java_awt_event_KeyEvent_VK_DEAD_ACUTE, XK_dead_acute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},411{java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, XK_dead_circumflex, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},412{java_awt_event_KeyEvent_VK_DEAD_TILDE, XK_dead_tilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},413{java_awt_event_KeyEvent_VK_DEAD_MACRON, XK_dead_macron, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},414{java_awt_event_KeyEvent_VK_DEAD_BREVE, XK_dead_breve, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},415{java_awt_event_KeyEvent_VK_DEAD_ABOVEDOT, XK_dead_abovedot, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},416{java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, XK_dead_diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},417{java_awt_event_KeyEvent_VK_DEAD_ABOVERING, XK_dead_abovering, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},418{java_awt_event_KeyEvent_VK_DEAD_DOUBLEACUTE, XK_dead_doubleacute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},419{java_awt_event_KeyEvent_VK_DEAD_CARON, XK_dead_caron, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},420{java_awt_event_KeyEvent_VK_DEAD_CEDILLA, XK_dead_cedilla, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},421{java_awt_event_KeyEvent_VK_DEAD_OGONEK, XK_dead_ogonek, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},422{java_awt_event_KeyEvent_VK_DEAD_IOTA, XK_dead_iota, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},423{java_awt_event_KeyEvent_VK_DEAD_VOICED_SOUND, XK_dead_voiced_sound, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},424{java_awt_event_KeyEvent_VK_DEAD_SEMIVOICED_SOUND, XK_dead_semivoiced_sound, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},425426/* Sun vendor-specific dead key mappings (for European keyboards) */427{java_awt_event_KeyEvent_VK_DEAD_GRAVE, SunXK_FA_Grave, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},428{java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, SunXK_FA_Circum, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},429{java_awt_event_KeyEvent_VK_DEAD_TILDE, SunXK_FA_Tilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},430{java_awt_event_KeyEvent_VK_DEAD_ACUTE, SunXK_FA_Acute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},431{java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, SunXK_FA_Diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},432{java_awt_event_KeyEvent_VK_DEAD_CEDILLA, SunXK_FA_Cedilla, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},433434/* DEC vendor-specific dead key mappings (for European keyboards) */435{java_awt_event_KeyEvent_VK_DEAD_ABOVERING, DXK_ring_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},436{java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, DXK_circumflex_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},437{java_awt_event_KeyEvent_VK_DEAD_CEDILLA, DXK_cedilla_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},438{java_awt_event_KeyEvent_VK_DEAD_ACUTE, DXK_acute_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},439{java_awt_event_KeyEvent_VK_DEAD_GRAVE, DXK_grave_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},440{java_awt_event_KeyEvent_VK_DEAD_TILDE, DXK_tilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},441{java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, DXK_diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},442443/* Other vendor-specific dead key mappings (for European keyboards) */444{java_awt_event_KeyEvent_VK_DEAD_ACUTE, hpXK_mute_acute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},445{java_awt_event_KeyEvent_VK_DEAD_GRAVE, hpXK_mute_grave, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},446{java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, hpXK_mute_asciicircum, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},447{java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, hpXK_mute_diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},448{java_awt_event_KeyEvent_VK_DEAD_TILDE, hpXK_mute_asciitilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD},449450{java_awt_event_KeyEvent_VK_UNDEFINED, NoSymbol, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN}451};452453static Boolean454keyboardHasKanaLockKey()455{456static Boolean haveResult = FALSE;457static Boolean result = FALSE;458459int32_t minKeyCode, maxKeyCode, keySymsPerKeyCode;460KeySym *keySyms, *keySymsStart, keySym;461int32_t i;462int32_t kanaCount = 0;463464// Solaris doesn't let you swap keyboards without rebooting,465// so there's no need to check for the kana lock key more than once.466if (haveResult) {467return result;468}469470// There's no direct way to determine whether the keyboard has471// a kana lock key. From available keyboard mapping tables, it looks472// like only keyboards with the kana lock key can produce keysyms473// for kana characters. So, as an indirect test, we check for those.474XDisplayKeycodes(awt_display, &minKeyCode, &maxKeyCode);475keySyms = XGetKeyboardMapping(awt_display, minKeyCode, maxKeyCode - minKeyCode + 1, &keySymsPerKeyCode);476keySymsStart = keySyms;477for (i = 0; i < (maxKeyCode - minKeyCode + 1) * keySymsPerKeyCode; i++) {478keySym = *keySyms++;479if ((keySym & 0xff00) == 0x0400) {480kanaCount++;481}482}483XFree(keySymsStart);484485// use a (somewhat arbitrary) minimum so we don't get confused by a stray function key486result = kanaCount > 10;487haveResult = TRUE;488return result;489}490491static void492keysymToAWTKeyCode(KeySym x11Key, jint *keycode, Boolean *mapsToUnicodeChar,493jint *keyLocation)494{495int32_t i;496497// Solaris uses XK_Mode_switch for both the non-locking AltGraph498// and the locking Kana key, but we want to keep them separate for499// KeyEvent.500if (x11Key == XK_Mode_switch && keyboardHasKanaLockKey()) {501*keycode = java_awt_event_KeyEvent_VK_KANA_LOCK;502*mapsToUnicodeChar = FALSE;503*keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN;504return;505}506507for (i = 0;508keymapTable[i].awtKey != java_awt_event_KeyEvent_VK_UNDEFINED;509i++)510{511if (keymapTable[i].x11Key == x11Key) {512*keycode = keymapTable[i].awtKey;513*mapsToUnicodeChar = keymapTable[i].mapsToUnicodeChar;514*keyLocation = keymapTable[i].keyLocation;515return;516}517}518519*keycode = java_awt_event_KeyEvent_VK_UNDEFINED;520*mapsToUnicodeChar = FALSE;521*keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN;522523DTRACE_PRINTLN1("keysymToAWTKeyCode: no key mapping found: keysym = 0x%x", x11Key);524}525526KeySym527awt_getX11KeySym(jint awtKey)528{529int32_t i;530531if (awtKey == java_awt_event_KeyEvent_VK_KANA_LOCK && keyboardHasKanaLockKey()) {532return XK_Mode_switch;533}534535for (i = 0; keymapTable[i].awtKey != 0; i++) {536if (keymapTable[i].awtKey == awtKey) {537return keymapTable[i].x11Key;538}539}540541DTRACE_PRINTLN1("awt_getX11KeySym: no key mapping found: awtKey = 0x%x", awtKey);542return NoSymbol;543}544545/* Called from handleKeyEvent. The purpose of this function is546* to check for a list of vendor-specific keysyms, most of which547* have values greater than 0xFFFF. Most of these keys don't map548* to unicode characters, but some do.549*550* For keys that don't map to unicode characters, the keysym551* is irrelevant at this point. We set the keysym to zero552* to ensure that the switch statement immediately below553* this function call (in adjustKeySym) won't incorrectly act554* on them after the high bits are stripped off.555*556* For keys that do map to unicode characters, we change the keysym557* to the equivalent that is < 0xFFFF558*/559static void560handleVendorKeySyms(XEvent *event, KeySym *keysym)561{562KeySym originalKeysym = *keysym;563564switch (*keysym) {565/* Apollo (HP) vendor-specific from <X11/ap_keysym.h> */566case apXK_Copy:567case apXK_Cut:568case apXK_Paste:569/* DEC vendor-specific from <X11/DECkeysym.h> */570case DXK_ring_accent: /* syn usldead_ring */571case DXK_circumflex_accent:572case DXK_cedilla_accent: /* syn usldead_cedilla */573case DXK_acute_accent:574case DXK_grave_accent:575case DXK_tilde:576case DXK_diaeresis:577/* Sun vendor-specific from <X11/Sunkeysym.h> */578case SunXK_FA_Grave:579case SunXK_FA_Circum:580case SunXK_FA_Tilde:581case SunXK_FA_Acute:582case SunXK_FA_Diaeresis:583case SunXK_FA_Cedilla:584case SunXK_F36: /* Labeled F11 */585case SunXK_F37: /* Labeled F12 */586case SunXK_Props:587case SunXK_Copy:588case SunXK_Open:589case SunXK_Paste:590case SunXK_Cut:591/* Other vendor-specific from HPkeysym.h */592case hpXK_mute_acute: /* syn usldead_acute */593case hpXK_mute_grave: /* syn usldead_grave */594case hpXK_mute_asciicircum: /* syn usldead_asciicircum */595case hpXK_mute_diaeresis: /* syn usldead_diaeresis */596case hpXK_mute_asciitilde: /* syn usldead_asciitilde */597case osfXK_Copy:598case osfXK_Cut:599case osfXK_Paste:600case osfXK_PageUp:601case osfXK_PageDown:602case osfXK_EndLine:603case osfXK_Clear:604case osfXK_Left:605case osfXK_Up:606case osfXK_Right:607case osfXK_Down:608case osfXK_Prior:609case osfXK_Next:610case osfXK_Insert:611case osfXK_Undo:612case osfXK_Help:613*keysym = 0;614break;615/*616* The rest DO map to unicode characters, so translate them617*/618case osfXK_BackSpace:619*keysym = XK_BackSpace;620break;621case osfXK_Escape:622*keysym = XK_Escape;623break;624case osfXK_Cancel:625*keysym = XK_Cancel;626break;627case osfXK_Delete:628*keysym = XK_Delete;629break;630default:631break;632}633634if (originalKeysym != *keysym) {635DTRACE_PRINTLN3("%s originalKeysym=0x%x, keysym=0x%x",636"In handleVendorKeySyms:", originalKeysym, *keysym);637}638}639640/* Called from handleKeyEvent.641* The purpose of this function is to adjust the keysym and XEvent642* keycode for a key event. This is basically a conglomeration of643* bugfixes that require these adjustments.644* Note that none of the keysyms in this function are less than 256.645*/646static void647adjustKeySym(XEvent *event, KeySym *keysym)648{649KeySym originalKeysym = *keysym;650KeyCode originalKeycode = event->xkey.keycode;651652/* We have seen bits set in the high two bytes on Linux,653* which prevents this switch statement from executing654* correctly. Strip off the high order bits.655*/656*keysym &= 0x0000FFFF;657658switch (*keysym) {659case XK_ISO_Left_Tab: /* shift-tab on Linux */660*keysym = XK_Tab;661break;662case XK_KP_Decimal:663*keysym = '.';664break;665case XK_KP_Add:666*keysym = '+';667break;668case XK_F24: /* NumLock off */669case XK_KP_Subtract: /* NumLock on */670*keysym = '-';671break;672case XK_F25: /* NumLock off */673case XK_KP_Divide: /* NumLock on */674*keysym = '/';675break;676case XK_F26: /* NumLock off */677case XK_KP_Multiply: /* NumLock on */678*keysym = '*';679break;680case XK_KP_Equal:681*keysym = '=';682break;683case XK_KP_0:684*keysym = '0';685break;686case XK_KP_1:687*keysym = '1';688break;689case XK_KP_2:690*keysym = '2';691break;692case XK_KP_3:693*keysym = '3';694break;695case XK_KP_4:696*keysym = '4';697break;698case XK_KP_5:699*keysym = '5';700break;701case XK_KP_6:702*keysym = '6';703break;704case XK_KP_7:705*keysym = '7';706break;707case XK_KP_8:708*keysym = '8';709break;710case XK_KP_9:711*keysym = '9';712break;713case XK_KP_Left: /* Bug 4350175 */714*keysym = XK_Left;715event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);716break;717case XK_KP_Up:718*keysym = XK_Up;719event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);720break;721case XK_KP_Right:722*keysym = XK_Right;723event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);724break;725case XK_KP_Down:726*keysym = XK_Down;727event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);728break;729case XK_KP_Home:730*keysym = XK_Home;731event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);732break;733case XK_KP_End:734*keysym = XK_End;735event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);736break;737case XK_KP_Page_Up:738*keysym = XK_Page_Up;739event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);740break;741case XK_KP_Page_Down:742*keysym = XK_Page_Down;743event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);744break;745case XK_KP_Begin:746*keysym = XK_Begin;747event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);748break;749case XK_KP_Insert:750*keysym = XK_Insert;751event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);752break;753case XK_KP_Delete:754*keysym = XK_Delete;755event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym);756break;757case XK_KP_Enter:758*keysym = XK_Linefeed;759event->xkey.keycode = XKeysymToKeycode(awt_display, XK_Return);760break;761default:762break;763}764765if (originalKeysym != *keysym) {766DTRACE_PRINTLN2("In adjustKeySym: originalKeysym=0x%x, keysym=0x%x",767originalKeysym, *keysym);768}769if (originalKeycode != event->xkey.keycode) {770DTRACE_PRINTLN2("In adjustKeySym: originalKeycode=0x%x, keycode=0x%x",771originalKeycode, event->xkey.keycode);772}773}774775/*776* What a sniffer sez?777* Xsun and Xorg if NumLock is on do two thing different:778* keep Keypad key in different places of keysyms array and779* ignore/obey "ModLock is ShiftLock", so we should choose.780* People say, it's right to use behavior and not Vendor tags to decide.781* Maybe. But why these tags were invented, then?782* TODO: use behavior, not tags. Maybe.783*/784static Boolean785isXsunServer(XEvent *event) {786if( awt_ServerDetected ) return awt_IsXsun;787if( (strncmp( ServerVendor( event->xkey.display ), "Sun Microsystems, Inc.", 22) != 0) &&788(strncmp( ServerVendor( event->xkey.display ), "Oracle Corporation", 18) != 0) )789{790awt_ServerDetected = True;791awt_IsXsun = False;792return False;793}794// Now, it's Sun. It still may be Xorg though, eg on Solaris 10, x86.795// Today (2005), VendorRelease of Xorg is a Big Number unlike Xsun.796if( VendorRelease( event->xkey.display ) > 10000 ) {797awt_ServerDetected = True;798awt_IsXsun = False;799return False;800}801awt_ServerDetected = True;802awt_IsXsun = True;803return True;804}805/*806* +kb or -kb ?807*/808static Boolean809isXKBenabled(Display *display) {810int mop, beve, berr;811if( !awt_XKBDetected ) {812/*813* NB: TODO: hope it will return False if XkbIgnoreExtension was called!814*/815awt_UseXKB = XQueryExtension(display, "XKEYBOARD", &mop, &beve, &berr);816awt_XKBDetected = True;817}818return awt_UseXKB;819}820static Boolean821isKPevent(XEvent *event)822{823/*824* Xlib manual, ch 12.7 says, as a first rule for choice of keysym:825* The numlock modifier is on and the second KeySym is a keypad KeySym. In this case,826* if the Shift modifier is on, or if the Lock modifier is on and is interpreted as ShiftLock,827* then the first KeySym is used, otherwise the second KeySym is used.828*829* However, Xsun server does ignore ShiftLock and always takes 3-rd element from an array.830*831* So, is it a keypad keysym?832*/833Boolean bsun = isXsunServer( event );834Boolean bxkb = isXKBenabled( event->xkey.display );835return IsKeypadKey( XKeycodeToKeysym(event->xkey.display, event->xkey.keycode,(bsun && !bxkb ? 2 : 1) ) );836}837static void838dumpKeysymArray(XEvent *event) {839printf(" 0x%X\n",XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 0));840printf(" 0x%X\n",XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 1));841printf(" 0x%X\n",XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 2));842printf(" 0x%X\n",XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 3));843}844/*845* In a next redesign, get rid of this code altogether.846*847*/848static void849handleKeyEventWithNumLockMask_New(XEvent *event, KeySym *keysym)850{851KeySym originalKeysym = *keysym;852if( !isKPevent( event ) ) {853return;854}855if( isXsunServer( event ) && !awt_UseXKB) {856if( (event->xkey.state & ShiftMask) ) { // shift modifier is on857*keysym = XKeycodeToKeysym(event->xkey.display,858event->xkey.keycode, 3);859}else {860*keysym = XKeycodeToKeysym(event->xkey.display,861event->xkey.keycode, 2);862}863} else {864if( (event->xkey.state & ShiftMask) || // shift modifier is on865((event->xkey.state & LockMask) && // lock modifier is on866(awt_ModLockIsShiftLock)) ) { // it is interpreted as ShiftLock867*keysym = XKeycodeToKeysym(event->xkey.display,868event->xkey.keycode, 0);869}else{870*keysym = XKeycodeToKeysym(event->xkey.display,871event->xkey.keycode, 1);872}873}874}875876/* Called from handleKeyEvent.877* The purpose of this function is to make some adjustments to keysyms878* that have been found to be necessary when the NumLock mask is set.879* They come from various bug fixes and rearchitectures.880* This function is meant to be called when881* (event->xkey.state & awt_NumLockMask) is TRUE.882*/883static void884handleKeyEventWithNumLockMask(XEvent *event, KeySym *keysym)885{886KeySym originalKeysym = *keysym;887888#if !defined(__linux__) && !defined(MACOSX)889/* The following code on Linux will cause the keypad keys890* not to echo on JTextField when the NumLock is on. The891* keysyms will be 0, because the last parameter 2 is not defined.892* See Xlib Programming Manual, O'Reilly & Associates, Section893* 9.1.5 "Other Keyboard-handling Routines", "The meaning of894* the keysym list beyond the first two (unmodified, Shift or895* Shift Lock) is not defined."896*/897898/* Translate again with NumLock as modifier. */899/* ECH - I wonder why we think that NumLock corresponds to 2?900On Linux, we've seen xmodmap -pm yield mod2 as NumLock,901but I don't know that it will be for every configuration.902Perhaps using the index (modn in awt_MToolkit.c:setup_modifier_map)903would be more correct.904*/905*keysym = XKeycodeToKeysym(event->xkey.display,906event->xkey.keycode, 2);907if (originalKeysym != *keysym) {908DTRACE_PRINTLN3("%s originalKeysym=0x%x, keysym=0x%x",909"In handleKeyEventWithNumLockMask ifndef linux:",910originalKeysym, *keysym);911}912#endif913914/* Note: the XK_R? key assignments are for Type 4 kbds */915switch (*keysym) {916case XK_R13:917*keysym = XK_KP_1;918break;919case XK_R14:920*keysym = XK_KP_2;921break;922case XK_R15:923*keysym = XK_KP_3;924break;925case XK_R10:926*keysym = XK_KP_4;927break;928case XK_R11:929*keysym = XK_KP_5;930break;931case XK_R12:932*keysym = XK_KP_6;933break;934case XK_R7:935*keysym = XK_KP_7;936break;937case XK_R8:938*keysym = XK_KP_8;939break;940case XK_R9:941*keysym = XK_KP_9;942break;943case XK_KP_Insert:944*keysym = XK_KP_0;945break;946case XK_KP_Delete:947*keysym = XK_KP_Decimal;948break;949case XK_R4:950*keysym = XK_KP_Equal; /* Type 4 kbd */951break;952case XK_R5:953*keysym = XK_KP_Divide;954break;955case XK_R6:956*keysym = XK_KP_Multiply;957break;958/*959* Need the following keysym changes for Linux key releases.960* Sometimes the modifier state gets messed up, so we get a961* KP_Left when we should get a KP_4, for example.962* XK_KP_Insert and XK_KP_Delete were already handled above.963*/964case XK_KP_Left:965*keysym = XK_KP_4;966break;967case XK_KP_Up:968*keysym = XK_KP_8;969break;970case XK_KP_Right:971*keysym = XK_KP_6;972break;973case XK_KP_Down:974*keysym = XK_KP_2;975break;976case XK_KP_Home:977*keysym = XK_KP_7;978break;979case XK_KP_End:980*keysym = XK_KP_1;981break;982case XK_KP_Page_Up:983*keysym = XK_KP_9;984break;985case XK_KP_Page_Down:986*keysym = XK_KP_3;987break;988case XK_KP_Begin:989*keysym = XK_KP_5;990break;991default:992break;993}994995if (originalKeysym != *keysym) {996DTRACE_PRINTLN3("%s originalKeysym=0x%x, keysym=0x%x",997"In handleKeyEventWithNumLockMask:", originalKeysym, *keysym);998}999}100010011002/* This function is called as the keyChar parameter of a call to1003* awt_post_java_key_event. It depends on being called after adjustKeySym.1004*1005* This function just handles a few values where we know that the1006* keysym is not the same as the unicode value. For values that1007* we don't handle explicitly, we just cast the keysym to a jchar.1008* Most of the real mapping work that gets the correct keysym is handled1009* in the mapping table, adjustKeySym, etc.1010*1011* XXX1012* Maybe we should enumerate the keysyms for which we have a mapping1013* in the keyMap, but that don't map to unicode chars, and return1014* CHAR_UNDEFINED? Then use the buffer value from XLookupString1015* instead of the keysym as the keychar when posting. Then we don't1016* need to test using mapsToUnicodeChar. That way, we would post keyTyped1017* for all the chars that generate unicode chars, including LATIN2-4, etc.1018* Note: what does the buffer from XLookupString contain when1019* the character is a non-printable unicode character like Cancel or Delete?1020*/1021jchar1022keySymToUnicodeCharacter(KeySym keysym) {1023jchar unicodeValue = (jchar) keysym;10241025switch (keysym) {1026case XK_BackSpace:1027case XK_Tab:1028case XK_Linefeed:1029case XK_Escape:1030case XK_Delete:1031/* Strip off highorder bits defined in xkeysymdef.h1032* I think doing this converts them to values that1033* we can cast to jchars and use as java keychars.1034*/1035unicodeValue = (jchar) (keysym & 0x007F);1036break;1037case XK_Return:1038unicodeValue = (jchar) 0x000a; /* the unicode char for Linefeed */1039break;1040case XK_Cancel:1041unicodeValue = (jchar) 0x0018; /* the unicode char for Cancel */1042break;1043default:1044break;1045}10461047if (unicodeValue != (jchar)keysym) {1048DTRACE_PRINTLN3("%s originalKeysym=0x%x, keysym=0x%x",1049"In keysymToUnicode:", keysym, unicodeValue);1050}10511052return unicodeValue;1053}105410551056void1057awt_post_java_key_event(JNIEnv *env, jobject peer, jint id,1058jlong when, jint keyCode, jchar keyChar, jint keyLocation, jint state, XEvent * event)1059{1060JNU_CallMethodByName(env, NULL, peer, "postKeyEvent", "(IJICIIJI)V", id,1061when, keyCode, keyChar, keyLocation, state, ptr_to_jlong(event), (jint)sizeof(XEvent));1062} /* awt_post_java_key_event() */1063106410651066JNIEXPORT jint JNICALL1067Java_sun_awt_X11_XWindow_getAWTKeyCodeForKeySym(JNIEnv *env, jclass clazz, jint keysym) {1068jint keycode = java_awt_event_KeyEvent_VK_UNDEFINED;1069Boolean mapsToUnicodeChar;1070jint keyLocation;1071keysymToAWTKeyCode(keysym, &keycode, &mapsToUnicodeChar, &keyLocation);1072return keycode;1073}10741075JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XWindow_haveCurrentX11InputMethodInstance1076(JNIEnv *env, jobject object) {1077/*printf("Java_sun_awt_X11_XWindow_haveCurrentX11InputMethodInstance: %s\n", (currentX11InputMethodInstance==NULL? "NULL":" notnull"));1078*/1079return currentX11InputMethodInstance != NULL ? JNI_TRUE : JNI_FALSE;1080}10811082JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XWindow_x11inputMethodLookupString1083(JNIEnv *env, jobject object, jlong event, jlongArray keysymArray) {1084KeySym keysym = NoSymbol;1085Boolean boo;1086/* keysymArray (and testbuf[]) have dimension 2 because we put there two1087* perhaps different values of keysyms.1088* XXX: not anymore at the moment, but I'll still keep them as arrays1089* for a while. If in the course of testing we will be satisfied with1090* a current single result from awt_x11inputmethod_lookupString, we'll1091* change this.1092*/1093jlong testbuf[2];10941095testbuf[1]=0;10961097boo = awt_x11inputmethod_lookupString((XKeyPressedEvent*)jlong_to_ptr(event), &keysym);1098testbuf[0] = keysym;10991100(*env)->SetLongArrayRegion(env, keysymArray, 0, 2, (jlong *)(testbuf));1101return boo ? JNI_TRUE : JNI_FALSE;1102}110311041105extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs;11061107/*1108* Class: Java_sun_awt_X11_XWindow_getNativeColor1109* Method: getNativeColor1110* Signature (Ljava/awt/Color;Ljava/awt/GraphicsConfiguration;)I1111*/1112JNIEXPORT jint JNICALL Java_sun_awt_X11_XWindow_getNativeColor1113(JNIEnv *env, jobject this, jobject color, jobject gc_object) {1114AwtGraphicsConfigDataPtr adata;1115/* fire warning because JNU_GetLongFieldAsPtr casts jlong to (void *) */1116adata = (AwtGraphicsConfigDataPtr) JNU_GetLongFieldAsPtr(env, gc_object, x11GraphicsConfigIDs.aData);1117return awtJNI_GetColorForVis(env, color, adata);1118}11191120/* syncTopLevelPos() is necessary to insure that the window manager has in1121* fact moved us to our final position relative to the reParented WM window.1122* We have noted a timing window which our shell has not been moved so we1123* screw up the insets thinking they are 0,0. Wait (for a limited period of1124* time to let the WM hava a chance to move us1125*/1126void syncTopLevelPos( Display *d, Window w, XWindowAttributes *winAttr ) {1127int32_t i = 0;1128do {1129XGetWindowAttributes( d, w, winAttr );1130/* Sometimes we get here before the WM has updated the1131** window data struct with the correct position. Loop1132** until we get a non-zero position.1133*/1134if ((winAttr->x != 0) || (winAttr->y != 0)) {1135break;1136}1137else {1138/* What we really want here is to sync with the WM,1139** but there's no explicit way to do this, so we1140** call XSync for a delay.1141*/1142XSync(d, False);1143}1144} while (i++ < 50);1145}11461147static Window getTopWindow(Window win, Window *rootWin)1148{1149Window root=None, current_window=win, parent=None, *ignore_children=NULL;1150Window prev_window=None;1151unsigned int ignore_uint=0;1152Status status = 0;11531154if (win == None) return None;1155do {1156status = XQueryTree(awt_display,1157current_window,1158&root,1159&parent,1160&ignore_children,1161&ignore_uint);1162XFree(ignore_children);1163if (status == 0) return None;1164prev_window = current_window;1165current_window = parent;1166} while (parent != root);1167*rootWin = root;1168return prev_window;1169}11701171JNIEXPORT jlong JNICALL Java_sun_awt_X11_XWindow_getTopWindow1172(JNIEnv *env, jclass clazz, jlong win, jlong rootWin) {1173return getTopWindow((Window) win, (Window*) jlong_to_ptr(rootWin));1174}11751176static void1177getWMInsets1178(Window window, int *left, int *top, int *right, int *bottom, int *border) {1179// window is event->xreparent.window1180Window topWin = None, rootWin = None, containerWindow = None;1181XWindowAttributes winAttr, topAttr;1182int screenX, screenY;1183topWin = getTopWindow(window, &rootWin);1184syncTopLevelPos(awt_display, topWin, &topAttr);1185// (screenX, screenY) is (0,0) of the reparented window1186// converted to screen coordinates.1187XTranslateCoordinates(awt_display, window, rootWin,11880,0, &screenX, &screenY, &containerWindow);1189*left = screenX - topAttr.x - topAttr.border_width;1190*top = screenY - topAttr.y - topAttr.border_width;1191XGetWindowAttributes(awt_display, window, &winAttr);1192*right = topAttr.width - ((winAttr.width) + *left);1193*bottom = topAttr.height - ((winAttr.height) + *top);1194*border = topAttr.border_width;1195}11961197JNIEXPORT void JNICALL Java_sun_awt_X11_XWindow_getWMInsets1198(JNIEnv *env, jclass clazz, jlong window, jlong left, jlong top, jlong right, jlong bottom, jlong border) {1199getWMInsets((Window) window,1200(int*) jlong_to_ptr(left),1201(int*) jlong_to_ptr(top),1202(int*) jlong_to_ptr(right),1203(int*) jlong_to_ptr(bottom),1204(int*) jlong_to_ptr(border));1205}12061207static void1208getWindowBounds1209(Window window, int *x, int *y, int *width, int *height) {1210XWindowAttributes winAttr;1211XSync(awt_display, False);1212XGetWindowAttributes(awt_display, window, &winAttr);1213*x = winAttr.x;1214*y = winAttr.y;1215*width = winAttr.width;1216*height = winAttr.height;1217}12181219JNIEXPORT void JNICALL Java_sun_awt_X11_XWindow_getWindowBounds1220(JNIEnv *env, jclass clazz, jlong window, jlong x, jlong y, jlong width, jlong height) {1221getWindowBounds((Window) window, (int*) jlong_to_ptr(x), (int*) jlong_to_ptr(y),1222(int*) jlong_to_ptr(width), (int*) jlong_to_ptr(height));1223}12241225JNIEXPORT void JNICALL Java_sun_awt_X11_XWindow_setSizeHints1226(JNIEnv *env, jclass clazz, jlong window, jlong x, jlong y, jlong width, jlong height) {1227XSizeHints *size_hints = XAllocSizeHints();1228size_hints->flags = USPosition | PPosition | PSize;1229size_hints->x = (int)x;1230size_hints->y = (int)y;1231size_hints->width = (int)width;1232size_hints->height = (int)height;1233XSetWMNormalHints(awt_display, (Window)window, size_hints);1234XFree((char*)size_hints);1235}123612371238JNIEXPORT void JNICALL1239Java_sun_awt_X11_XWindow_initIDs1240(JNIEnv *env, jclass clazz)1241{1242char *ptr = NULL;1243windowID = (*env)->GetFieldID(env, clazz, "window", "J");1244CHECK_NULL(windowID);1245targetID = (*env)->GetFieldID(env, clazz, "target", "Ljava/awt/Component;");1246CHECK_NULL(targetID);1247graphicsConfigID = (*env)->GetFieldID(env, clazz, "graphicsConfig", "Lsun/awt/X11GraphicsConfig;");1248CHECK_NULL(graphicsConfigID);1249drawStateID = (*env)->GetFieldID(env, clazz, "drawState", "I");1250CHECK_NULL(drawStateID);1251ptr = getenv("_AWT_USE_TYPE4_PATCH");1252if( ptr != NULL && ptr[0] != 0 ) {1253if( strncmp("true", ptr, 4) == 0 ) {1254awt_UseType4Patch = True;1255}else if( strncmp("false", ptr, 5) == 0 ) {1256awt_UseType4Patch = False;1257}1258}1259}12601261JNIEXPORT jint JNICALL1262Java_sun_awt_X11_XWindow_getKeySymForAWTKeyCode(JNIEnv* env, jclass clazz, jint keycode) {1263return awt_getX11KeySym(keycode);1264}126512661267