Browse Source

Cleanup

Related to #983.
Camilla Löwy 8 years ago
parent
commit
186d03b32a
4 changed files with 33 additions and 46 deletions
  1. 2 0
      README.md
  2. 1 1
      src/x11_platform.h
  3. 30 33
      src/x11_window.c
  4. 0 12
      src/xkb_unicode.c

+ 2 - 0
README.md

@@ -179,6 +179,7 @@ information on what to include when reporting a bug.
 - [X11] Bugfix: The RandR monitor path was disabled despite working RandR (#972)
 - [X11] Bugfix: IM-duplicated key events would leak at low polling rates (#747)
 - [X11] Bugfix: Gamma ramp setting via RandR did not validate ramp size
+- [X11] Bugfix: Key name string encoding depended on current locale (#981,#983)
 - [Linux] Bugfix: Event processing did not detect joystick disconnection (#932)
 - [Cocoa] Added support for Vulkan window surface creation via
           [MoltenVK](https://moltengl.com/moltenvk/) (#870)
@@ -233,6 +234,7 @@ skills.
  - John Bartholomew
  - Niklas Behrens
  - Niklas Bergström
+ - Denis Bernard
  - Doug Binks
  - blanco
  - Kyle Brenneman

+ 1 - 1
src/x11_platform.h

@@ -167,7 +167,7 @@ typedef struct _GLFWlibraryX11
     // Clipboard string (while the selection is owned)
     char*           clipboardString;
     // Key name string
-    char            keyName[64];
+    char            keyName[5];
     // X11 keycode to GLFW key LUT
     short int       keycodes[256];
     // GLFW key to X11 keycode LUT

+ 30 - 33
src/x11_window.c

@@ -879,31 +879,32 @@ static void releaseMonitor(_GLFWwindow* window)
 // Encode a Unicode code point to a UTF-8 stream
 // Based on cutef8 by Jeff Bezanson (Public Domain)
 //
-static size_t encodeUTF8(char *dest, uint32_t ch)
-{
-    if (ch < 0x80) {
-        dest[0] = (char)ch;
-        return 1;
-    }
-    if (ch < 0x800) {
-        dest[0] = (ch>>6) | 0xC0;
-        dest[1] = (ch & 0x3F) | 0x80;
-        return 2;
-    }
-    if (ch < 0x10000) {
-        dest[0] = (ch>>12) | 0xE0;
-        dest[1] = ((ch>>6) & 0x3F) | 0x80;
-        dest[2] = (ch & 0x3F) | 0x80;
-        return 3;
-    }
-    if (ch < 0x110000) {
-        dest[0] = (ch>>18) | 0xF0;
-        dest[1] = ((ch>>12) & 0x3F) | 0x80;
-        dest[2] = ((ch>>6) & 0x3F) | 0x80;
-        dest[3] = (ch & 0x3F) | 0x80;
-        return 4;
+static size_t encodeUTF8(char* s, unsigned int ch)
+{
+    size_t count = 0;
+
+    if (ch < 0x80)
+        s[count++] = (char) ch;
+    else if (ch < 0x800)
+    {
+        s[count++] = (ch >> 6) | 0xc0;
+        s[count++] = (ch & 0x3f) | 0x80;
     }
-    return 0;
+    else if (ch < 0x10000)
+    {
+        s[count++] = (ch >> 12) | 0xe0;
+        s[count++] = ((ch >> 6) & 0x3f) | 0x80;
+        s[count++] = (ch & 0x3f) | 0x80;
+    }
+    else if (ch < 0x110000)
+    {
+        s[count++] = (ch >> 18) | 0xf0;
+        s[count++] = ((ch >> 12) & 0x3f) | 0x80;
+        s[count++] = ((ch >> 6) & 0x3f) | 0x80;
+        s[count++] = (ch & 0x3f) | 0x80;
+    }
+
+    return count;
 }
 
 // Decode a Unicode code point from a UTF-8 stream
@@ -2475,10 +2476,6 @@ void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)
 
 const char* _glfwPlatformGetKeyName(int key, int scancode)
 {
-    KeySym keysym;
-    long ch;
-    size_t sz;
-
     if (!_glfw.x11.xkb.available)
         return NULL;
 
@@ -2488,19 +2485,19 @@ const char* _glfwPlatformGetKeyName(int key, int scancode)
     if (!_glfwIsPrintable(_glfw.x11.keycodes[scancode]))
         return NULL;
 
-    keysym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, 0, 0);
+    const KeySym keysym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, 0, 0);
     if (keysym == NoSymbol)
         return NULL;
 
-    ch = _glfwKeySym2Unicode(keysym);
+    const long ch = _glfwKeySym2Unicode(keysym);
     if (ch == -1)
         return NULL;
 
-    sz = encodeUTF8(_glfw.x11.keyName, (uint32_t)ch);
-    if (sz == 0)
+    const size_t count = encodeUTF8(_glfw.x11.keyName, (unsigned int) ch);
+    if (count == 0)
         return NULL;
-    _glfw.x11.keyName[sz] = '\0';
 
+    _glfw.x11.keyName[count] = '\0';
     return _glfw.x11.keyName;
 }
 

+ 0 - 12
src/xkb_unicode.c

@@ -826,7 +826,6 @@ static const struct codepair {
   { 0x13bd, 0x0153 },
   { 0x13be, 0x0178 },
   { 0x20ac, 0x20ac },
-  // dead keys
   { 0xfe50,    '`' },
   { 0xfe51, 0x00b4 },
   { 0xfe52,    '^' },
@@ -843,9 +842,6 @@ static const struct codepair {
   { 0xfe5d, 0x037a },
   { 0xfe5e, 0x309b },
   { 0xfe5f, 0x309c },
-  // { 0xfe60, 0x0323 }, // XK_dead_belowdot
-  // { 0xfe61, 0x0309 }, // XK_dead_hook
-  // { 0xfe62, 0x031b }, // XK_dead_horn
   { 0xfe63,    '/' },
   { 0xfe64, 0x02bc },
   { 0xfe65, 0x02bd },
@@ -854,12 +850,8 @@ static const struct codepair {
   { 0xfe68, 0x02cd },
   { 0xfe69, 0xa788 },
   { 0xfe6a, 0x02f7 },
-  // { 0xfe6b, 0x032e }, // XK_dead_belowbreve
-  // { 0xfe6c, 0x0324 }, // XK_dead_belowdiaeresis
-  // { 0xfe6d, 0x0311 }, // XK_dead_invertedbreve
   { 0xfe6e,    ',' },
   { 0xfe6f, 0x00a4 },
-  // dead vowels for universal syllable entry
   { 0xfe80,    'a' }, // XK_dead_a
   { 0xfe81,    'A' }, // XK_dead_A
   { 0xfe82,    'e' }, // XK_dead_e
@@ -872,14 +864,10 @@ static const struct codepair {
   { 0xfe89,    'U' }, // XK_dead_U
   { 0xfe8a, 0x0259 },
   { 0xfe8b, 0x018f },
-  // other
   { 0xfe8c, 0x00b5 },
-  // extra dead elements for German T3 layout
   { 0xfe90,    '_' },
   { 0xfe91, 0x02c8 },
   { 0xfe92, 0x02cc },
-  // { 0xfe93,     0x0338 }, // XK_dead_longsolidusoverlay
-  // Numeric keypad with numlock on
   { 0xff80 /*XKB_KEY_KP_Space*/,     ' ' },
   { 0xff95 /*XKB_KEY_KP_7*/, 0x0037 },
   { 0xff96 /*XKB_KEY_KP_4*/, 0x0034 },