< prev index next >

src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m

Print this page




 332     unichar nsChar;
 333     unichar javaChar;
 334 }
 335 const charTable[] = {
 336     // map enter on keypad to same as return key
 337     {0,                         NSEnterCharacter,          NSNewlineCharacter},
 338 
 339     // [3134616] return newline instead of carriage return
 340     {0,                         NSCarriageReturnCharacter, NSNewlineCharacter},
 341 
 342     // "delete" means backspace in Java
 343     {ALL_NS_KEY_MODIFIERS_MASK, NSDeleteCharacter,         NSBackspaceCharacter},
 344     {ALL_NS_KEY_MODIFIERS_MASK, NSDeleteFunctionKey,       NSDeleteCharacter},
 345 
 346     // back-tab is only differentiated from tab by Shift flag
 347     {NSShiftKeyMask,            NSBackTabCharacter,        NSTabCharacter},
 348 
 349     {0, 0, 0}
 350 };
 351 
 352 unichar NsCharToJavaChar(unichar nsChar, NSUInteger modifiers)
 353 {
 354     const struct _char *cur;
 355     // Mask off just the keyboard modifiers from the event modifier mask.
 356     NSUInteger testableFlags = (modifiers & ALL_NS_KEY_MODIFIERS_MASK);
 357 
 358     // walk through table & find the match
 359     for (cur = charTable; cur->nsChar != 0 ; cur++) {
 360         // <rdar://Problem/3476426> Need to determine if we are looking at
 361         // a plain keypress or a modified keypress.  Don't adjust the
 362         // character of a keypress with a modifier.
 363         if (cur->nsChar == nsChar) {
 364             if (cur->modifier == 0 && testableFlags == 0) {
 365                 // If the modifier field is 0, that means to transform
 366                 // this character if no additional keyboard modifiers are set.
 367                 // This lets ctrl-C be reported as ctrl-C and not transformed
 368                 // into Newline.
 369                 return cur->javaChar;
 370             } else if (cur->modifier != 0 &&
 371                        (testableFlags & cur->modifier) == testableFlags)
 372             {
 373                 // Likewise, if the modifier field is nonzero, that means
 374                 // transform this character if only these modifiers are
 375                 // set in the testable flags.
 376                 return cur->javaChar;
 377             }
 378         }
 379     }
 380 
 381     if (nsChar >= NSUpArrowFunctionKey && nsChar <= NSModeSwitchFunctionKey) {
 382         return java_awt_event_KeyEvent_CHAR_UNDEFINED;
 383     }
 384 





 385     // otherwise return character unchanged
 386     return nsChar;
 387 }
 388 
 389 static unichar NsGetDeadKeyChar(unsigned short keyCode)
 390 {
 391     TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
 392     CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
 393     if (uchr == nil) { return 0; }
 394     const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr);
 395     // Carbon modifiers should be used instead of NSEvent modifiers
 396     UInt32 modifierKeyState = (GetCurrentEventKeyModifiers() >> 8) & 0xFF;
 397 
 398     if (keyboardLayout) {
 399         UInt32 deadKeyState = 0;
 400         UniCharCount maxStringLength = 255;
 401         UniCharCount actualStringLength = 0;
 402         UniChar unicodeString[maxStringLength];
 403 
 404         // get the deadKeyState


 740                                 &jkeyLocation,
 741                                 &jkeyType);
 742 
 743     // out = [jkeyCode, jkeyLocation, jkeyType];
 744     (*env)->SetIntArrayRegion(env, outData, 0, 1, &jkeyCode);
 745     (*env)->SetIntArrayRegion(env, outData, 1, 1, &jkeyLocation);
 746     (*env)->SetIntArrayRegion(env, outData, 2, 1, &jkeyType);
 747 
 748     (*env)->ReleaseIntArrayElements(env, inData, data, 0);
 749 
 750 JNF_COCOA_EXIT(env);
 751 }
 752 
 753 /*
 754  * Class:     sun_lwawt_macosx_NSEvent
 755  * Method:    nsToJavaChar
 756  * Signature: (CI)C
 757  */
 758 JNIEXPORT jint JNICALL
 759 Java_sun_lwawt_macosx_NSEvent_nsToJavaChar
 760 (JNIEnv *env, jclass cls, jchar nsChar, jint modifierFlags)
 761 {
 762     jchar javaChar = 0;
 763 
 764 JNF_COCOA_ENTER(env);
 765 
 766     javaChar = NsCharToJavaChar(nsChar, modifierFlags);
 767 
 768 JNF_COCOA_EXIT(env);
 769 
 770     return javaChar;
 771 }


 332     unichar nsChar;
 333     unichar javaChar;
 334 }
 335 const charTable[] = {
 336     // map enter on keypad to same as return key
 337     {0,                         NSEnterCharacter,          NSNewlineCharacter},
 338 
 339     // [3134616] return newline instead of carriage return
 340     {0,                         NSCarriageReturnCharacter, NSNewlineCharacter},
 341 
 342     // "delete" means backspace in Java
 343     {ALL_NS_KEY_MODIFIERS_MASK, NSDeleteCharacter,         NSBackspaceCharacter},
 344     {ALL_NS_KEY_MODIFIERS_MASK, NSDeleteFunctionKey,       NSDeleteCharacter},
 345 
 346     // back-tab is only differentiated from tab by Shift flag
 347     {NSShiftKeyMask,            NSBackTabCharacter,        NSTabCharacter},
 348 
 349     {0, 0, 0}
 350 };
 351 
 352 unichar NsCharToJavaChar(unichar nsChar, NSUInteger modifiers, BOOL spaceKeyTyped)
 353 {
 354     const struct _char *cur;
 355     // Mask off just the keyboard modifiers from the event modifier mask.
 356     NSUInteger testableFlags = (modifiers & ALL_NS_KEY_MODIFIERS_MASK);
 357 
 358     // walk through table & find the match
 359     for (cur = charTable; cur->nsChar != 0 ; cur++) {
 360         // <rdar://Problem/3476426> Need to determine if we are looking at
 361         // a plain keypress or a modified keypress.  Don't adjust the
 362         // character of a keypress with a modifier.
 363         if (cur->nsChar == nsChar) {
 364             if (cur->modifier == 0 && testableFlags == 0) {
 365                 // If the modifier field is 0, that means to transform
 366                 // this character if no additional keyboard modifiers are set.
 367                 // This lets ctrl-C be reported as ctrl-C and not transformed
 368                 // into Newline.
 369                 return cur->javaChar;
 370             } else if (cur->modifier != 0 &&
 371                        (testableFlags & cur->modifier) == testableFlags)
 372             {
 373                 // Likewise, if the modifier field is nonzero, that means
 374                 // transform this character if only these modifiers are
 375                 // set in the testable flags.
 376                 return cur->javaChar;
 377             }
 378         }
 379     }
 380 
 381     if (nsChar >= NSUpArrowFunctionKey && nsChar <= NSModeSwitchFunctionKey) {
 382         return java_awt_event_KeyEvent_CHAR_UNDEFINED;
 383     }
 384 
 385     // nsChar receives value 0 when SPACE key is typed.
 386     if (nsChar == 0 && spaceKeyTyped == YES) {
 387         return java_awt_event_KeyEvent_VK_SPACE;
 388     }
 389         
 390     // otherwise return character unchanged
 391     return nsChar;
 392 }
 393 
 394 static unichar NsGetDeadKeyChar(unsigned short keyCode)
 395 {
 396     TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
 397     CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
 398     if (uchr == nil) { return 0; }
 399     const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr);
 400     // Carbon modifiers should be used instead of NSEvent modifiers
 401     UInt32 modifierKeyState = (GetCurrentEventKeyModifiers() >> 8) & 0xFF;
 402 
 403     if (keyboardLayout) {
 404         UInt32 deadKeyState = 0;
 405         UniCharCount maxStringLength = 255;
 406         UniCharCount actualStringLength = 0;
 407         UniChar unicodeString[maxStringLength];
 408 
 409         // get the deadKeyState


 745                                 &jkeyLocation,
 746                                 &jkeyType);
 747 
 748     // out = [jkeyCode, jkeyLocation, jkeyType];
 749     (*env)->SetIntArrayRegion(env, outData, 0, 1, &jkeyCode);
 750     (*env)->SetIntArrayRegion(env, outData, 1, 1, &jkeyLocation);
 751     (*env)->SetIntArrayRegion(env, outData, 2, 1, &jkeyType);
 752 
 753     (*env)->ReleaseIntArrayElements(env, inData, data, 0);
 754 
 755 JNF_COCOA_EXIT(env);
 756 }
 757 
 758 /*
 759  * Class:     sun_lwawt_macosx_NSEvent
 760  * Method:    nsToJavaChar
 761  * Signature: (CI)C
 762  */
 763 JNIEXPORT jint JNICALL
 764 Java_sun_lwawt_macosx_NSEvent_nsToJavaChar
 765 (JNIEnv *env, jclass cls, jchar nsChar, jint modifierFlags, jboolean spaceKeyTyped)
 766 {
 767     jchar javaChar = 0;
 768 
 769 JNF_COCOA_ENTER(env);
 770 
 771     javaChar = NsCharToJavaChar(nsChar, modifierFlags, spaceKeyTyped);
 772 
 773 JNF_COCOA_EXIT(env);
 774 
 775     return javaChar;
 776 }
< prev index next >