diff --git a/README.md b/README.md index 0580d62d..8856b2f4 100644 --- a/README.md +++ b/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 diff --git a/src/x11_platform.h b/src/x11_platform.h index a0037c88..4d6c44fb 100644 --- a/src/x11_platform.h +++ b/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 diff --git a/src/x11_window.c b/src/x11_window.c index bbe21799..ed5a0f29 100644 --- a/src/x11_window.c +++ b/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) +static size_t encodeUTF8(char* s, unsigned int ch) { - if (ch < 0x80) { - dest[0] = (char)ch; - return 1; + 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; } - if (ch < 0x800) { - dest[0] = (ch>>6) | 0xC0; - dest[1] = (ch & 0x3F) | 0x80; - return 2; + else if (ch < 0x10000) + { + s[count++] = (ch >> 12) | 0xe0; + s[count++] = ((ch >> 6) & 0x3f) | 0x80; + s[count++] = (ch & 0x3f) | 0x80; } - if (ch < 0x10000) { - dest[0] = (ch>>12) | 0xE0; - dest[1] = ((ch>>6) & 0x3F) | 0x80; - dest[2] = (ch & 0x3F) | 0x80; - return 3; + 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; } - 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; - } - return 0; + + 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; } diff --git a/src/xkb_unicode.c b/src/xkb_unicode.c index fdd3db71..ecfdc2af 100644 --- a/src/xkb_unicode.c +++ b/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 },