diff --git a/src/main/haiku/SDL_BApp.h b/src/main/haiku/SDL_BApp.h index 157c23635..9672d462c 100644 --- a/src/main/haiku/SDL_BApp.h +++ b/src/main/haiku/SDL_BApp.h @@ -193,7 +193,8 @@ public: if(_current_context) _current_context->UnlockGL(); _current_context = newContext; - _current_context->LockGL(); + if (_current_context) + _current_context->LockGL(); } private: /* Event management */ @@ -272,6 +273,17 @@ private: } BE_SetKeyState(scancode, state); SDL_SendKeyboardKey(state, BE_GetScancodeFromBeKey(scancode)); + + if (state == SDL_PRESSED && SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) { + const int8 *keyUtf8; + ssize_t count; + if (msg->FindData("key-utf8", B_INT8_TYPE, (const void**)&keyUtf8, &count) == B_OK) { + char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; + SDL_zero(text); + SDL_memcpy(text, keyUtf8, count); + SDL_SendKeyboardText(text); + } + } } void _HandleMouseFocus(BMessage *msg) { diff --git a/src/video/haiku/SDL_BWin.h b/src/video/haiku/SDL_BWin.h index 0f031491b..a353e1aca 100644 --- a/src/video/haiku/SDL_BWin.h +++ b/src/video/haiku/SDL_BWin.h @@ -337,16 +337,30 @@ class SDL_BWin:public BDirectWindow break; case B_KEY_DOWN: + { + int32 i = 0; + int8 byte; + int8 bytes[4] = { 0, 0, 0, 0 }; + while (i < 4 && msg->FindInt8("byte", i, &byte) == B_OK) { + bytes[i] = byte; + i++; + } + if (msg->FindInt32("key", &key) == B_OK) { + _KeyEvent((SDL_Scancode)key, &bytes[0], i, SDL_PRESSED); + } + } + break; + case B_UNMAPPED_KEY_DOWN: /* modifier keys are unmapped */ if (msg->FindInt32("key", &key) == B_OK) { - _KeyEvent((SDL_Scancode)key, SDL_PRESSED); + _KeyEvent((SDL_Scancode)key, NULL, 0, SDL_PRESSED); } break; case B_KEY_UP: case B_UNMAPPED_KEY_UP: /* modifier keys are unmapped */ if (msg->FindInt32("key", &key) == B_OK) { - _KeyEvent(key, SDL_RELEASED); + _KeyEvent(key, NULL, 0, SDL_RELEASED); } break; @@ -512,13 +526,15 @@ private: _PostWindowEvent(msg); } - void _KeyEvent(int32 keyCode, int32 keyState) { + void _KeyEvent(int32 keyCode, const int8 *keyUtf8, const ssize_t & len, int32 keyState) { /* Create a message to pass along to the BeApp thread */ BMessage msg(BAPP_KEY); msg.AddInt32("key-state", keyState); msg.AddInt32("key-scancode", keyCode); + if (keyUtf8 != NULL) { + msg.AddData("key-utf8", B_INT8_TYPE, (const void*)keyUtf8, len); + } be_app->PostMessage(&msg); - /* Apparently SDL only uses the scancode */ } void _RepaintEvent() {