Modifiers now report the correct side they are pressed. Added 'fn'-key as modifier.

This commit is contained in:
Erik Broes 2012-11-29 18:27:08 +01:00
parent 52d46a8408
commit 129d0711c5
4 changed files with 82 additions and 101 deletions

View File

@ -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
*

View File

@ -71,6 +71,7 @@ final class MacOSXNativeKeyboard extends EventQueue {
private native void nUnregisterKeyListener(ByteBuffer window_handle);
// These are from: <HIToolbox/Events.h>
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() {

View File

@ -81,8 +81,6 @@ typedef struct {
@private
NSOpenGLContext* _openGLContext;
NSOpenGLPixelFormat* _pixelFormat;
NSUInteger _lastModifierFlags;
NSUInteger _modifierFlags;
}
+ (NSOpenGLPixelFormat*)defaultPixelFormat;

View File

@ -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 {