From d3254e00f36a11b5f6c71a340ee3f71cc600001b Mon Sep 17 00:00:00 2001 From: kappaOne Date: Sun, 13 Oct 2013 15:45:08 +0100 Subject: [PATCH] Fix keyboard key codes to return Unicode characters instead of ASCII characters --- .../lwjgl/opengl/MacOSXNativeKeyboard.java | 8 ++++-- src/native/macosx/org_lwjgl_opengl_Display.m | 28 +++++++++++-------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java b/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java index 3b89f626..b11342a2 100644 --- a/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java +++ b/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java @@ -281,11 +281,15 @@ final class MacOSXNativeKeyboard extends EventQueue { 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); } - 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); } diff --git a/src/native/macosx/org_lwjgl_opengl_Display.m b/src/native/macosx/org_lwjgl_opengl_Display.m index 2fb73f94..f90aa8a9 100644 --- a/src/native/macosx/org_lwjgl_opengl_Display.m +++ b/src/native/macosx/org_lwjgl_opengl_Display.m @@ -274,10 +274,13 @@ static MacOSXPeerInfo *peer_info; } long time = [event timestamp] * 1000000000; jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard); - jmethodID keydown = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(IIJ)V"); - const char* charbuf = [[event characters] cStringUsingEncoding:NSASCIIStringEncoding]; - int charcode = (charbuf == nil) ? 0 : charbuf[0]; - (*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, [event keyCode], charcode, time); + jmethodID keydown = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(ILjava/lang/String;J)V"); + + // convert key characters from NSString to jstring + 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 { @@ -287,10 +290,13 @@ static MacOSXPeerInfo *peer_info; } long time = [event timestamp] * 1000000000; jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard); - jmethodID keyup = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(IIJ)V"); - const char* charbuf = [[event characters] cStringUsingEncoding:NSASCIIStringEncoding]; - int charcode = (charbuf == nil) ? 0 : charbuf[0]; - (*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, [event keyCode], charcode, time); + jmethodID keyup = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(ILjava/lang/String;J)V"); + + // convert key characters from NSString to jstring + 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 { @@ -322,12 +328,12 @@ static MacOSXPeerInfo *peer_info; jmethodID keyMethod; 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 { - 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 {