From 129d0711c5d53e45d7c2e7aa1bf7dabdae77551d Mon Sep 17 00:00:00 2001 From: Erik Broes Date: Thu, 29 Nov 2012 18:27:08 +0100 Subject: [PATCH] Modifiers now report the correct side they are pressed. Added 'fn'-key as modifier. --- src/java/org/lwjgl/input/Keyboard.java | 3 +- .../lwjgl/opengl/MacOSXNativeKeyboard.java | 106 +++++++++--------- src/native/macosx/context.h | 2 - src/native/macosx/org_lwjgl_opengl_Display.m | 72 +++++------- 4 files changed, 82 insertions(+), 101 deletions(-) diff --git a/src/java/org/lwjgl/input/Keyboard.java b/src/java/org/lwjgl/input/Keyboard.java index c37f98f2..00c7652b 100644 --- a/src/java/org/lwjgl/input/Keyboard.java +++ b/src/java/org/lwjgl/input/Keyboard.java @@ -182,6 +182,7 @@ public class Keyboard { public static final int KEY_DIVIDE = 0xB5; /* / on numeric keypad */ public static final int KEY_SYSRQ = 0xB7; public static final int KEY_RMENU = 0xB8; /* right Alt */ + public static final int KEY_FUNCTION = 0xC4; /* Function (Mac) */ public static final int KEY_PAUSE = 0xC5; /* Pause */ public static final int KEY_HOME = 0xC7; /* Home on arrow keypad */ public static final int KEY_UP = 0xC8; /* UpArrow on arrow keypad */ @@ -194,7 +195,7 @@ public class Keyboard { public static final int KEY_INSERT = 0xD2; /* Insert on arrow keypad */ public static final int KEY_DELETE = 0xD3; /* Delete on arrow keypad */ public static final int KEY_CLEAR = 0xDA; /* Clear key (Mac) */ - public static final int KEY_LMETA = 0xDB; /* Left Windows/Option key */ + public static final int KEY_LMETA = 0xDB; /* Left Windows/Option key */ /** * The left windows key, mapped to KEY_LMETA * diff --git a/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java b/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java index dadc1cf4..5c631e56 100644 --- a/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java +++ b/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java @@ -71,6 +71,7 @@ final class MacOSXNativeKeyboard extends EventQueue { private native void nUnregisterKeyListener(ByteBuffer window_handle); + // These are from: private void initKeyboardMappings() { nativeToLwjglMap.put((Short)(short)0x1D, Keyboard.KEY_0); nativeToLwjglMap.put((Short)(short)0x12, Keyboard.KEY_1); @@ -108,15 +109,28 @@ final class MacOSXNativeKeyboard extends EventQueue { nativeToLwjglMap.put((Short)(short)0x07, Keyboard.KEY_X); nativeToLwjglMap.put((Short)(short)0x10, Keyboard.KEY_Y); nativeToLwjglMap.put((Short)(short)0x06, Keyboard.KEY_Z); - nativeToLwjglMap.put((Short)(short)0x0A, Keyboard.KEY_SECTION); + + nativeToLwjglMap.put((Short)(short)0x2A, Keyboard.KEY_BACKSLASH); nativeToLwjglMap.put((Short)(short)0x2B, Keyboard.KEY_COMMA); + nativeToLwjglMap.put((Short)(short)0x18, Keyboard.KEY_EQUALS); + nativeToLwjglMap.put((Short)(short)0x21, Keyboard.KEY_LBRACKET); + nativeToLwjglMap.put((Short)(short)0x1B, Keyboard.KEY_MINUS); + nativeToLwjglMap.put((Short)(short)0x27, Keyboard.KEY_APOSTROPHE); + nativeToLwjglMap.put((Short)(short)0x1E, Keyboard.KEY_RBRACKET); + nativeToLwjglMap.put((Short)(short)0x29, Keyboard.KEY_SEMICOLON); nativeToLwjglMap.put((Short)(short)0x2C, Keyboard.KEY_SLASH); nativeToLwjglMap.put((Short)(short)0x2F, Keyboard.KEY_PERIOD); nativeToLwjglMap.put((Short)(short)0x32, Keyboard.KEY_CIRCUMFLEX); - nativeToLwjglMap.put((Short)(short)0x29, Keyboard.KEY_SEMICOLON); - nativeToLwjglMap.put((Short)(short)0x129, Keyboard.KEY_COLON); - nativeToLwjglMap.put((Short)(short)0x2A, Keyboard.KEY_BACKSLASH); + + nativeToLwjglMap.put((Short)(short)0x41, Keyboard.KEY_DECIMAL); + nativeToLwjglMap.put((Short)(short)0x43, Keyboard.KEY_MULTIPLY); + nativeToLwjglMap.put((Short)(short)0x45, Keyboard.KEY_ADD); nativeToLwjglMap.put((Short)(short)0x47, Keyboard.KEY_CLEAR); + nativeToLwjglMap.put((Short)(short)0x4B, Keyboard.KEY_DIVIDE); + nativeToLwjglMap.put((Short)(short)0x4C, Keyboard.KEY_NUMPADENTER); + nativeToLwjglMap.put((Short)(short)0x4E, Keyboard.KEY_SUBTRACT); + nativeToLwjglMap.put((Short)(short)0x51, Keyboard.KEY_NUMPADEQUALS); + nativeToLwjglMap.put((Short)(short)0x52, Keyboard.KEY_NUMPAD0); nativeToLwjglMap.put((Short)(short)0x53, Keyboard.KEY_NUMPAD1); nativeToLwjglMap.put((Short)(short)0x54, Keyboard.KEY_NUMPAD2); @@ -127,7 +141,26 @@ final class MacOSXNativeKeyboard extends EventQueue { nativeToLwjglMap.put((Short)(short)0x59, Keyboard.KEY_NUMPAD7); nativeToLwjglMap.put((Short)(short)0x5B, Keyboard.KEY_NUMPAD8); nativeToLwjglMap.put((Short)(short)0x5C, Keyboard.KEY_NUMPAD9); - nativeToLwjglMap.put((Short)(short)0x4C, Keyboard.KEY_NUMPADENTER); + + + nativeToLwjglMap.put((Short)(short)0x24, Keyboard.KEY_RETURN); + nativeToLwjglMap.put((Short)(short)0x30, Keyboard.KEY_TAB); + nativeToLwjglMap.put((Short)(short)0x31, Keyboard.KEY_SPACE); + nativeToLwjglMap.put((Short)(short)0x33, Keyboard.KEY_BACK); + nativeToLwjglMap.put((Short)(short)0x35, Keyboard.KEY_ESCAPE); + nativeToLwjglMap.put((Short)(short)0x36, Keyboard.KEY_RMETA); // not in Events.h - works on MBP + nativeToLwjglMap.put((Short)(short)0x37, Keyboard.KEY_LMETA); + nativeToLwjglMap.put((Short)(short)0x38, Keyboard.KEY_LSHIFT); + nativeToLwjglMap.put((Short)(short)0x39, Keyboard.KEY_CAPITAL); + nativeToLwjglMap.put((Short)(short)0x3A, Keyboard.KEY_LMENU); + nativeToLwjglMap.put((Short)(short)0x3B, Keyboard.KEY_LCONTROL); + nativeToLwjglMap.put((Short)(short)0x3C, Keyboard.KEY_RSHIFT); + nativeToLwjglMap.put((Short)(short)0x3D, Keyboard.KEY_RMENU); + nativeToLwjglMap.put((Short)(short)0x3E, Keyboard.KEY_RCONTROL); + + nativeToLwjglMap.put((Short)(short)0x3F, Keyboard.KEY_FUNCTION); + nativeToLwjglMap.put((Short)(short)0x77, Keyboard.KEY_END); + nativeToLwjglMap.put((Short)(short)0x7A, Keyboard.KEY_F1); nativeToLwjglMap.put((Short)(short)0x78, Keyboard.KEY_F2); nativeToLwjglMap.put((Short)(short)0x63, Keyboard.KEY_F3); @@ -147,58 +180,25 @@ final class MacOSXNativeKeyboard extends EventQueue { nativeToLwjglMap.put((Short)(short)0x40, Keyboard.KEY_F17); nativeToLwjglMap.put((Short)(short)0x4F, Keyboard.KEY_F18); nativeToLwjglMap.put((Short)(short)0x50, Keyboard.KEY_F19); - nativeToLwjglMap.put((Short)(short)0x72, Keyboard.KEY_INSERT); - nativeToLwjglMap.put((Short)(short)0x73, Keyboard.KEY_HOME); - nativeToLwjglMap.put((Short)(short)0x77, Keyboard.KEY_END); + // nativeToLwjglMap.put((Short)(short)0x5A, Keyboard.KEY_F20); + nativeToLwjglMap.put((Short)(short)0x75, Keyboard.KEY_DELETE); - nativeToLwjglMap.put((Short)(short)0x18, Keyboard.KEY_EQUALS); + nativeToLwjglMap.put((Short)(short)0x72, Keyboard.KEY_INSERT); // 'Help' in Events.h + nativeToLwjglMap.put((Short)(short)0x73, Keyboard.KEY_HOME); + // nativeToLwjglMap.put((Short)(short)0xA4, Keyboard.KEY_MUTE); + nativeToLwjglMap.put((Short)(short)0x79, Keyboard.KEY_NEXT); + nativeToLwjglMap.put((Short)(short)0x74, Keyboard.KEY_PRIOR); + // nativeToLwjglMap.put((Short)(short)0x49, Keyboard.KEY_VOLUMEDOWN); + // nativeToLwjglMap.put((Short)(short)0x48, Keyboard.KEY_VOLUMEUP); nativeToLwjglMap.put((Short)(short)0x7B, Keyboard.KEY_LEFT); nativeToLwjglMap.put((Short)(short)0x7C, Keyboard.KEY_RIGHT); - nativeToLwjglMap.put((Short)(short)0x7E, Keyboard.KEY_UP); nativeToLwjglMap.put((Short)(short)0x7D, Keyboard.KEY_DOWN); - nativeToLwjglMap.put((Short)(short)0x31, Keyboard.KEY_SPACE); - nativeToLwjglMap.put((Short)(short)0x30, Keyboard.KEY_TAB); - nativeToLwjglMap.put((Short)(short)0x35, Keyboard.KEY_ESCAPE); - nativeToLwjglMap.put((Short)(short)0x74, Keyboard.KEY_PRIOR); - nativeToLwjglMap.put((Short)(short)0x79, Keyboard.KEY_NEXT); - nativeToLwjglMap.put((Short)(short)0x41, Keyboard.KEY_DECIMAL); - nativeToLwjglMap.put((Short)(short)0x43, Keyboard.KEY_MULTIPLY); - nativeToLwjglMap.put((Short)(short)0x45, Keyboard.KEY_ADD); - nativeToLwjglMap.put((Short)(short)0x4B, Keyboard.KEY_DIVIDE); - nativeToLwjglMap.put((Short)(short)0x1B, Keyboard.KEY_MINUS); - nativeToLwjglMap.put((Short)(short)0x4E, Keyboard.KEY_SUBTRACT); - nativeToLwjglMap.put((Short)(short)0x1E, Keyboard.KEY_RBRACKET); - nativeToLwjglMap.put((Short)(short)0x21, Keyboard.KEY_LBRACKET); - nativeToLwjglMap.put((Short)(short)0x33, Keyboard.KEY_BACK); - nativeToLwjglMap.put((Short)(short)0x24, Keyboard.KEY_RETURN); - nativeToLwjglMap.put((Short)(short)0xF0, Keyboard.KEY_CAPITAL); - nativeToLwjglMap.put((Short)(short)0x39, Keyboard.KEY_CAPITAL); - nativeToLwjglMap.put((Short)(short)0xF1, Keyboard.KEY_LSHIFT); - nativeToLwjglMap.put((Short)(short)0x38, Keyboard.KEY_LSHIFT); - nativeToLwjglMap.put((Short)(short)0x3C, Keyboard.KEY_RSHIFT); - nativeToLwjglMap.put((Short)(short)0xF2, Keyboard.KEY_LCONTROL); - nativeToLwjglMap.put((Short)(short)0xF3, Keyboard.KEY_LMENU); - nativeToLwjglMap.put((Short)(short)0x3A, Keyboard.KEY_LMENU); - nativeToLwjglMap.put((Short)(short)0x3D, Keyboard.KEY_RMENU); - nativeToLwjglMap.put((Short)(short)0xF4, Keyboard.KEY_LMETA); - nativeToLwjglMap.put((Short)(short)0xF5, Keyboard.KEY_NUMLOCK); - nativeToLwjglMap.put((Short)(short)0x27, Keyboard.KEY_APOSTROPHE); - - /*KEY_MAP[KeyEvent.VK_ALT_GRAPH] = Keyboard.KEY_RMENU; - KEY_MAP[KeyEvent.VK_AT] = Keyboard.KEY_AT; - KEY_MAP[KeyEvent.VK_BACK_SPACE] = Keyboard.KEY_BACK; - KEY_MAP[KeyEvent.VK_CAPS_LOCK] = Keyboard.KEY_CAPITAL; - KEY_MAP[KeyEvent.VK_COLON] = Keyboard.KEY_COLON; - KEY_MAP[KeyEvent.VK_CONVERT] = Keyboard.KEY_CONVERT; - KEY_MAP[KeyEvent.VK_END] = Keyboard.KEY_END; - KEY_MAP[KeyEvent.VK_INSERT] = Keyboard.KEY_INSERT; - KEY_MAP[KeyEvent.VK_KANA] = Keyboard.KEY_KANA; - KEY_MAP[KeyEvent.VK_KANJI] = Keyboard.KEY_KANJI; - KEY_MAP[KeyEvent.VK_NUM_LOCK] = Keyboard.KEY_NUMLOCK; - KEY_MAP[KeyEvent.VK_PAUSE] = Keyboard.KEY_PAUSE; - KEY_MAP[KeyEvent.VK_SCROLL_LOCK] = Keyboard.KEY_SCROLL; - KEY_MAP[KeyEvent.VK_SEPARATOR] = Keyboard.KEY_DECIMAL; - KEY_MAP[KeyEvent.VK_STOP] = Keyboard.KEY_STOP;*/ + nativeToLwjglMap.put((Short)(short)0x7E, Keyboard.KEY_UP); + + nativeToLwjglMap.put((Short)(short)0x0A, Keyboard.KEY_SECTION); + + nativeToLwjglMap.put((Short)(short)0x6E, Keyboard.KEY_APPS); // not in Events.h + nativeToLwjglMap.put((Short)(short)0x129, Keyboard.KEY_COLON); // not in Events.h -- do we need it? } public void register() { diff --git a/src/native/macosx/context.h b/src/native/macosx/context.h index 4e14a332..681617b0 100644 --- a/src/native/macosx/context.h +++ b/src/native/macosx/context.h @@ -81,8 +81,6 @@ typedef struct { @private NSOpenGLContext* _openGLContext; NSOpenGLPixelFormat* _pixelFormat; - NSUInteger _lastModifierFlags; - NSUInteger _modifierFlags; } + (NSOpenGLPixelFormat*)defaultPixelFormat; diff --git a/src/native/macosx/org_lwjgl_opengl_Display.m b/src/native/macosx/org_lwjgl_opengl_Display.m index 06bf21bb..1c819237 100644 --- a/src/native/macosx/org_lwjgl_opengl_Display.m +++ b/src/native/macosx/org_lwjgl_opengl_Display.m @@ -89,8 +89,6 @@ static NSAutoreleasePool *pool; - (id)initWithFrame:(NSRect)frameRect pixelFormat:(NSOpenGLPixelFormat*)format { self = [super initWithFrame:frameRect]; - _lastModifierFlags = 0; - _modifierFlags = 0; if (self != nil) { _pixelFormat = [format retain]; [[NSNotificationCenter defaultCenter] addObserver:self @@ -198,51 +196,35 @@ static NSAutoreleasePool *pool; return; } long time = [event timestamp] * 1000000000; + + NSUInteger mask = ~0; + switch([event keyCode]) { + case kVK_Control : mask = 0x0001; break; + case kVK_Shift : mask = 0x0002; break; + case kVK_RightShift : mask = 0x0004; break; + case kVK_Command : mask = 0x0008; break; + case 0x36 : mask = 0x0010; break; // Should be: kVK_RightCommand -- missing O.o + case kVK_Option : mask = 0x0020; break; + case kVK_RightOption : mask = 0x0040; break; + case kVK_RightControl: mask = 0x2000; break; + case kVK_CapsLock : mask = NSAlphaShiftKeyMask; break; + case kVK_Function : mask = NSFunctionKeyMask; break; + // case 0x?? : mask = NSNumericPadKeyMask; break; // Didn't have the keycode for this one :( + default: + printf("Unknown modifier with keycode: %d\n", [event keyCode]); + return; + } + jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard); - jmethodID keydown = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(IIJ)V"); - jmethodID keyup = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(IIJ)V"); - _lastModifierFlags = _modifierFlags; - _modifierFlags = [event modifierFlags]; - NSUInteger flagDown = ~_lastModifierFlags & _modifierFlags; - NSUInteger flagUp = _lastModifierFlags & ~_modifierFlags; - if (flagDown & NSAlphaShiftKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, 0xf0, 0, time); + + jmethodID keyMethod; + if (([event modifierFlags] & mask) == mask) { + keyMethod = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(IIJ)V"); + } else { + keyMethod = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(IIJ)V"); } - if (flagUp & NSAlphaShiftKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, 0xf0, 0, time); - } - if (flagDown & NSShiftKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, 0xf1, 0, time); - } - if (flagUp & NSShiftKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, 0xf1, 0, time); - } - if (flagDown & NSControlKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, 0xf2, 0, time); - } - if (flagUp & NSControlKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, 0xf2, 0, time); - } - if (flagDown & NSAlternateKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, 0xf3, 0, time); - } - if (flagUp & NSAlternateKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, 0xf3, 0, time); - } - if (flagDown & NSCommandKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, 0xf4, 0, time); - } - if (flagUp & NSCommandKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, 0xf4, 0, time); - } - if (flagDown & NSNumericPadKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, 0xf5, 0, time); - } - if (flagUp & NSNumericPadKeyMask) { - (*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, 0xf5, 0, time); - } - //const char* charbuf = [[event characters] cStringUsingEncoding:NSASCIIStringEncoding]; - //(*env)->CallVoidMethod(env, _parent->jkeyboard, keymod, (jint)[event keyCode], (jint)charbuf[0], time); + + (*env)->CallVoidMethod(env, _parent->jkeyboard, keyMethod, [event keyCode], 0, time); } - (void)mouseButtonState:(NSEvent *)event :(int)button :(int)state {