Clean up internal Unicode code point handling

Call code points by their name and store them as uint32_t.
This commit is contained in:
Camilla Löwy 2021-12-30 19:09:53 +01:00
parent 17a9e34fbc
commit fe7be39793
9 changed files with 43 additions and 42 deletions

View File

@ -143,29 +143,29 @@ static void terminate(void)
// Encode a Unicode code point to a UTF-8 stream // Encode a Unicode code point to a UTF-8 stream
// Based on cutef8 by Jeff Bezanson (Public Domain) // Based on cutef8 by Jeff Bezanson (Public Domain)
// //
size_t _glfwEncodeUTF8(char* s, unsigned int ch) size_t _glfwEncodeUTF8(char* s, uint32_t codepoint)
{ {
size_t count = 0; size_t count = 0;
if (ch < 0x80) if (codepoint < 0x80)
s[count++] = (char) ch; s[count++] = (char) codepoint;
else if (ch < 0x800) else if (codepoint < 0x800)
{ {
s[count++] = (ch >> 6) | 0xc0; s[count++] = (codepoint >> 6) | 0xc0;
s[count++] = (ch & 0x3f) | 0x80; s[count++] = (codepoint & 0x3f) | 0x80;
} }
else if (ch < 0x10000) else if (codepoint < 0x10000)
{ {
s[count++] = (ch >> 12) | 0xe0; s[count++] = (codepoint >> 12) | 0xe0;
s[count++] = ((ch >> 6) & 0x3f) | 0x80; s[count++] = ((codepoint >> 6) & 0x3f) | 0x80;
s[count++] = (ch & 0x3f) | 0x80; s[count++] = (codepoint & 0x3f) | 0x80;
} }
else if (ch < 0x110000) else if (codepoint < 0x110000)
{ {
s[count++] = (ch >> 18) | 0xf0; s[count++] = (codepoint >> 18) | 0xf0;
s[count++] = ((ch >> 12) & 0x3f) | 0x80; s[count++] = ((codepoint >> 12) & 0x3f) | 0x80;
s[count++] = ((ch >> 6) & 0x3f) | 0x80; s[count++] = ((codepoint >> 6) & 0x3f) | 0x80;
s[count++] = (ch & 0x3f) | 0x80; s[count++] = (codepoint & 0x3f) | 0x80;
} }
return count; return count;

View File

@ -295,7 +295,7 @@ void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int m
// Notifies shared code of a Unicode codepoint input event // Notifies shared code of a Unicode codepoint input event
// The 'plain' parameter determines whether to emit a regular character event // The 'plain' parameter determines whether to emit a regular character event
// //
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, GLFWbool plain) void _glfwInputChar(_GLFWwindow* window, uint32_t codepoint, int mods, GLFWbool plain)
{ {
if (codepoint < 32 || (codepoint > 126 && codepoint < 160)) if (codepoint < 32 || (codepoint > 126 && codepoint < 160))
return; return;

View File

@ -919,7 +919,7 @@ void _glfwInputWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor);
void _glfwInputKey(_GLFWwindow* window, void _glfwInputKey(_GLFWwindow* window,
int key, int scancode, int action, int mods); int key, int scancode, int action, int mods);
void _glfwInputChar(_GLFWwindow* window, void _glfwInputChar(_GLFWwindow* window,
unsigned int codepoint, int mods, GLFWbool plain); uint32_t codepoint, int mods, GLFWbool plain);
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset); void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset);
void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods); void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods);
void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos); void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos);
@ -995,7 +995,7 @@ GLFWbool _glfwInitVulkan(int mode);
void _glfwTerminateVulkan(void); void _glfwTerminateVulkan(void);
const char* _glfwGetVulkanResultString(VkResult result); const char* _glfwGetVulkanResultString(VkResult result);
size_t _glfwEncodeUTF8(char* s, unsigned int ch); size_t _glfwEncodeUTF8(char* s, uint32_t codepoint);
char* _glfw_strdup(const char* source); char* _glfw_strdup(const char* source);
float _glfw_fminf(float a, float b); float _glfw_fminf(float a, float b);

View File

@ -649,7 +649,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
window->win32.highSurrogate = (WCHAR) wParam; window->win32.highSurrogate = (WCHAR) wParam;
else else
{ {
unsigned int codepoint = 0; uint32_t codepoint = 0;
if (wParam >= 0xdc00 && wParam <= 0xdfff) if (wParam >= 0xdc00 && wParam <= 0xdfff)
{ {
@ -683,7 +683,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
return TRUE; return TRUE;
} }
_glfwInputChar(window, (unsigned int) wParam, getKeyMods(), GLFW_TRUE); _glfwInputChar(window, (uint32_t) wParam, getKeyMods(), GLFW_TRUE);
return 0; return 0;
} }

View File

@ -544,8 +544,7 @@ static xkb_keysym_t composeSymbol(xkb_keysym_t sym)
static GLFWbool inputChar(_GLFWwindow* window, uint32_t key) static GLFWbool inputChar(_GLFWwindow* window, uint32_t key)
{ {
uint32_t code, numSyms; uint32_t code, numSyms, codepoint;
long cp;
const xkb_keysym_t *syms; const xkb_keysym_t *syms;
xkb_keysym_t sym; xkb_keysym_t sym;
@ -559,12 +558,12 @@ static GLFWbool inputChar(_GLFWwindow* window, uint32_t key)
#else #else
sym = syms[0]; sym = syms[0];
#endif #endif
cp = _glfwKeySym2Unicode(sym); codepoint = _glfwKeySym2Unicode(sym);
if (cp != -1) if (codepoint != GLFW_INVALID_CODEPOINT)
{ {
const int mods = _glfw.wl.xkb.modifiers; const int mods = _glfw.wl.xkb.modifiers;
const int plain = !(mods & (GLFW_MOD_CONTROL | GLFW_MOD_ALT)); const int plain = !(mods & (GLFW_MOD_CONTROL | GLFW_MOD_ALT));
_glfwInputChar(window, cp, mods, plain); _glfwInputChar(window, codepoint, mods, plain);
} }
} }

View File

@ -1226,15 +1226,15 @@ const char* _glfwGetScancodeNameWayland(int scancode)
return NULL; return NULL;
} }
const long codepoint = _glfwKeySym2Unicode(keysyms[0]); const uint32_t codepoint = _glfwKeySym2Unicode(keysyms[0]);
if (codepoint == -1) if (codepoint == GLFW_INVALID_CODEPOINT)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"Wayland: Failed to retrieve codepoint for key name"); "Wayland: Failed to retrieve codepoint for key name");
return NULL; return NULL;
} }
const size_t count = _glfwEncodeUTF8(_glfw.wl.keynames[key], (unsigned int) codepoint); const size_t count = _glfwEncodeUTF8(_glfw.wl.keynames[key], codepoint);
if (count == 0) if (count == 0)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,

View File

@ -432,10 +432,10 @@ static char** parseUriList(char* text, int* count)
// Decode a Unicode code point from a UTF-8 stream // Decode a Unicode code point from a UTF-8 stream
// Based on cutef8 by Jeff Bezanson (Public Domain) // Based on cutef8 by Jeff Bezanson (Public Domain)
// //
static unsigned int decodeUTF8(const char** s) static uint32_t decodeUTF8(const char** s)
{ {
unsigned int ch = 0, count = 0; uint32_t codepoint = 0, count = 0;
static const unsigned int offsets[] = static const uint32_t offsets[] =
{ {
0x00000000u, 0x00003080u, 0x000e2080u, 0x00000000u, 0x00003080u, 0x000e2080u,
0x03c82080u, 0xfa082080u, 0x82082080u 0x03c82080u, 0xfa082080u, 0x82082080u
@ -443,13 +443,13 @@ static unsigned int decodeUTF8(const char** s)
do do
{ {
ch = (ch << 6) + (unsigned char) **s; codepoint = (codepoint << 6) + (unsigned char) **s;
(*s)++; (*s)++;
count++; count++;
} while ((**s & 0xc0) == 0x80); } while ((**s & 0xc0) == 0x80);
assert(count <= 6); assert(count <= 6);
return ch - offsets[count - 1]; return codepoint - offsets[count - 1];
} }
// Convert the specified Latin-1 string to UTF-8 // Convert the specified Latin-1 string to UTF-8
@ -1286,9 +1286,9 @@ static void processEvent(XEvent *event)
_glfwInputKey(window, key, keycode, GLFW_PRESS, mods); _glfwInputKey(window, key, keycode, GLFW_PRESS, mods);
const long character = _glfwKeySym2Unicode(keysym); const uint32_t codepoint = _glfwKeySym2Unicode(keysym);
if (character != -1) if (codepoint != GLFW_INVALID_CODEPOINT)
_glfwInputChar(window, character, mods, plain); _glfwInputChar(window, codepoint, mods, plain);
} }
return; return;
@ -2868,11 +2868,11 @@ const char* _glfwGetScancodeNameX11(int scancode)
if (keysym == NoSymbol) if (keysym == NoSymbol)
return NULL; return NULL;
const long ch = _glfwKeySym2Unicode(keysym); const uint32_t codepoint = _glfwKeySym2Unicode(keysym);
if (ch == -1) if (codepoint == GLFW_INVALID_CODEPOINT)
return NULL; return NULL;
const size_t count = _glfwEncodeUTF8(_glfw.x11.keynames[key], (unsigned int) ch); const size_t count = _glfwEncodeUTF8(_glfw.x11.keynames[key], codepoint);
if (count == 0) if (count == 0)
return NULL; return NULL;

View File

@ -907,7 +907,7 @@ static const struct codepair {
// Convert XKB KeySym to Unicode // Convert XKB KeySym to Unicode
// //
long _glfwKeySym2Unicode(unsigned int keysym) uint32_t _glfwKeySym2Unicode(unsigned int keysym)
{ {
int min = 0; int min = 0;
int max = sizeof(keysymtab) / sizeof(struct codepair) - 1; int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
@ -937,6 +937,6 @@ long _glfwKeySym2Unicode(unsigned int keysym)
} }
// No matching Unicode value found // No matching Unicode value found
return -1; return GLFW_INVALID_CODEPOINT;
} }

View File

@ -24,5 +24,7 @@
// //
//======================================================================== //========================================================================
long _glfwKeySym2Unicode(unsigned int keysym); #define GLFW_INVALID_CODEPOINT 0xffffffffu
uint32_t _glfwKeySym2Unicode(unsigned int keysym);