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 }
|