Cocoa: Fix non-BMP Unicode codepoint input

Supplimentary Plane codepoints were reported as UTF-16 surrogate pairs.

Fixes #1635.

(cherry picked from commit ad9eb768c9)
This commit is contained in:
Camilla Löwy 2020-06-29 21:16:59 +02:00 committed by Camilla Löwy
parent 26aaa007e0
commit 9cae95faa3
2 changed files with 19 additions and 6 deletions

View File

@ -121,6 +121,8 @@ information on what to include when reporting a bug.
- Bugfix: Some extension loader headers did not prevent default OpenGL header
inclusion (#1695)
- [Cocoa] Changed `EGLNativeWindowType` from `NSView` to `CALayer` (#1169)
- [Cocoa] Bugfix: Non-BMP Unicode codepoint input was reported as UTF-16
(#1635)
- [X11] Bugfix: IME input of CJK was broken for "C" locale (#1587,#1636)
- [X11] Bugfix: Xlib errors caused by other parts of the application could be
reported as GLFW errors
@ -341,6 +343,7 @@ skills.
- Ryogo Yoshimura
- Lukas Zanner
- Andrey Zholos
- Aihui Zhu
- Santi Zupancic
- Jonas Ådahl
- Lasse Öörni

View File

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