diff --git a/src/api/l_event.c b/src/api/l_event.c index 486a08a2..bbe6d129 100644 --- a/src/api/l_event.c +++ b/src/api/l_event.c @@ -142,8 +142,9 @@ static int nextEvent(lua_State* L) { return 3; case EVENT_TEXTINPUT: + lua_pushlstring(L, event.data.text.utf8, strnlen(event.data.text.utf8, 4)); lua_pushinteger(L, event.data.text.codepoint); - return 2; + return 3; #ifdef LOVR_ENABLE_THREAD case EVENT_THREAD_ERROR: diff --git a/src/modules/event/event.c b/src/modules/event/event.c index 413256d3..8374c168 100644 --- a/src/modules/event/event.c +++ b/src/modules/event/event.c @@ -23,10 +23,28 @@ static void onKeyboardEvent(ButtonAction action, KeyCode key, uint32_t scancode, } static void onTextEvent(uint32_t codepoint) { - lovrEventPush((Event) { - .type = EVENT_TEXTINPUT, - .data.text.codepoint = codepoint - }); + Event event = { .type = EVENT_TEXTINPUT, .data.text.codepoint = codepoint }; + + uint32_t c = codepoint; + char* s = event.data.text.utf8; + + if (c <= 0x7f) { + s[0] = codepoint; + } else if (c <= 0x7ff) { + s[0] = (0xc0 | ((c >> 6) & 0x1f)); + s[1] = (0x80 | (c & 0x3f)); + } else if (c <= 0xffff) { + s[0] = (0xe0 | ((c >> 12) & 0x0f)); + s[1] = (0x80 | ((c >> 6) & 0x3f)); + s[2] = (0x80 | (c & 0x3f)); + } else if (c <= 0x10ffff) { + s[1] = (0xf0 | ((c >> 18) & 0x07)); + s[1] = (0x80 | ((c >> 12) & 0x3f)); + s[2] = (0x80 | ((c >> 6) & 0x3f)); + s[3] = (0x80 | (c & 0x3f)); + } + + lovrEventPush(event); } void lovrVariantDestroy(Variant* variant) {