From 5066f5737192274cfd318cdba251b047e5b9bb4c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Camilla=20L=C3=B6wy?= <elmindreda@elmindreda.org>
Date: Thu, 30 Dec 2021 19:09:53 +0100
Subject: [PATCH] Clean up internal Unicode code point handling

Call code points by their name and store them as uint32_t.

(cherry picked from commit fe7be39793f993f9bf7480f2389bffad676199f5)
---
 src/init.c         | 30 +++++++++++++++---------------
 src/input.c        |  2 +-
 src/internal.h     |  4 ++--
 src/win32_window.c |  4 ++--
 src/wl_init.c      |  9 ++++-----
 src/wl_window.c    |  6 +++---
 src/x11_window.c   | 22 +++++++++++-----------
 src/xkb_unicode.c  |  4 ++--
 src/xkb_unicode.h  |  4 +++-
 9 files changed, 43 insertions(+), 42 deletions(-)

diff --git a/src/init.c b/src/init.c
index 7dc67f21..758c1094 100644
--- a/src/init.c
+++ b/src/init.c
@@ -114,29 +114,29 @@ static void terminate(void)
 // Encode a Unicode code point to a UTF-8 stream
 // 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;
 
-    if (ch < 0x80)
-        s[count++] = (char) ch;
-    else if (ch < 0x800)
+    if (codepoint < 0x80)
+        s[count++] = (char) codepoint;
+    else if (codepoint < 0x800)
     {
-        s[count++] = (ch >> 6) | 0xc0;
-        s[count++] = (ch & 0x3f) | 0x80;
+        s[count++] = (codepoint >> 6) | 0xc0;
+        s[count++] = (codepoint & 0x3f) | 0x80;
     }
-    else if (ch < 0x10000)
+    else if (codepoint < 0x10000)
     {
-        s[count++] = (ch >> 12) | 0xe0;
-        s[count++] = ((ch >> 6) & 0x3f) | 0x80;
-        s[count++] = (ch & 0x3f) | 0x80;
+        s[count++] = (codepoint >> 12) | 0xe0;
+        s[count++] = ((codepoint >> 6) & 0x3f) | 0x80;
+        s[count++] = (codepoint & 0x3f) | 0x80;
     }
-    else if (ch < 0x110000)
+    else if (codepoint < 0x110000)
     {
-        s[count++] = (ch >> 18) | 0xf0;
-        s[count++] = ((ch >> 12) & 0x3f) | 0x80;
-        s[count++] = ((ch >> 6) & 0x3f) | 0x80;
-        s[count++] = (ch & 0x3f) | 0x80;
+        s[count++] = (codepoint >> 18) | 0xf0;
+        s[count++] = ((codepoint >> 12) & 0x3f) | 0x80;
+        s[count++] = ((codepoint >> 6) & 0x3f) | 0x80;
+        s[count++] = (codepoint & 0x3f) | 0x80;
     }
 
     return count;
diff --git a/src/input.c b/src/input.c
index 96930240..0673d86b 100644
--- a/src/input.c
+++ b/src/input.c
@@ -278,7 +278,7 @@ void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int m
 // Notifies shared code of a Unicode codepoint input 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))
         return;
diff --git a/src/internal.h b/src/internal.h
index 7a030ffd..561f4c18 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -718,7 +718,7 @@ void _glfwInputWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor);
 void _glfwInputKey(_GLFWwindow* window,
                    int key, int scancode, int action, int mods);
 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 _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods);
 void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos);
@@ -774,7 +774,7 @@ GLFWbool _glfwInitVulkan(int mode);
 void _glfwTerminateVulkan(void);
 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);
 float _glfw_fminf(float a, float b);
diff --git a/src/win32_window.c b/src/win32_window.c
index 8f2bd189..d6fc9d07 100644
--- a/src/win32_window.c
+++ b/src/win32_window.c
@@ -646,7 +646,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
                 window->win32.highSurrogate = (WCHAR) wParam;
             else
             {
-                unsigned int codepoint = 0;
+                uint32_t codepoint = 0;
 
                 if (wParam >= 0xdc00 && wParam <= 0xdfff)
                 {
@@ -677,7 +677,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
                 return TRUE;
             }
 
-            _glfwInputChar(window, (unsigned int) wParam, getKeyMods(), GLFW_TRUE);
+            _glfwInputChar(window, (uint32_t) wParam, getKeyMods(), GLFW_TRUE);
             return 0;
         }
 
diff --git a/src/wl_init.c b/src/wl_init.c
index 8fce2406..b0a1a664 100644
--- a/src/wl_init.c
+++ b/src/wl_init.c
@@ -541,8 +541,7 @@ static xkb_keysym_t composeSymbol(xkb_keysym_t sym)
 
 static GLFWbool inputChar(_GLFWwindow* window, uint32_t key)
 {
-    uint32_t code, numSyms;
-    long cp;
+    uint32_t code, numSyms, codepoint;
     const xkb_keysym_t *syms;
     xkb_keysym_t sym;
 
@@ -556,12 +555,12 @@ static GLFWbool inputChar(_GLFWwindow* window, uint32_t key)
 #else
         sym = syms[0];
 #endif
-        cp = _glfwKeySym2Unicode(sym);
-        if (cp != -1)
+        codepoint = _glfwKeySym2Unicode(sym);
+        if (codepoint != GLFW_INVALID_CODEPOINT)
         {
             const int mods = _glfw.wl.xkb.modifiers;
             const int plain = !(mods & (GLFW_MOD_CONTROL | GLFW_MOD_ALT));
-            _glfwInputChar(window, cp, mods, plain);
+            _glfwInputChar(window, codepoint, mods, plain);
         }
     }
 
diff --git a/src/wl_window.c b/src/wl_window.c
index cdbb19d6..f0e878eb 100644
--- a/src/wl_window.c
+++ b/src/wl_window.c
@@ -1387,15 +1387,15 @@ const char* _glfwPlatformGetScancodeName(int scancode)
         return NULL;
     }
 
-    const long codepoint = _glfwKeySym2Unicode(keysyms[0]);
-    if (codepoint == -1)
+    const uint32_t codepoint = _glfwKeySym2Unicode(keysyms[0]);
+    if (codepoint == GLFW_INVALID_CODEPOINT)
     {
         _glfwInputError(GLFW_PLATFORM_ERROR,
                         "Wayland: Failed to retrieve codepoint for key name");
         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)
     {
         _glfwInputError(GLFW_PLATFORM_ERROR,
diff --git a/src/x11_window.c b/src/x11_window.c
index 2ba09cb9..356572d8 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -433,10 +433,10 @@ static char** parseUriList(char* text, int* count)
 // Based on cutef8 by Jeff Bezanson (Public Domain)
 //
 #if defined(X_HAVE_UTF8_STRING)
-static unsigned int decodeUTF8(const char** s)
+static uint32_t decodeUTF8(const char** s)
 {
-    unsigned int ch = 0, count = 0;
-    static const unsigned int offsets[] =
+    uint32_t codepoint = 0, count = 0;
+    static const uint32_t offsets[] =
     {
         0x00000000u, 0x00003080u, 0x000e2080u,
         0x03c82080u, 0xfa082080u, 0x82082080u
@@ -444,13 +444,13 @@ static unsigned int decodeUTF8(const char** s)
 
     do
     {
-        ch = (ch << 6) + (unsigned char) **s;
+        codepoint = (codepoint << 6) + (unsigned char) **s;
         (*s)++;
         count++;
     } while ((**s & 0xc0) == 0x80);
 
     assert(count <= 6);
-    return ch - offsets[count - 1];
+    return codepoint - offsets[count - 1];
 }
 #endif /*X_HAVE_UTF8_STRING*/
 
@@ -1328,9 +1328,9 @@ static void processEvent(XEvent *event)
 
                 _glfwInputKey(window, key, keycode, GLFW_PRESS, mods);
 
-                const long character = _glfwKeySym2Unicode(keysym);
-                if (character != -1)
-                    _glfwInputChar(window, character, mods, plain);
+                const uint32_t codepoint = _glfwKeySym2Unicode(keysym);
+                if (codepoint != GLFW_INVALID_CODEPOINT)
+                    _glfwInputChar(window, codepoint, mods, plain);
             }
 
             return;
@@ -2871,11 +2871,11 @@ const char* _glfwPlatformGetScancodeName(int scancode)
     if (keysym == NoSymbol)
         return NULL;
 
-    const long ch = _glfwKeySym2Unicode(keysym);
-    if (ch == -1)
+    const uint32_t codepoint = _glfwKeySym2Unicode(keysym);
+    if (codepoint == GLFW_INVALID_CODEPOINT)
         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)
         return NULL;
 
diff --git a/src/xkb_unicode.c b/src/xkb_unicode.c
index f30c4cd7..859bedca 100644
--- a/src/xkb_unicode.c
+++ b/src/xkb_unicode.c
@@ -907,7 +907,7 @@ static const struct codepair {
 
 // Convert XKB KeySym to Unicode
 //
-long _glfwKeySym2Unicode(unsigned int keysym)
+uint32_t _glfwKeySym2Unicode(unsigned int keysym)
 {
     int min = 0;
     int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
@@ -937,6 +937,6 @@ long _glfwKeySym2Unicode(unsigned int keysym)
     }
 
     // No matching Unicode value found
-    return -1;
+    return GLFW_INVALID_CODEPOINT;
 }
 
diff --git a/src/xkb_unicode.h b/src/xkb_unicode.h
index f95e14f1..be97cdcb 100644
--- a/src/xkb_unicode.h
+++ b/src/xkb_unicode.h
@@ -24,5 +24,7 @@
 //
 //========================================================================
 
-long _glfwKeySym2Unicode(unsigned int keysym);
+#define GLFW_INVALID_CODEPOINT 0xffffffffu
+
+uint32_t _glfwKeySym2Unicode(unsigned int keysym);