mirror of
https://github.com/raysan5/raylib.git
synced 2026-02-01 03:39:18 -05:00
REVIEWED: Avoid rtext dependency on rcore_desktop_sdl #4959
This commit is contained in:
@ -424,6 +424,8 @@ void ClosePlatform(void); // Close platform
|
|||||||
|
|
||||||
static KeyboardKey ConvertScancodeToKey(SDL_Scancode sdlScancode); // Help convert SDL scancodes to raylib key
|
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
|
// 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)
|
// 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
|
// Check if there is space available in the queue
|
||||||
if (CORE.Input.Keyboard.charPressedQueueCount < MAX_CHAR_PRESSED_QUEUE)
|
if (CORE.Input.Keyboard.charPressedQueueCount < MAX_CHAR_PRESSED_QUEUE)
|
||||||
{
|
{
|
||||||
// Add character (codepoint) to the 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++;
|
CORE.Input.Keyboard.charPressedQueueCount++;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@ -2093,4 +2100,42 @@ static KeyboardKey ConvertScancodeToKey(SDL_Scancode sdlScancode)
|
|||||||
|
|
||||||
return KEY_NULL; // No equivalent key in Raylib
|
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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user