< prev index next >

src/solaris/classes/sun/awt/X11/XWindow.java

Print this page
rev 1566 : 6680988: KeyEvent is still missing VK values for many keyboards
Summary: 2 new methods and some fields added to KeyEvent, plus hash of constants introduced
Reviewed-by: art
rev 1570 : 8000626: Implement dead key detection for KeyEvent on Linux
Reviewed-by: kizune
rev 1571 : 8010297: Missing isLoggable() checks in logging code
Summary: Add isLoggable() checks
Reviewed-by: anthony, mchung, serb
Contributed-by: Laurent Bourges <bourges.laurent@gmail.com>

*** 1,7 **** /* ! * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 385,395 **** public void run() { AWTAccessor.getAWTEventAccessor().setPosted(e); ((Component)e.getSource()).dispatchEvent(e); } }, PeerEvent.ULTIMATE_PRIORITY_EVENT); ! if (focusLog.isLoggable(Level.FINER) && (e instanceof FocusEvent)) focusLog.finer("Sending " + e); XToolkit.postEvent(XToolkit.targetToAppContext(e.getSource()), pe); } /* --- 385,397 ---- public void run() { AWTAccessor.getAWTEventAccessor().setPosted(e); ((Component)e.getSource()).dispatchEvent(e); } }, PeerEvent.ULTIMATE_PRIORITY_EVENT); ! if (focusLog.isLoggable(Level.FINER) && (e instanceof FocusEvent)) { ! focusLog.finer("Sending " + e); ! } XToolkit.postEvent(XToolkit.targetToAppContext(e.getSource()), pe); } /*
*** 629,639 **** super.handleButtonPressRelease(xev); XButtonEvent xbe = xev.get_xbutton(); if (isEventDisabled(xev)) { return; } ! if (eventLog.isLoggable(Level.FINE)) eventLog.fine(xbe.toString()); long when; int modifiers; boolean popupTrigger = false; int button=0; boolean wheel_mouse = false; --- 631,643 ---- super.handleButtonPressRelease(xev); XButtonEvent xbe = xev.get_xbutton(); if (isEventDisabled(xev)) { return; } ! if (eventLog.isLoggable(Level.FINE)) { ! eventLog.fine(xbe.toString()); ! } long when; int modifiers; boolean popupTrigger = false; int button=0; boolean wheel_mouse = false;
*** 653,665 **** if (type == XlibWrapper.ButtonPress) { XWindow lastWindow = (lastWindowRef != null) ? ((XWindow)lastWindowRef.get()):(null); /* multiclick checking */ ! if (eventLog.isLoggable(Level.FINEST)) eventLog.finest("lastWindow = " + lastWindow + ", lastButton " + lastButton + ", lastTime " + lastTime + ", multiClickTime " + XToolkit.getMultiClickTime()); if (lastWindow == this && lastButton == lbutton && (when - lastTime) < XToolkit.getMultiClickTime()) { clickCount++; } else { clickCount = 1; lastWindowRef = new WeakReference(this); --- 657,671 ---- if (type == XlibWrapper.ButtonPress) { XWindow lastWindow = (lastWindowRef != null) ? ((XWindow)lastWindowRef.get()):(null); /* multiclick checking */ ! if (eventLog.isLoggable(Level.FINEST)) { ! eventLog.finest("lastWindow = " + lastWindow + ", lastButton " + lastButton + ", lastTime " + lastTime + ", multiClickTime " + XToolkit.getMultiClickTime()); + } if (lastWindow == this && lastButton == lbutton && (when - lastTime) < XToolkit.getMultiClickTime()) { clickCount++; } else { clickCount = 1; lastWindowRef = new WeakReference(this);
*** 826,836 **** public void handleXCrossingEvent(XEvent xev) { super.handleXCrossingEvent(xev); XCrossingEvent xce = xev.get_xcrossing(); ! if (eventLog.isLoggable(Level.FINEST)) eventLog.finest(xce.toString()); if (xce.get_type() == XConstants.EnterNotify) { enterNotify(xce.get_window()); } else { // LeaveNotify: leaveNotify(xce.get_window()); --- 832,844 ---- public void handleXCrossingEvent(XEvent xev) { super.handleXCrossingEvent(xev); XCrossingEvent xce = xev.get_xcrossing(); ! if (eventLog.isLoggable(Level.FINEST)) { ! eventLog.finest(xce.toString()); ! } if (xce.get_type() == XConstants.EnterNotify) { enterNotify(xce.get_window()); } else { // LeaveNotify: leaveNotify(xce.get_window());
*** 911,921 **** --- 919,931 ---- MouseEvent me = new MouseEvent(compWithMouse, MouseEvent.MOUSE_EXITED, jWhen, modifiers, xce.get_x(), xce.get_y(), xce.get_x_root(), xce.get_y_root(), clickCount, popupTrigger, MouseEvent.NOBUTTON); postEventToEventQueue(me); + if (eventLog.isLoggable(Level.FINEST)) { eventLog.finest("Clearing last window ref"); + } lastWindowRef = null; } if (xce.get_type() == EnterNotify) { MouseEvent me = new MouseEvent(getEventSource(), MouseEvent.MOUSE_ENTERED, jWhen, modifiers, xce.get_x(), xce.get_y(), xce.get_x_root(), xce.get_y_root(), clickCount,
*** 976,1025 **** ce = new ComponentEvent(target, ComponentEvent.COMPONENT_HIDDEN); postEventToEventQueue(ce); } private void dumpKeysymArray(XKeyEvent ev) { keyEventLog.fine(" "+Long.toHexString(XlibWrapper.XKeycodeToKeysym(XToolkit.getDisplay(), ev.get_keycode(), 0))+ "\n "+Long.toHexString(XlibWrapper.XKeycodeToKeysym(XToolkit.getDisplay(), ev.get_keycode(), 1))+ "\n "+Long.toHexString(XlibWrapper.XKeycodeToKeysym(XToolkit.getDisplay(), ev.get_keycode(), 2))+ "\n "+Long.toHexString(XlibWrapper.XKeycodeToKeysym(XToolkit.getDisplay(), ev.get_keycode(), 3))); } /** Return unicode character or 0 if no correspondent character found. Parameter is a keysym basically from keysymdef.h XXX: how about vendor keys? Is there some with Unicode value and not in the list? */ ! char keysymToUnicode( long keysym, int state ) { return XKeysym.convertKeysym( keysym, state ); } int keyEventType2Id( int xEventType ) { return xEventType == XConstants.KeyPress ? java.awt.event.KeyEvent.KEY_PRESSED : xEventType == XConstants.KeyRelease ? java.awt.event.KeyEvent.KEY_RELEASED : 0; } static private long xkeycodeToKeysym(XKeyEvent ev) { return XKeysym.getKeysym( ev ); } void logIncomingKeyEvent(XKeyEvent ev) { keyEventLog.fine("--XWindow.java:handleKeyEvent:"+ev); dumpKeysymArray(ev); keyEventLog.fine("XXXXXXXXXXXXXX javakeycode will be most probably:0x"+ Integer.toHexString(XKeysym.getJavaKeycodeOnly(ev))); } public void handleKeyPress(XEvent xev) { super.handleKeyPress(xev); XKeyEvent ev = xev.get_xkey(); ! if (eventLog.isLoggable(Level.FINE)) eventLog.fine(ev.toString()); if (isEventDisabled(xev)) { return; } handleKeyPress(ev); } // called directly from this package, unlike handleKeyRelease. // un-final it if you need to override it in a subclass. final void handleKeyPress(XKeyEvent ev) { int keycode = java.awt.event.KeyEvent.VK_UNDEFINED; long keysym[] = new long[2]; ! char unicodeKey = 0; keysym[0] = NoSymbol; if (keyEventLog.isLoggable(Level.FINE)) { logIncomingKeyEvent( ev ); } --- 986,1050 ---- ce = new ComponentEvent(target, ComponentEvent.COMPONENT_HIDDEN); postEventToEventQueue(ce); } private void dumpKeysymArray(XKeyEvent ev) { + if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine(" "+Long.toHexString(XlibWrapper.XKeycodeToKeysym(XToolkit.getDisplay(), ev.get_keycode(), 0))+ "\n "+Long.toHexString(XlibWrapper.XKeycodeToKeysym(XToolkit.getDisplay(), ev.get_keycode(), 1))+ "\n "+Long.toHexString(XlibWrapper.XKeycodeToKeysym(XToolkit.getDisplay(), ev.get_keycode(), 2))+ "\n "+Long.toHexString(XlibWrapper.XKeycodeToKeysym(XToolkit.getDisplay(), ev.get_keycode(), 3))); } + } /** Return unicode character or 0 if no correspondent character found. Parameter is a keysym basically from keysymdef.h XXX: how about vendor keys? Is there some with Unicode value and not in the list? */ ! int keysymToUnicode( long keysym, int state ) { return XKeysym.convertKeysym( keysym, state ); } int keyEventType2Id( int xEventType ) { return xEventType == XConstants.KeyPress ? java.awt.event.KeyEvent.KEY_PRESSED : xEventType == XConstants.KeyRelease ? java.awt.event.KeyEvent.KEY_RELEASED : 0; } static private long xkeycodeToKeysym(XKeyEvent ev) { return XKeysym.getKeysym( ev ); } + private long xkeycodeToPrimaryKeysym(XKeyEvent ev) { + return XKeysym.xkeycode2primary_keysym( ev ); + } + static private int primaryUnicode2JavaKeycode(int uni) { + return (uni > 0? sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(uni) : 0); + //return (uni > 0? uni + 0x01000000 : 0); + } void logIncomingKeyEvent(XKeyEvent ev) { + if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine("--XWindow.java:handleKeyEvent:"+ev); + } dumpKeysymArray(ev); + if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine("XXXXXXXXXXXXXX javakeycode will be most probably:0x"+ Integer.toHexString(XKeysym.getJavaKeycodeOnly(ev))); } + } public void handleKeyPress(XEvent xev) { super.handleKeyPress(xev); XKeyEvent ev = xev.get_xkey(); ! if (eventLog.isLoggable(Level.FINE)) { ! eventLog.fine(ev.toString()); ! } if (isEventDisabled(xev)) { return; } handleKeyPress(ev); } // called directly from this package, unlike handleKeyRelease. // un-final it if you need to override it in a subclass. final void handleKeyPress(XKeyEvent ev) { int keycode = java.awt.event.KeyEvent.VK_UNDEFINED; long keysym[] = new long[2]; ! int unicodeKey = 0; keysym[0] = NoSymbol; if (keyEventLog.isLoggable(Level.FINE)) { logIncomingKeyEvent( ev ); }
*** 1038,1048 **** if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine("--XWindow.java XIM did NOT process event, hex keysym:"+Long.toHexString(keysym[0])+"\n"+ " unicode key:"+Integer.toHexString((int)unicodeKey)); } } ! }else { // No input method instance found. For example, there's a Java Input Method. // Produce do-it-yourself keysym and perhaps unicode character. keysym[0] = xkeycodeToKeysym(ev); unicodeKey = keysymToUnicode( keysym[0], ev.get_state() ); if (keyEventLog.isLoggable(Level.FINE)) { --- 1063,1073 ---- if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine("--XWindow.java XIM did NOT process event, hex keysym:"+Long.toHexString(keysym[0])+"\n"+ " unicode key:"+Integer.toHexString((int)unicodeKey)); } } ! } else { // No input method instance found. For example, there's a Java Input Method. // Produce do-it-yourself keysym and perhaps unicode character. keysym[0] = xkeycodeToKeysym(ev); unicodeKey = keysymToUnicode( keysym[0], ev.get_state() ); if (keyEventLog.isLoggable(Level.FINE)) {
*** 1056,1144 **** // // Press event might be not processed to this time because // (1) either XIM could not handle it or // (2) it was Latin 1:1 mapping. // ! XKeysym.Keysym2JavaKeycode jkc = XKeysym.getJavaKeycode(ev); if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine(">>>Fire Event:"+ (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+ "jkeycode:decimal="+jkc.getJavaKeycode()+ ! ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; " ); } postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED, ev.get_time(), ! jkc.getJavaKeycode(), (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), ! ev.get_state(),ev.getPData(), XKeyEvent.getSize()); ! if( unicodeKey > 0 ) { keyEventLog.fine("fire _TYPED on "+unicodeKey); postKeyEvent( java.awt.event.KeyEvent.KEY_TYPED, ev.get_time(), java.awt.event.KeyEvent.VK_UNDEFINED, unicodeKey, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN, ! ev.get_state(),ev.getPData(), XKeyEvent.getSize()); } } public void handleKeyRelease(XEvent xev) { super.handleKeyRelease(xev); XKeyEvent ev = xev.get_xkey(); ! if (eventLog.isLoggable(Level.FINE)) eventLog.fine(ev.toString()); if (isEventDisabled(xev)) { return; } handleKeyRelease(ev); } // un-private it if you need to call it from elsewhere private void handleKeyRelease(XKeyEvent ev) { int keycode = java.awt.event.KeyEvent.VK_UNDEFINED; ! long keysym[] = new long[2]; ! char unicodeKey = 0; ! keysym[0] = NoSymbol; if (keyEventLog.isLoggable(Level.FINE)) { logIncomingKeyEvent( ev ); } // Keysym should be converted to Unicode, if possible and necessary, // and Java KeyEvent keycode should be calculated. // For release we should post released event. // ! XKeysym.Keysym2JavaKeycode jkc = XKeysym.getJavaKeycode(ev); if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine(">>>Fire Event:"+ (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+ "jkeycode:decimal="+jkc.getJavaKeycode()+ ! ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; " ); } // We obtain keysym from IM and derive unicodeKey from it for KeyPress only. // We used to cache that value and retrieve it on KeyRelease, // but in case for example of a dead key+vowel pair, a vowel after a deadkey // might never be cached before. // Also, switching between keyboard layouts, we might cache a wrong letter. // That's why we use the same procedure as if there was no IM instance: do-it-yourself unicode. unicodeKey = keysymToUnicode( xkeycodeToKeysym(ev), ev.get_state() ); postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED, ev.get_time(), ! jkc.getJavaKeycode(), (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), ! ev.get_state(),ev.getPData(), XKeyEvent.getSize()); } /* * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are * unreliable, since mapping changes can happen for a virtual desktop --- 1081,1217 ---- // // Press event might be not processed to this time because // (1) either XIM could not handle it or // (2) it was Latin 1:1 mapping. // ! // Preserve modifiers to get Java key code for dead keys ! boolean isDeadKey = isDeadKey(keysym[0]); ! XKeysym.Keysym2JavaKeycode jkc = isDeadKey ? XKeysym.getJavaKeycode(keysym[0]) ! : XKeysym.getJavaKeycode(ev); if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } + + // Take the first keysym from a keysym array associated with the XKeyevent + // and convert it to Unicode. Then, even if a Java keycode for the keystroke + // is undefined, we still have a guess of what has been engraved on a keytop. + int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0); + if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine(">>>Fire Event:"+ (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+ "jkeycode:decimal="+jkc.getJavaKeycode()+ ! ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+ ! " legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+ ! ", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; " ); } + + int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible + int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ? + primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) : + jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED, ev.get_time(), ! isDeadKey ? jkeyExtended : jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), ! ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), ! unicodeFromPrimaryKeysym, ! jkeyExtended); ! ! ! if (unicodeKey > 0 && !isDeadKey) { ! if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine("fire _TYPED on "+unicodeKey); + } postKeyEvent( java.awt.event.KeyEvent.KEY_TYPED, ev.get_time(), java.awt.event.KeyEvent.VK_UNDEFINED, unicodeKey, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN, ! ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)0, ! unicodeFromPrimaryKeysym, ! java.awt.event.KeyEvent.VK_UNDEFINED); ! } } public void handleKeyRelease(XEvent xev) { super.handleKeyRelease(xev); XKeyEvent ev = xev.get_xkey(); ! if (eventLog.isLoggable(Level.FINE)) { ! eventLog.fine(ev.toString()); ! } if (isEventDisabled(xev)) { return; } handleKeyRelease(ev); } // un-private it if you need to call it from elsewhere private void handleKeyRelease(XKeyEvent ev) { int keycode = java.awt.event.KeyEvent.VK_UNDEFINED; ! int unicodeKey = 0; if (keyEventLog.isLoggable(Level.FINE)) { logIncomingKeyEvent( ev ); } // Keysym should be converted to Unicode, if possible and necessary, // and Java KeyEvent keycode should be calculated. // For release we should post released event. // ! // Preserve modifiers to get Java key code for dead keys ! long keysym = xkeycodeToKeysym(ev); ! boolean isDeadKey = isDeadKey(keysym); ! XKeysym.Keysym2JavaKeycode jkc = isDeadKey ? XKeysym.getJavaKeycode(keysym) ! : XKeysym.getJavaKeycode(ev); if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } if (keyEventLog.isLoggable(Level.FINE)) { keyEventLog.fine(">>>Fire Event:"+ (ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+ "jkeycode:decimal="+jkc.getJavaKeycode()+ ! ", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+ ! " legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+ ! ", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; " ); } // We obtain keysym from IM and derive unicodeKey from it for KeyPress only. // We used to cache that value and retrieve it on KeyRelease, // but in case for example of a dead key+vowel pair, a vowel after a deadkey // might never be cached before. // Also, switching between keyboard layouts, we might cache a wrong letter. // That's why we use the same procedure as if there was no IM instance: do-it-yourself unicode. unicodeKey = keysymToUnicode( xkeycodeToKeysym(ev), ev.get_state() ); + // Take a first keysym from a keysym array associated with the XKeyevent + // and convert it to Unicode. Then, even if Java keycode for the keystroke + // is undefined, we still will have a guess of what was engraved on a keytop. + int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0); + + int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible + int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ? + primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) : + jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED, ev.get_time(), ! isDeadKey ? jkeyExtended : jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), ! ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), ! unicodeFromPrimaryKeysym, ! jkeyExtended); ! ! ! } + + private boolean isDeadKey(long keysym){ + return XKeySymConstants.XK_dead_grave <= keysym && keysym <= XKeySymConstants.XK_dead_semivoiced_sound; } /* * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are * unreliable, since mapping changes can happen for a virtual desktop
*** 1330,1350 **** static void setBData(KeyEvent e, byte[] data) { AWTAccessor.getAWTEventAccessor().setBData(e, data); } ! public void postKeyEvent(int id, long when, int keyCode, char keyChar, ! int keyLocation, int state, long event, int eventSize) { long jWhen = XToolkit.nowMillisUTC_offset(when); int modifiers = getModifiers(state, 0, keyCode); KeyEvent ke = new KeyEvent((Component)getEventSource(), id, jWhen, ! modifiers, keyCode, keyChar, keyLocation); if (event != 0) { byte[] data = Native.toBytes(event, eventSize); setBData(ke, data); } postEventToEventQueue(ke); } static native int getAWTKeyCodeForKeySym(int keysym); static native int getKeySymForAWTKeyCode(int keycode); --- 1403,1431 ---- static void setBData(KeyEvent e, byte[] data) { AWTAccessor.getAWTEventAccessor().setBData(e, data); } ! public void postKeyEvent(int id, long when, int keyCode, int keyChar, ! int keyLocation, int state, long event, int eventSize, long rawCode, ! int unicodeFromPrimaryKeysym, int extendedKeyCode) ! { long jWhen = XToolkit.nowMillisUTC_offset(when); int modifiers = getModifiers(state, 0, keyCode); + KeyEvent ke = new KeyEvent((Component)getEventSource(), id, jWhen, ! modifiers, keyCode, (char)keyChar, keyLocation); if (event != 0) { byte[] data = Native.toBytes(event, eventSize); setBData(ke, data); } + + AWTAccessor.KeyEventAccessor kea = AWTAccessor.getKeyEventAccessor(); + kea.setRawCode(ke, rawCode); + kea.setPrimaryLevelUnicode(ke, (long)unicodeFromPrimaryKeysym); + kea.setExtendedKeyCode(ke, (long)extendedKeyCode); postEventToEventQueue(ke); } static native int getAWTKeyCodeForKeySym(int keysym); static native int getKeySymForAWTKeyCode(int keycode);
< prev index next >