From e62178a8df1e21c6fa06c12481d88d0d154349c3 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 6 Oct 2003 15:28:12 +0000 Subject: [PATCH] *** empty log message *** --- .../macosx/org_lwjgl_input_Keyboard.cpp | 171 +++++++++--------- src/native/macosx/org_lwjgl_opengl_Window.cpp | 14 +- 2 files changed, 92 insertions(+), 93 deletions(-) diff --git a/src/native/macosx/org_lwjgl_input_Keyboard.cpp b/src/native/macosx/org_lwjgl_input_Keyboard.cpp index e79e8b29..d117517e 100644 --- a/src/native/macosx/org_lwjgl_input_Keyboard.cpp +++ b/src/native/macosx/org_lwjgl_input_Keyboard.cpp @@ -47,6 +47,29 @@ #define KEYBOARD_SIZE 256 #define KEY_EVENT_BACKLOG 40 +static unsigned char key_buf[KEYBOARD_SIZE]; +static unsigned char key_map[KEYBOARD_SIZE]; + +static void handleKey(UInt32 key_code, unsigned char state) { + if (key_code >= KEYBOARD_SIZE) { +#ifdef _DEBUG + printf("Key code too large %x\n", (unsigned int)key_code); +#endif + return; + } + lock(); + unsigned char mapped_code = key_map[key_code]; + unsigned char old_state = key_buf[mapped_code]; + if (old_state != state) { +if (state == 1) + printf("key down, key %x\n", key_code); +else + printf("key up, key %x\n", key_code); + key_buf[mapped_code] = state; + } + unlock(); +} + static pascal OSStatus doKeyDown(EventHandlerCallRef next_handler, EventRef event, void *user_data) { UInt32 key_code; OSStatus err = GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, sizeof(key_code), NULL, &key_code); @@ -56,7 +79,7 @@ static pascal OSStatus doKeyDown(EventHandlerCallRef next_handler, EventRef even #endif return eventNotHandledErr; } -printf("key down, key %d\n", key_code); + handleKey(key_code, 1); return noErr; } @@ -69,109 +92,85 @@ static pascal OSStatus doKeyUp(EventHandlerCallRef next_handler, EventRef event, #endif return eventNotHandledErr; } -printf("key up, key %d\n", key_code); + handleKey(key_code, 0); return noErr; } +static void handleModifier(UInt32 modifier_bit_mask, UInt32 modifier_bit, unsigned char key_code) { + bool key_down = (modifier_bit_mask & modifier_bit) == modifier_bit; + unsigned char key_state = key_down ? 1 : 0; + handleKey(key_code, key_state); +} + +static pascal OSStatus doKeyModifier(EventHandlerCallRef next_handler, EventRef event, void *user_data) { + UInt32 modifier_bits; + OSStatus err = GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifier_bits), NULL, &modifier_bits); + if (err != noErr) { +#ifdef _DEBUG + printf("Could not get event key code\n"); +#endif + return eventNotHandledErr; + } + handleModifier(modifier_bits, controlKey, 0x1d); + handleModifier(modifier_bits, rightControlKey, 0x9d); + handleModifier(modifier_bits, shiftKey, 0x2a); + handleModifier(modifier_bits, rightShiftKey, 0x36); + handleModifier(modifier_bits, optionKey, 0x38); + handleModifier(modifier_bits, rightOptionKey, 0xb8); + handleModifier(modifier_bits, cmdKey, 0xdb); + handleModifier(modifier_bits, alphaLock, 0x3a); + handleModifier(modifier_bits, kEventKeyModifierNumLockMask, 0x45); + //handleModifier(modifier_bits, rightCmdKey, 0xdc); + return noErr; +} + +static bool registerHandler(JNIEnv* env, WindowRef win_ref, EventHandlerProcPtr func, UInt32 event_kind) { + EventTypeSpec event_type; + EventHandlerUPP handler_upp = NewEventHandlerUPP(func); + event_type.eventClass = kEventClassKeyboard; + event_type.eventKind = event_kind; + OSStatus err = InstallWindowEventHandler(win_ref, handler_upp, 1, &event_type, NULL, NULL); + DisposeEventHandlerUPP(handler_upp); + if (noErr != err) { + throwException(env, "Could not register window event handler"); + return true; + } + return false; +} + bool registerKeyboardHandler(JNIEnv* env, WindowRef win_ref) { - EventTypeSpec event_types[1]; - EventHandlerUPP handler_upp = NewEventHandlerUPP(doKeyUp); - event_types[0].eventClass = kEventClassKeyboard; - event_types[0].eventKind = kEventRawKeyUp; - OSStatus err = InstallWindowEventHandler(win_ref, handler_upp, 1, event_types, NULL, NULL); - DisposeEventHandlerUPP(handler_upp); - if (noErr != err) { - throwException(env, "Could not register window event handler"); - return false; - } - handler_upp = NewEventHandlerUPP(doKeyDown); - event_types[0].eventClass = kEventClassKeyboard; - event_types[0].eventKind = kEventRawKeyDown; - err = InstallWindowEventHandler(win_ref, handler_upp, 1, event_types, NULL, NULL); - DisposeEventHandlerUPP(handler_upp); - if (noErr != err) { - throwException(env, "Could not register window event handler"); - return false; - } - return true; + bool error = registerHandler(env, win_ref, doKeyUp, kEventRawKeyUp); + error = error || registerHandler(env, win_ref, doKeyDown, kEventRawKeyDown); + error = error || registerHandler(env, win_ref, doKeyModifier, kEventRawKeyModifiersChanged); + return !error; } -/* - * Class: org_lwjgl_input_Keyboard - * Method: initIDs - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_initIDs - (JNIEnv * env, jclass clazz) -{ +JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_initIDs(JNIEnv * env, jclass clazz) { } -/* - * Class: org_lwjgl_input_Keyboard - * Method: nCreate - * Signature: ()Z - */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nCreate - (JNIEnv * env, jclass clazz) -{ +JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nCreate(JNIEnv * env, jclass clazz) { + memset(key_buf, 0, KEYBOARD_SIZE*sizeof(unsigned char)); } -/* - * Class: org_lwjgl_input_Keyboard - * Method: nDestroy - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nDestroy - (JNIEnv * env, jclass clazz) -{ +JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nDestroy(JNIEnv * env, jclass clazz) { } -/* - * Class: org_lwjgl_input_Keyboard - * Method: nPoll - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nPoll - (JNIEnv * env, jclass clazz, jobject buffer) -{ +JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nPoll(JNIEnv * env, jclass clazz, jobject buffer) { + unsigned char *new_keyboard_buffer = (unsigned char *)env->GetDirectBufferAddress(buffer); + lock(); + memcpy(new_keyboard_buffer, key_buf, KEYBOARD_SIZE*sizeof(unsigned char)); + unlock(); } -/* - * Class: org_lwjgl_input_Keyboard - * Method: nRead - * Signature: (I)V - */ -JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nRead - (JNIEnv * env, jclass clazz) -{ +JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nRead(JNIEnv * env, jclass clazz) { } -/* - * Class: org_lwjgl_input_Keyboard - * Method: nEnableTranslation - * Signature: ()I - */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nEnableTranslation - (JNIEnv *env, jclass clazz) -{ +JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nEnableTranslation(JNIEnv *env, jclass clazz) { } -/* - * Class: org_lwjgl_input_Keyboard - * Method: nEnableBuffer - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nEnableBuffer - (JNIEnv * env, jclass clazz) -{ +JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nEnableBuffer(JNIEnv * env, jclass clazz) { } -/* - * Class: org_lwjgl_input_Keyboard - * Method: nisStateKeySet - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nisStateKeySet(JNIEnv *env, jclass clazz, jint key) -{ - return org_lwjgl_input_Keyboard_STATE_UNKNOWN; +JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nisStateKeySet(JNIEnv *env, jclass clazz, jint key) { + return org_lwjgl_input_Keyboard_STATE_UNKNOWN; } diff --git a/src/native/macosx/org_lwjgl_opengl_Window.cpp b/src/native/macosx/org_lwjgl_opengl_Window.cpp index 50e6a5f1..6e470525 100644 --- a/src/native/macosx/org_lwjgl_opengl_Window.cpp +++ b/src/native/macosx/org_lwjgl_opengl_Window.cpp @@ -107,7 +107,7 @@ static pascal OSStatus doQuit(EventHandlerCallRef next_handler, EventRef event, return noErr; } -static bool registerWindowHandler(JNIEnv* env, EventHandlerProcPtr func, UInt32 event_kind) { +static bool registerWindowHandler(JNIEnv* env, WindowRef win_ref, EventHandlerProcPtr func, UInt32 event_kind) { EventTypeSpec event_type; OSStatus err; EventHandlerUPP handler_upp = NewEventHandlerUPP(func); @@ -124,11 +124,11 @@ static bool registerWindowHandler(JNIEnv* env, EventHandlerProcPtr func, UInt32 static bool registerEventHandlers(JNIEnv *env) { bool error; - error = registerWindowHandler(env, doQuit, kEventWindowClose); - error = error || registerWindowHandler(env, doActivate, kEventWindowActivated); - error = error || registerWindowHandler(env, doDeactivate, kEventWindowDeactivated); - error = error || registerWindowHandler(env, doMiniaturized, kEventWindowCollapsed); - error = error || registerWindowHandler(env, doMaximize, kEventWindowExpanded); + error = registerWindowHandler(env, win_ref, doQuit, kEventWindowClose); + error = error || registerWindowHandler(env, win_ref, doActivate, kEventWindowActivated); + error = error || registerWindowHandler(env, win_ref, doDeactivate, kEventWindowDeactivated); + error = error || registerWindowHandler(env, win_ref, doMiniaturized, kEventWindowCollapsed); + error = error || registerWindowHandler(env, win_ref, doMaximize, kEventWindowExpanded); if (error) return false; else @@ -143,11 +143,11 @@ static void destroyWindow(void) { } static void destroy(void) { - destroyLock(); aglSetCurrentContext(NULL); aglDestroyContext(context); destroyWindow(); extgl_Close(); + destroyLock(); } static bool createContext(JNIEnv *env, jint bpp, jint alpha, jint depth, jint stencil) {