|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|