227 {0x02DD, java_awt_event_KeyEvent_VK_DEAD_DOUBLEACUTE},
228 {0x02C7, java_awt_event_KeyEvent_VK_DEAD_CARON},
229 {0x00B8, java_awt_event_KeyEvent_VK_DEAD_CEDILLA},
230 {0x02DB, java_awt_event_KeyEvent_VK_DEAD_OGONEK},
231 {0x037A, java_awt_event_KeyEvent_VK_DEAD_IOTA},
232 {0x309B, java_awt_event_KeyEvent_VK_DEAD_VOICED_SOUND},
233 {0x309C, java_awt_event_KeyEvent_VK_DEAD_SEMIVOICED_SOUND},
234 {0,0}
235 };
236
237 // TODO: some constants below are part of CGS (private interfaces)...
238 // for now we will look at the raw key code to determine left/right status
239 // but not sure this is foolproof...
240 static struct _nsKeyToJavaModifier
241 {
242 NSUInteger nsMask;
243 //NSUInteger cgsLeftMask;
244 //NSUInteger cgsRightMask;
245 unsigned short leftKeyCode;
246 unsigned short rightKeyCode;
247 jint javaMask;
248 jint javaKey;
249 }
250 const nsKeyToJavaModifierTable[] =
251 {
252 {
253 NSAlphaShiftKeyMask,
254 0,
255 0,
256 0, // no Java equivalent
257 java_awt_event_KeyEvent_VK_CAPS_LOCK
258 },
259 {
260 NSShiftKeyMask,
261 //kCGSFlagsMaskAppleShiftKey,
262 //kCGSFlagsMaskAppleRightShiftKey,
263 56,
264 60,
265 java_awt_event_InputEvent_SHIFT_DOWN_MASK,
266 java_awt_event_KeyEvent_VK_SHIFT
267 },
268 {
269 NSControlKeyMask,
270 //kCGSFlagsMaskAppleControlKey,
271 //kCGSFlagsMaskAppleRightControlKey,
272 59,
273 62,
274 java_awt_event_InputEvent_CTRL_DOWN_MASK,
275 java_awt_event_KeyEvent_VK_CONTROL
276 },
277 {
278 NSAlternateKeyMask,
279 //kCGSFlagsMaskAppleLeftAlternateKey,
280 //kCGSFlagsMaskAppleRightAlternateKey,
281 58,
282 61,
283 java_awt_event_InputEvent_ALT_DOWN_MASK,
284 java_awt_event_KeyEvent_VK_ALT
285 },
286 {
287 NSCommandKeyMask,
288 //kCGSFlagsMaskAppleLeftCommandKey,
289 //kCGSFlagsMaskAppleRightCommandKey,
290 55,
291 54,
292 java_awt_event_InputEvent_META_DOWN_MASK,
293 java_awt_event_KeyEvent_VK_META
294 },
295 // NSNumericPadKeyMask
296 {
297 NSHelpKeyMask,
298 0,
299 0,
300 0, // no Java equivalent
301 java_awt_event_KeyEvent_VK_HELP
302 },
303 // NSFunctionKeyMask
304 {0, 0, 0, 0, 0}
305 };
306
307 /*
308 * Almost all unicode characters just go from NS to Java with no translation.
309 * For the few exceptions, we handle it here with this small table.
310 */
311 #define ALL_NS_KEY_MODIFIERS_MASK \
312 (NSShiftKeyMask | NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask)
313
314 static struct _char {
315 NSUInteger modifier;
316 unichar nsChar;
317 unichar javaChar;
318 }
319 const charTable[] = {
320 // map enter on keypad to same as return key
321 {0, NSEnterCharacter, NSNewlineCharacter},
322
323 // [3134616] return newline instead of carriage return
324 {0, NSCarriageReturnCharacter, NSNewlineCharacter},
474 // *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
475 //} else if (changedNSFlags & cur->cgsRightMask) {
476 // *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
477 //}
478 if (eventKeyCode == cur->leftKeyCode) {
479 *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
480 } else if (eventKeyCode == cur->rightKeyCode) {
481 *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
482 }
483 *javaKeyType = (cur->nsMask & nsFlags) ?
484 java_awt_event_KeyEvent_KEY_PRESSED :
485 java_awt_event_KeyEvent_KEY_RELEASED;
486 break;
487 }
488 }
489 }
490
491 /*
492 * This returns the java modifiers for a key NSEvent.
493 */
494 static jint
495 NsKeyModifiersToJavaModifiers(NSUInteger nsFlags)
496 {
497 jint javaModifiers = 0;
498 const struct _nsKeyToJavaModifier* cur;
499
500 for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) {
501 if ((cur->nsMask & nsFlags) != 0) {
502 javaModifiers |= cur->javaMask;
503 }
504 }
505
506 return javaModifiers;
507 }
508
509 jint GetJavaMouseModifiers(NSInteger button, NSUInteger modifierFlags)
510 {
511 // Mousing needs the key modifiers
512 jint modifiers = NsKeyModifiersToJavaModifiers(modifierFlags);
513
514
515 /*
516 * Ask Quartz about mouse buttons state
517 */
518
519 if (CGEventSourceButtonState(kCGEventSourceStateCombinedSessionState,
520 kCGMouseButtonLeft)) {
521 modifiers |= java_awt_event_InputEvent_BUTTON1_DOWN_MASK;
522 }
523
524 if (CGEventSourceButtonState(kCGEventSourceStateCombinedSessionState,
525 kCGMouseButtonRight)) {
526 modifiers |= java_awt_event_InputEvent_BUTTON3_DOWN_MASK;
527 }
528
529 if (CGEventSourceButtonState(kCGEventSourceStateCombinedSessionState,
530 kCGMouseButtonCenter)) {
531 modifiers |= java_awt_event_InputEvent_BUTTON2_DOWN_MASK;
532 }
573 jmodifiers = GetJavaMouseModifiers(buttonNumber, modifierFlags);
574
575 JNF_COCOA_EXIT(env);
576
577 return jmodifiers;
578 }
579
580 /*
581 * Class: sun_lwawt_macosx_event_NSEvent
582 * Method: nsToJavaKeyModifiers
583 * Signature: (I)I
584 */
585 JNIEXPORT jint JNICALL
586 Java_sun_lwawt_macosx_event_NSEvent_nsToJavaKeyModifiers
587 (JNIEnv *env, jclass cls, jint modifierFlags)
588 {
589 jint jmodifiers = 0;
590
591 JNF_COCOA_ENTER(env);
592
593 jmodifiers = NsKeyModifiersToJavaModifiers(modifierFlags);
594
595 JNF_COCOA_EXIT(env);
596
597 return jmodifiers;
598 }
599
600 /*
601 * Class: sun_lwawt_macosx_event_NSEvent
602 * Method: nsToJavaKeyInfo
603 * Signature: ([I[I)Z
604 */
605 JNIEXPORT jboolean JNICALL
606 Java_sun_lwawt_macosx_event_NSEvent_nsToJavaKeyInfo
607 (JNIEnv *env, jclass cls, jintArray inData, jintArray outData)
608 {
609 BOOL postsTyped = NO;
610
611 JNF_COCOA_ENTER(env);
612
613 jboolean copy = JNI_FALSE;
|
227 {0x02DD, java_awt_event_KeyEvent_VK_DEAD_DOUBLEACUTE},
228 {0x02C7, java_awt_event_KeyEvent_VK_DEAD_CARON},
229 {0x00B8, java_awt_event_KeyEvent_VK_DEAD_CEDILLA},
230 {0x02DB, java_awt_event_KeyEvent_VK_DEAD_OGONEK},
231 {0x037A, java_awt_event_KeyEvent_VK_DEAD_IOTA},
232 {0x309B, java_awt_event_KeyEvent_VK_DEAD_VOICED_SOUND},
233 {0x309C, java_awt_event_KeyEvent_VK_DEAD_SEMIVOICED_SOUND},
234 {0,0}
235 };
236
237 // TODO: some constants below are part of CGS (private interfaces)...
238 // for now we will look at the raw key code to determine left/right status
239 // but not sure this is foolproof...
240 static struct _nsKeyToJavaModifier
241 {
242 NSUInteger nsMask;
243 //NSUInteger cgsLeftMask;
244 //NSUInteger cgsRightMask;
245 unsigned short leftKeyCode;
246 unsigned short rightKeyCode;
247 jint javaExtMask;
248 jint javaMask;
249 jint javaKey;
250 }
251 const nsKeyToJavaModifierTable[] =
252 {
253 {
254 NSAlphaShiftKeyMask,
255 0,
256 0,
257 0, // no Java equivalent
258 0, // no Java equivalent
259 java_awt_event_KeyEvent_VK_CAPS_LOCK
260 },
261 {
262 NSShiftKeyMask,
263 //kCGSFlagsMaskAppleShiftKey,
264 //kCGSFlagsMaskAppleRightShiftKey,
265 56,
266 60,
267 java_awt_event_InputEvent_SHIFT_DOWN_MASK,
268 java_awt_event_InputEvent_SHIFT_MASK,
269 java_awt_event_KeyEvent_VK_SHIFT
270 },
271 {
272 NSControlKeyMask,
273 //kCGSFlagsMaskAppleControlKey,
274 //kCGSFlagsMaskAppleRightControlKey,
275 59,
276 62,
277 java_awt_event_InputEvent_CTRL_DOWN_MASK,
278 java_awt_event_InputEvent_CTRL_MASK,
279 java_awt_event_KeyEvent_VK_CONTROL
280 },
281 {
282 NSAlternateKeyMask,
283 //kCGSFlagsMaskAppleLeftAlternateKey,
284 //kCGSFlagsMaskAppleRightAlternateKey,
285 58,
286 61,
287 java_awt_event_InputEvent_ALT_DOWN_MASK,
288 java_awt_event_InputEvent_ALT_MASK,
289 java_awt_event_KeyEvent_VK_ALT
290 },
291 {
292 NSCommandKeyMask,
293 //kCGSFlagsMaskAppleLeftCommandKey,
294 //kCGSFlagsMaskAppleRightCommandKey,
295 55,
296 54,
297 java_awt_event_InputEvent_META_DOWN_MASK,
298 java_awt_event_InputEvent_META_MASK,
299 java_awt_event_KeyEvent_VK_META
300 },
301 // NSNumericPadKeyMask
302 {
303 NSHelpKeyMask,
304 0,
305 0,
306 0, // no Java equivalent
307 0, // no Java equivalent
308 java_awt_event_KeyEvent_VK_HELP
309 },
310 // NSFunctionKeyMask
311 {0, 0, 0, 0, 0, 0}
312 };
313
314 /*
315 * Almost all unicode characters just go from NS to Java with no translation.
316 * For the few exceptions, we handle it here with this small table.
317 */
318 #define ALL_NS_KEY_MODIFIERS_MASK \
319 (NSShiftKeyMask | NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask)
320
321 static struct _char {
322 NSUInteger modifier;
323 unichar nsChar;
324 unichar javaChar;
325 }
326 const charTable[] = {
327 // map enter on keypad to same as return key
328 {0, NSEnterCharacter, NSNewlineCharacter},
329
330 // [3134616] return newline instead of carriage return
331 {0, NSCarriageReturnCharacter, NSNewlineCharacter},
481 // *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
482 //} else if (changedNSFlags & cur->cgsRightMask) {
483 // *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
484 //}
485 if (eventKeyCode == cur->leftKeyCode) {
486 *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
487 } else if (eventKeyCode == cur->rightKeyCode) {
488 *javaKeyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
489 }
490 *javaKeyType = (cur->nsMask & nsFlags) ?
491 java_awt_event_KeyEvent_KEY_PRESSED :
492 java_awt_event_KeyEvent_KEY_RELEASED;
493 break;
494 }
495 }
496 }
497
498 /*
499 * This returns the java modifiers for a key NSEvent.
500 */
501 jint NsKeyModifiersToJavaModifiers(NSUInteger nsFlags, BOOL isExtMods)
502 {
503 jint javaModifiers = 0;
504 const struct _nsKeyToJavaModifier* cur;
505
506 for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) {
507 if ((cur->nsMask & nsFlags) != 0) {
508 javaModifiers |= isExtMods? cur->javaExtMask : cur->javaMask;
509 }
510 }
511
512 return javaModifiers;
513 }
514
515 /*
516 * This returns the NSEvent flags for java key modifiers.
517 */
518 NSUInteger JavaModifiersToNsKeyModifiers(jint javaModifiers, BOOL isExtMods)
519 {
520 NSUInteger nsFlags = 0;
521 const struct _nsKeyToJavaModifier* cur;
522
523 for (cur = nsKeyToJavaModifierTable; cur->nsMask != 0; ++cur) {
524 jint mask = isExtMods? cur->javaExtMask : cur->javaMask;
525 if ((mask & javaModifiers) != 0) {
526 nsFlags |= cur->nsMask;
527 }
528 }
529
530 // special case
531 jint mask = isExtMods? java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK :
532 java_awt_event_InputEvent_ALT_GRAPH_MASK;
533
534 if ((mask & javaModifiers) != 0) {
535 nsFlags |= NSAlternateKeyMask;
536 }
537
538 return nsFlags;
539 }
540
541
542 jint GetJavaMouseModifiers(NSInteger button, NSUInteger modifierFlags)
543 {
544 // Mousing needs the key modifiers
545 jint modifiers = NsKeyModifiersToJavaModifiers(modifierFlags, YES);
546
547
548 /*
549 * Ask Quartz about mouse buttons state
550 */
551
552 if (CGEventSourceButtonState(kCGEventSourceStateCombinedSessionState,
553 kCGMouseButtonLeft)) {
554 modifiers |= java_awt_event_InputEvent_BUTTON1_DOWN_MASK;
555 }
556
557 if (CGEventSourceButtonState(kCGEventSourceStateCombinedSessionState,
558 kCGMouseButtonRight)) {
559 modifiers |= java_awt_event_InputEvent_BUTTON3_DOWN_MASK;
560 }
561
562 if (CGEventSourceButtonState(kCGEventSourceStateCombinedSessionState,
563 kCGMouseButtonCenter)) {
564 modifiers |= java_awt_event_InputEvent_BUTTON2_DOWN_MASK;
565 }
606 jmodifiers = GetJavaMouseModifiers(buttonNumber, modifierFlags);
607
608 JNF_COCOA_EXIT(env);
609
610 return jmodifiers;
611 }
612
613 /*
614 * Class: sun_lwawt_macosx_event_NSEvent
615 * Method: nsToJavaKeyModifiers
616 * Signature: (I)I
617 */
618 JNIEXPORT jint JNICALL
619 Java_sun_lwawt_macosx_event_NSEvent_nsToJavaKeyModifiers
620 (JNIEnv *env, jclass cls, jint modifierFlags)
621 {
622 jint jmodifiers = 0;
623
624 JNF_COCOA_ENTER(env);
625
626 jmodifiers = NsKeyModifiersToJavaModifiers(modifierFlags, YES);
627
628 JNF_COCOA_EXIT(env);
629
630 return jmodifiers;
631 }
632
633 /*
634 * Class: sun_lwawt_macosx_event_NSEvent
635 * Method: nsToJavaKeyInfo
636 * Signature: ([I[I)Z
637 */
638 JNIEXPORT jboolean JNICALL
639 Java_sun_lwawt_macosx_event_NSEvent_nsToJavaKeyInfo
640 (JNIEnv *env, jclass cls, jintArray inData, jintArray outData)
641 {
642 BOOL postsTyped = NO;
643
644 JNF_COCOA_ENTER(env);
645
646 jboolean copy = JNI_FALSE;
|