From ad9eb768c9518dbe94232e5201d318d512ad9beb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Mon, 29 Jun 2020 21:16:59 +0200 Subject: [PATCH] Cocoa: Fix non-BMP Unicode codepoint input Supplimentary Plane codepoints were reported as UTF-16 surrogate pairs. Fixes #1635. --- README.md | 3 +++ src/cocoa_window.m | 22 ++++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4061d764..90a1196f 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,8 @@ information on what to include when reporting a bug. - [Cocoa] Bugfix: Undecorated windows could not be iconified on recent macOS - [Cocoa] Bugfix: Touching event queue from secondary thread before main thread would abort (#1649) + - [Cocoa] Bugfix: Non-BMP Unicode codepoint input was reported as UTF-16 + (#1635) - [X11] Bugfix: The CMake files did not check for the XInput headers (#1480) - [X11] Bugfix: Key names were not updated when the keyboard layout changed (#1462,#1528) @@ -411,6 +413,7 @@ skills. - Ryogo Yoshimura - Lukas Zanner - Andrey Zholos + - Aihui Zhu - Santi Zupancic - Jonas Ådahl - Lasse Öörni diff --git a/src/cocoa_window.m b/src/cocoa_window.m index ddce3615..d7ded30a 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -731,14 +731,24 @@ static const NSRange kEmptyRange = { NSNotFound, 0 }; else characters = (NSString*) string; - const NSUInteger length = [characters length]; - for (NSUInteger i = 0; i < length; i++) + NSRange range = NSMakeRange(0, [characters length]); + while (range.length) { - const unichar codepoint = [characters characterAtIndex:i]; - if ((codepoint & 0xff00) == 0xf700) - continue; + uint32_t codepoint = 0; - _glfwInputChar(window, codepoint, mods, plain); + if ([characters getBytes:&codepoint + maxLength:sizeof(codepoint) + usedLength:NULL + encoding:NSUTF32StringEncoding + options:0 + range:range + remainingRange:&range]) + { + if ((codepoint & 0xff00) == 0xf700) + continue; + + _glfwInputChar(window, codepoint, mods, plain); + } } }