src/macosx/native/sun/awt/AWTEvent.m

Print this page




 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;