Fix keyboard key codes to return Unicode characters instead of ASCII

characters
This commit is contained in:
kappaOne 2013-10-13 15:45:08 +01:00
parent 6b15398855
commit d3254e00f3
2 changed files with 23 additions and 13 deletions

View File

@ -281,11 +281,15 @@ final class MacOSXNativeKeyboard extends EventQueue {
return -1; return -1;
} }
public void keyPressed(int key_code, int character, long nanos) { public void keyPressed(int key_code, String chars, long nanos) {
// use only first character of chars returned for key press
int character = (chars == null) ? 0 : (int)chars.charAt(0);
handleKey(key_code, (byte)1, character, nanos); handleKey(key_code, (byte)1, character, nanos);
} }
public void keyReleased(int key_code, int character, long nanos) { public void keyReleased(int key_code, String chars, long nanos) {
// use only first character of chars returned for key release
int character = (chars == null) ? 0 : (int)chars.charAt(0);
handleKey(key_code, (byte)0, character, nanos); handleKey(key_code, (byte)0, character, nanos);
} }

View File

@ -274,10 +274,13 @@ static MacOSXPeerInfo *peer_info;
} }
long time = [event timestamp] * 1000000000; long time = [event timestamp] * 1000000000;
jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard); jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard);
jmethodID keydown = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(IIJ)V"); jmethodID keydown = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(ILjava/lang/String;J)V");
const char* charbuf = [[event characters] cStringUsingEncoding:NSASCIIStringEncoding];
int charcode = (charbuf == nil) ? 0 : charbuf[0]; // convert key characters from NSString to jstring
(*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, [event keyCode], charcode, time); const char *unichars = [[event characters] UTF8String];
jstring characters = (*env)->NewStringUTF(env, unichars);
(*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, [event keyCode], characters, time);
} }
- (void)keyUp:(NSEvent *)event { - (void)keyUp:(NSEvent *)event {
@ -287,10 +290,13 @@ static MacOSXPeerInfo *peer_info;
} }
long time = [event timestamp] * 1000000000; long time = [event timestamp] * 1000000000;
jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard); jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard);
jmethodID keyup = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(IIJ)V"); jmethodID keyup = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(ILjava/lang/String;J)V");
const char* charbuf = [[event characters] cStringUsingEncoding:NSASCIIStringEncoding];
int charcode = (charbuf == nil) ? 0 : charbuf[0]; // convert key characters from NSString to jstring
(*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, [event keyCode], charcode, time); const char *unichars = [[event characters] UTF8String];
jstring characters = (*env)->NewStringUTF(env, unichars);
(*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, [event keyCode], characters, time);
} }
- (void)flagsChanged:(NSEvent *)event { - (void)flagsChanged:(NSEvent *)event {
@ -322,12 +328,12 @@ static MacOSXPeerInfo *peer_info;
jmethodID keyMethod; jmethodID keyMethod;
if (([event modifierFlags] & mask) == mask) { if (([event modifierFlags] & mask) == mask) {
keyMethod = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(IIJ)V"); keyMethod = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(ILjava/lang/String;J)V");
} else { } else {
keyMethod = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(IIJ)V"); keyMethod = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(ILjava/lang/String;J)V");
} }
(*env)->CallVoidMethod(env, _parent->jkeyboard, keyMethod, [event keyCode], 0, time); (*env)->CallVoidMethod(env, _parent->jkeyboard, keyMethod, [event keyCode], NULL, time);
} }
- (void)mouseButtonState:(NSEvent *)event :(int)button :(int)state { - (void)mouseButtonState:(NSEvent *)event :(int)button :(int)state {