|
@@ -424,6 +424,8 @@ void ClosePlatform(void); // Close platform
|
|
|
|
|
|
static KeyboardKey ConvertScancodeToKey(SDL_Scancode sdlScancode); // Help convert SDL scancodes to raylib key
|
|
|
|
|
|
+static int GetCodepointNextSDL(const char *text, int *codepointSize); // Get next codepoint in a byte sequence and bytes processed
|
|
|
+
|
|
|
//----------------------------------------------------------------------------------
|
|
|
// Module Functions Declaration
|
|
|
//----------------------------------------------------------------------------------
|
|
@@ -1601,13 +1603,18 @@ void PollInputEvents(void)
|
|
|
{
|
|
|
// NOTE: event.text.text data comes an UTF-8 text sequence but we register codepoints (int)
|
|
|
|
|
|
- int codepointSize = 0;
|
|
|
-
|
|
|
// Check if there is space available in the queue
|
|
|
if (CORE.Input.Keyboard.charPressedQueueCount < MAX_CHAR_PRESSED_QUEUE)
|
|
|
{
|
|
|
// Add character (codepoint) to the queue
|
|
|
- CORE.Input.Keyboard.charPressedQueue[CORE.Input.Keyboard.charPressedQueueCount] = GetCodepointNext(event.text.text, &codepointSize);
|
|
|
+ #if defined(PLATFORM_DESKTOP_SDL3)
|
|
|
+ unsigned int textLen = strlen(event.text.text);
|
|
|
+ unsigned int codepoint = (unsigned int)SDL_StepUTF8(&event.text.text, textLen);
|
|
|
+ #else
|
|
|
+ int codepointSize = 0;
|
|
|
+ codepoint = GetCodepointNextSDL(event.text.text, &codepointSize);
|
|
|
+ #endif
|
|
|
+ CORE.Input.Keyboard.charPressedQueue[CORE.Input.Keyboard.charPressedQueueCount] = codepoint;
|
|
|
CORE.Input.Keyboard.charPressedQueueCount++;
|
|
|
}
|
|
|
} break;
|
|
@@ -2093,4 +2100,42 @@ static KeyboardKey ConvertScancodeToKey(SDL_Scancode sdlScancode)
|
|
|
|
|
|
return KEY_NULL; // No equivalent key in Raylib
|
|
|
}
|
|
|
-// EOF
|
|
|
+
|
|
|
+// Get next codepoint in a byte sequence and bytes processed
|
|
|
+static int GetCodepointNextSDL(const char *text, int *codepointSize)
|
|
|
+{
|
|
|
+ const char *ptr = text;
|
|
|
+ int codepoint = 0x3f; // Codepoint (defaults to '?')
|
|
|
+ *codepointSize = 1;
|
|
|
+
|
|
|
+ // Get current codepoint and bytes processed
|
|
|
+ if (0xf0 == (0xf8 & ptr[0]))
|
|
|
+ {
|
|
|
+ // 4 byte UTF-8 codepoint
|
|
|
+ if (((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80) || ((ptr[3] & 0xC0) ^ 0x80)) { return codepoint; } // 10xxxxxx checks
|
|
|
+ codepoint = ((0x07 & ptr[0]) << 18) | ((0x3f & ptr[1]) << 12) | ((0x3f & ptr[2]) << 6) | (0x3f & ptr[3]);
|
|
|
+ *codepointSize = 4;
|
|
|
+ }
|
|
|
+ else if (0xe0 == (0xf0 & ptr[0]))
|
|
|
+ {
|
|
|
+ // 3 byte UTF-8 codepoint */
|
|
|
+ if (((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80)) { return codepoint; } // 10xxxxxx checks
|
|
|
+ codepoint = ((0x0f & ptr[0]) << 12) | ((0x3f & ptr[1]) << 6) | (0x3f & ptr[2]);
|
|
|
+ *codepointSize = 3;
|
|
|
+ }
|
|
|
+ else if (0xc0 == (0xe0 & ptr[0]))
|
|
|
+ {
|
|
|
+ // 2 byte UTF-8 codepoint
|
|
|
+ if ((ptr[1] & 0xC0) ^ 0x80) { return codepoint; } // 10xxxxxx checks
|
|
|
+ codepoint = ((0x1f & ptr[0]) << 6) | (0x3f & ptr[1]);
|
|
|
+ *codepointSize = 2;
|
|
|
+ }
|
|
|
+ else if (0x00 == (0x80 & ptr[0]))
|
|
|
+ {
|
|
|
+ // 1 byte UTF-8 codepoint
|
|
|
+ codepoint = ptr[0];
|
|
|
+ *codepointSize = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return codepoint;
|
|
|
+}
|