27 28 import sun.awt.SunToolkit; 29 import sun.lwawt.LWWindowPeer; 30 import sun.lwawt.PlatformEventNotifier; 31 32 import java.awt.Toolkit; 33 import java.awt.event.MouseEvent; 34 import java.awt.event.InputEvent; 35 import java.awt.event.MouseWheelEvent; 36 import java.awt.event.KeyEvent; 37 import java.util.Locale; 38 39 /** 40 * Translates NSEvents/NPCocoaEvents into AWT events. 41 */ 42 final class CPlatformResponder { 43 44 private final PlatformEventNotifier eventNotifier; 45 private final boolean isNpapiCallback; 46 private int lastKeyPressCode = KeyEvent.VK_UNDEFINED; 47 48 CPlatformResponder(final PlatformEventNotifier eventNotifier, 49 final boolean isNpapiCallback) { 50 this.eventNotifier = eventNotifier; 51 this.isNpapiCallback = isNpapiCallback; 52 } 53 54 /** 55 * Handles mouse events. 56 */ 57 void handleMouseEvent(int eventType, int modifierFlags, int buttonNumber, 58 int clickCount, int x, int y, int absoluteX, 59 int absoluteY) { 60 final SunToolkit tk = (SunToolkit)Toolkit.getDefaultToolkit(); 61 if ((buttonNumber > 2 && !tk.areExtraMouseButtonsEnabled()) 62 || buttonNumber > tk.getNumberOfButtons() - 1) { 63 return; 64 } 65 66 int jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(eventType) : 73 jeventType != MouseEvent.MOUSE_ENTERED && 74 jeventType != MouseEvent.MOUSE_EXITED) 75 { 76 jbuttonNumber = NSEvent.nsToJavaButton(buttonNumber); 77 jclickCount = clickCount; 78 } 79 80 int jmodifiers = NSEvent.nsToJavaMouseModifiers(buttonNumber, 81 modifierFlags); 82 boolean jpopupTrigger = NSEvent.isPopupTrigger(jmodifiers); 83 84 eventNotifier.notifyMouseEvent(jeventType, System.currentTimeMillis(), jbuttonNumber, 85 x, y, absoluteX, absoluteY, jmodifiers, jclickCount, 86 jpopupTrigger, null); 87 } 88 89 /** 90 * Handles scroll events. 91 */ 92 void handleScrollEvent(final int x, final int y, final int modifierFlags, 93 final double deltaX, final double deltaY) { 94 final int buttonNumber = CocoaConstants.kCGMouseButtonCenter; 95 int jmodifiers = NSEvent.nsToJavaMouseModifiers(buttonNumber, 96 modifierFlags); 97 final boolean isShift = (jmodifiers & InputEvent.SHIFT_DOWN_MASK) != 0; 98 99 // Vertical scroll. 100 if (!isShift && deltaY != 0.0) { 101 dispatchScrollEvent(x, y, jmodifiers, deltaY); 102 } 103 // Horizontal scroll or shirt+vertical scroll. 104 final double delta = isShift && deltaY != 0.0 ? deltaY : deltaX; 105 if (delta != 0.0) { 106 jmodifiers |= InputEvent.SHIFT_DOWN_MASK; 107 dispatchScrollEvent(x, y, jmodifiers, delta); 108 } 109 } 110 111 private void dispatchScrollEvent(final int x, final int y, 112 final int modifiers, final double delta) { 113 final long when = System.currentTimeMillis(); 114 final int scrollType = MouseWheelEvent.WHEEL_UNIT_SCROLL; 115 final int scrollAmount = 1; 116 int wheelRotation = (int) delta; 117 int signum = (int) Math.signum(delta); 118 if (signum * delta < 1) { 119 wheelRotation = signum; 120 } 121 // invert the wheelRotation for the peer 122 eventNotifier.notifyMouseWheelEvent(when, x, y, modifiers, scrollType, 123 scrollAmount, -wheelRotation, -delta, null); 124 } 125 126 /** 127 * Handles key events. 128 */ 129 void handleKeyEvent(int eventType, int modifierFlags, String chars, String charsIgnoringModifiers, 130 short keyCode, boolean needsKeyTyped, boolean needsKeyReleased) { 131 boolean isFlagsChangedEvent = 132 isNpapiCallback ? (eventType == CocoaConstants.NPCocoaEventFlagsChanged) : 133 (eventType == CocoaConstants.NSFlagsChanged); 134 135 int jeventType = KeyEvent.KEY_PRESSED; 136 int jkeyCode = KeyEvent.VK_UNDEFINED; 137 int jkeyLocation = KeyEvent.KEY_LOCATION_UNKNOWN; 138 boolean postsTyped = false; 139 140 char testChar = KeyEvent.CHAR_UNDEFINED; 141 boolean isDeadChar = (chars!= null && chars.length() == 0); 142 143 if (isFlagsChangedEvent) { 239 int index = 0, length = text.length(); 240 char c = 0; 241 while (index < length) { 242 c = text.charAt(index); 243 eventNotifier.notifyKeyEvent(KeyEvent.KEY_TYPED, 244 System.currentTimeMillis(), 245 0, KeyEvent.VK_UNDEFINED, c, 246 KeyEvent.KEY_LOCATION_UNKNOWN); 247 index++; 248 } 249 eventNotifier.notifyKeyEvent(KeyEvent.KEY_RELEASED, 250 System.currentTimeMillis(), 251 0, lastKeyPressCode, c, 252 KeyEvent.KEY_LOCATION_UNKNOWN); 253 } 254 } 255 256 void handleWindowFocusEvent(boolean gained, LWWindowPeer opposite) { 257 eventNotifier.notifyActivation(gained, opposite); 258 } 259 } | 27 28 import sun.awt.SunToolkit; 29 import sun.lwawt.LWWindowPeer; 30 import sun.lwawt.PlatformEventNotifier; 31 32 import java.awt.Toolkit; 33 import java.awt.event.MouseEvent; 34 import java.awt.event.InputEvent; 35 import java.awt.event.MouseWheelEvent; 36 import java.awt.event.KeyEvent; 37 import java.util.Locale; 38 39 /** 40 * Translates NSEvents/NPCocoaEvents into AWT events. 41 */ 42 final class CPlatformResponder { 43 44 private final PlatformEventNotifier eventNotifier; 45 private final boolean isNpapiCallback; 46 private int lastKeyPressCode = KeyEvent.VK_UNDEFINED; 47 private final DeltaAccumulator deltaAccumulatorX = new DeltaAccumulator(); 48 private final DeltaAccumulator deltaAccumulatorY = new DeltaAccumulator(); 49 50 CPlatformResponder(final PlatformEventNotifier eventNotifier, 51 final boolean isNpapiCallback) { 52 this.eventNotifier = eventNotifier; 53 this.isNpapiCallback = isNpapiCallback; 54 } 55 56 /** 57 * Handles mouse events. 58 */ 59 void handleMouseEvent(int eventType, int modifierFlags, int buttonNumber, 60 int clickCount, int x, int y, int absoluteX, 61 int absoluteY) { 62 final SunToolkit tk = (SunToolkit)Toolkit.getDefaultToolkit(); 63 if ((buttonNumber > 2 && !tk.areExtraMouseButtonsEnabled()) 64 || buttonNumber > tk.getNumberOfButtons() - 1) { 65 return; 66 } 67 68 int jeventType = isNpapiCallback ? NSEvent.npToJavaEventType(eventType) : 75 jeventType != MouseEvent.MOUSE_ENTERED && 76 jeventType != MouseEvent.MOUSE_EXITED) 77 { 78 jbuttonNumber = NSEvent.nsToJavaButton(buttonNumber); 79 jclickCount = clickCount; 80 } 81 82 int jmodifiers = NSEvent.nsToJavaMouseModifiers(buttonNumber, 83 modifierFlags); 84 boolean jpopupTrigger = NSEvent.isPopupTrigger(jmodifiers); 85 86 eventNotifier.notifyMouseEvent(jeventType, System.currentTimeMillis(), jbuttonNumber, 87 x, y, absoluteX, absoluteY, jmodifiers, jclickCount, 88 jpopupTrigger, null); 89 } 90 91 /** 92 * Handles scroll events. 93 */ 94 void handleScrollEvent(final int x, final int y, final int modifierFlags, 95 final double deltaX, final double deltaY, 96 final int scrollPhase) { 97 final int buttonNumber = CocoaConstants.kCGMouseButtonCenter; 98 int jmodifiers = NSEvent.nsToJavaMouseModifiers(buttonNumber, 99 modifierFlags); 100 final boolean isShift = (jmodifiers & InputEvent.SHIFT_DOWN_MASK) != 0; 101 102 int roundDeltaX = deltaAccumulatorX.getRoundedDelta(deltaX, scrollPhase); 103 int roundDeltaY = deltaAccumulatorY.getRoundedDelta(deltaY, scrollPhase); 104 105 // Vertical scroll. 106 if (!isShift && (deltaY != 0.0 || roundDeltaY != 0)) { 107 dispatchScrollEvent(x, y, jmodifiers, roundDeltaY, deltaY); 108 } 109 // Horizontal scroll or shirt+vertical scroll. 110 final double delta = isShift && deltaY != 0.0 ? deltaY : deltaX; 111 final int roundDelta = isShift && roundDeltaY != 0 ? roundDeltaY : roundDeltaX; 112 if (delta != 0.0 || roundDelta != 0) { 113 jmodifiers |= InputEvent.SHIFT_DOWN_MASK; 114 dispatchScrollEvent(x, y, jmodifiers, roundDelta, delta); 115 } 116 } 117 118 private void dispatchScrollEvent(final int x, final int y, 119 final int modifiers, 120 final int roundDelta, final double delta) { 121 final long when = System.currentTimeMillis(); 122 final int scrollType = MouseWheelEvent.WHEEL_UNIT_SCROLL; 123 final int scrollAmount = 1; 124 // invert the wheelRotation for the peer 125 eventNotifier.notifyMouseWheelEvent(when, x, y, modifiers, scrollType, 126 scrollAmount, -roundDelta, -delta, null); 127 } 128 129 /** 130 * Handles key events. 131 */ 132 void handleKeyEvent(int eventType, int modifierFlags, String chars, String charsIgnoringModifiers, 133 short keyCode, boolean needsKeyTyped, boolean needsKeyReleased) { 134 boolean isFlagsChangedEvent = 135 isNpapiCallback ? (eventType == CocoaConstants.NPCocoaEventFlagsChanged) : 136 (eventType == CocoaConstants.NSFlagsChanged); 137 138 int jeventType = KeyEvent.KEY_PRESSED; 139 int jkeyCode = KeyEvent.VK_UNDEFINED; 140 int jkeyLocation = KeyEvent.KEY_LOCATION_UNKNOWN; 141 boolean postsTyped = false; 142 143 char testChar = KeyEvent.CHAR_UNDEFINED; 144 boolean isDeadChar = (chars!= null && chars.length() == 0); 145 146 if (isFlagsChangedEvent) { 242 int index = 0, length = text.length(); 243 char c = 0; 244 while (index < length) { 245 c = text.charAt(index); 246 eventNotifier.notifyKeyEvent(KeyEvent.KEY_TYPED, 247 System.currentTimeMillis(), 248 0, KeyEvent.VK_UNDEFINED, c, 249 KeyEvent.KEY_LOCATION_UNKNOWN); 250 index++; 251 } 252 eventNotifier.notifyKeyEvent(KeyEvent.KEY_RELEASED, 253 System.currentTimeMillis(), 254 0, lastKeyPressCode, c, 255 KeyEvent.KEY_LOCATION_UNKNOWN); 256 } 257 } 258 259 void handleWindowFocusEvent(boolean gained, LWWindowPeer opposite) { 260 eventNotifier.notifyActivation(gained, opposite); 261 } 262 263 static class DeltaAccumulator { 264 265 static final double MIN_THRESHOLD = 0.1; 266 static final double MAX_THRESHOLD = 0.5; 267 double accumulatedDelta; 268 269 int getRoundedDelta(double delta, int scrollPhase) { 270 271 int roundDelta = (int) Math.round(delta); 272 273 if (scrollPhase == NSEvent.SCROLL_PHASE_UNSUPPORTED) { // mouse wheel 274 if (roundDelta == 0 && delta != 0) { 275 roundDelta = delta > 0 ? 1 : -1; 276 } 277 } else { // trackpad 278 boolean begin = scrollPhase == NSEvent.SCROLL_PHASE_BEGAN; 279 boolean end = scrollPhase == NSEvent.SCROLL_MASK_PHASE_ENDED 280 || scrollPhase == NSEvent.SCROLL_MASK_PHASE_CANCELLED; 281 282 if (begin) { 283 accumulatedDelta = 0; 284 } 285 286 accumulatedDelta += delta; 287 288 double absAccumulatedDelta = Math.abs(accumulatedDelta); 289 if (absAccumulatedDelta > MAX_THRESHOLD) { 290 roundDelta = (int) Math.round(accumulatedDelta); 291 accumulatedDelta -= roundDelta; 292 } 293 294 if (end) { 295 if (roundDelta == 0 && absAccumulatedDelta > MIN_THRESHOLD) { 296 roundDelta = accumulatedDelta > 0 ? 1 : -1; 297 } 298 } 299 } 300 301 return roundDelta; 302 } 303 } 304 } |