[Complex Text Layouts] Refactor Font class, default themes and controls to use Text Server interface.
Implement interface mirroring. Add TextLine and TextParagraph classes. Handle UTF-16 input on macOS and Windows.
This commit is contained in:
parent
07d14f5bb8
commit
99666de00f
162 changed files with 7008 additions and 3564 deletions
|
|
@ -498,9 +498,28 @@ void DisplayServerAndroid::_set_key_modifier_state(Ref<InputEventWithModifiers>
|
|||
}
|
||||
|
||||
void DisplayServerAndroid::process_key_event(int p_keycode, int p_scancode, int p_unicode_char, bool p_pressed) {
|
||||
static char32_t prev_wc = 0;
|
||||
char32_t unicode = p_unicode_char;
|
||||
if ((p_unicode_char & 0xfffffc00) == 0xd800) {
|
||||
if (prev_wc != 0) {
|
||||
ERR_PRINT("invalid utf16 surrogate input");
|
||||
}
|
||||
prev_wc = unicode;
|
||||
return; // Skip surrogate.
|
||||
} else if ((unicode & 0xfffffc00) == 0xdc00) {
|
||||
if (prev_wc == 0) {
|
||||
ERR_PRINT("invalid utf16 surrogate input");
|
||||
return; // Skip invalid surrogate.
|
||||
}
|
||||
unicode = (prev_wc << 10UL) + unicode - ((0xd800 << 10UL) + 0xdc00 - 0x10000);
|
||||
prev_wc = 0;
|
||||
} else {
|
||||
prev_wc = 0;
|
||||
}
|
||||
|
||||
Ref<InputEventKey> ev;
|
||||
ev.instance();
|
||||
int val = p_unicode_char;
|
||||
int val = unicode;
|
||||
int keycode = android_get_keysym(p_keycode);
|
||||
int phy_keycode = android_get_keysym(p_scancode);
|
||||
|
||||
|
|
|
|||
|
|
@ -701,8 +701,6 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||
characters = (NSString *)aString;
|
||||
}
|
||||
|
||||
NSUInteger i, length = [characters length];
|
||||
|
||||
NSCharacterSet *ctrlChars = [NSCharacterSet controlCharacterSet];
|
||||
NSCharacterSet *wsnlChars = [NSCharacterSet whitespaceAndNewlineCharacterSet];
|
||||
if ([characters rangeOfCharacterFromSet:ctrlChars].length && [characters rangeOfCharacterFromSet:wsnlChars].length == 0) {
|
||||
|
|
@ -712,8 +710,15 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
const unichar codepoint = [characters characterAtIndex:i];
|
||||
Char16String text;
|
||||
text.resize([characters length] + 1);
|
||||
[characters getCharacters:(unichar *)text.ptrw() range:NSMakeRange(0, [characters length])];
|
||||
|
||||
String u32text;
|
||||
u32text.parse_utf16(text.ptr(), text.length());
|
||||
|
||||
for (int i = 0; i < u32text.length(); i++) {
|
||||
const char32_t codepoint = u32text[i];
|
||||
if ((codepoint & 0xFF00) == 0xF700) {
|
||||
continue;
|
||||
}
|
||||
|
|
@ -1315,7 +1320,16 @@ static int remapKey(unsigned int key, unsigned int state) {
|
|||
|
||||
if (!wd.im_active && length > 0 && keycode_has_unicode(remapKey([event keyCode], [event modifierFlags]))) {
|
||||
// Fallback unicode character handler used if IME is not active
|
||||
for (NSUInteger i = 0; i < length; i++) {
|
||||
Char16String text;
|
||||
text.resize([characters length] + 1);
|
||||
[characters getCharacters:(unichar *)text.ptrw() range:NSMakeRange(0, [characters length])];
|
||||
|
||||
String u32text;
|
||||
u32text.parse_utf16(text.ptr(), text.length());
|
||||
|
||||
for (int i = 0; i < u32text.length(); i++) {
|
||||
const char32_t codepoint = u32text[i];
|
||||
|
||||
DisplayServerOSX::KeyEvent ke;
|
||||
|
||||
ke.window_id = window_id;
|
||||
|
|
@ -1325,7 +1339,7 @@ static int remapKey(unsigned int key, unsigned int state) {
|
|||
ke.keycode = remapKey([event keyCode], [event modifierFlags]);
|
||||
ke.physical_keycode = translateKey([event keyCode]);
|
||||
ke.raw = true;
|
||||
ke.unicode = [characters characterAtIndex:i];
|
||||
ke.unicode = codepoint;
|
||||
|
||||
_push_to_key_event_buffer(ke);
|
||||
}
|
||||
|
|
@ -1417,7 +1431,15 @@ static int remapKey(unsigned int key, unsigned int state) {
|
|||
|
||||
// Fallback unicode character handler used if IME is not active
|
||||
if (!wd.im_active && length > 0 && keycode_has_unicode(remapKey([event keyCode], [event modifierFlags]))) {
|
||||
for (NSUInteger i = 0; i < length; i++) {
|
||||
Char16String text;
|
||||
text.resize([characters length] + 1);
|
||||
[characters getCharacters:(unichar *)text.ptrw() range:NSMakeRange(0, [characters length])];
|
||||
|
||||
String u32text;
|
||||
u32text.parse_utf16(text.ptr(), text.length());
|
||||
|
||||
for (int i = 0; i < u32text.length(); i++) {
|
||||
const char32_t codepoint = u32text[i];
|
||||
DisplayServerOSX::KeyEvent ke;
|
||||
|
||||
ke.window_id = window_id;
|
||||
|
|
@ -1427,7 +1449,7 @@ static int remapKey(unsigned int key, unsigned int state) {
|
|||
ke.keycode = remapKey([event keyCode], [event modifierFlags]);
|
||||
ke.physical_keycode = translateKey([event keyCode]);
|
||||
ke.raw = true;
|
||||
ke.unicode = [characters characterAtIndex:i];
|
||||
ke.unicode = codepoint;
|
||||
|
||||
_push_to_key_event_buffer(ke);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2792,6 +2792,24 @@ void DisplayServerWindows::_process_key_events() {
|
|||
case WM_CHAR: {
|
||||
// extended keys should only be processed as WM_KEYDOWN message.
|
||||
if (!KeyMappingWindows::is_extended_key(ke.wParam) && ((i == 0 && ke.uMsg == WM_CHAR) || (i > 0 && key_event_buffer[i - 1].uMsg == WM_CHAR))) {
|
||||
static char32_t prev_wc = 0;
|
||||
char32_t unicode = ke.wParam;
|
||||
if ((unicode & 0xfffffc00) == 0xd800) {
|
||||
if (prev_wc != 0) {
|
||||
ERR_PRINT("invalid utf16 surrogate input");
|
||||
}
|
||||
prev_wc = unicode;
|
||||
break; // Skip surrogate.
|
||||
} else if ((unicode & 0xfffffc00) == 0xdc00) {
|
||||
if (prev_wc == 0) {
|
||||
ERR_PRINT("invalid utf16 surrogate input");
|
||||
break; // Skip invalid surrogate.
|
||||
}
|
||||
unicode = (prev_wc << 10UL) + unicode - ((0xd800 << 10UL) + 0xdc00 - 0x10000);
|
||||
prev_wc = 0;
|
||||
} else {
|
||||
prev_wc = 0;
|
||||
}
|
||||
Ref<InputEventKey> k;
|
||||
k.instance();
|
||||
|
||||
|
|
@ -2803,7 +2821,7 @@ void DisplayServerWindows::_process_key_events() {
|
|||
k->set_pressed(true);
|
||||
k->set_keycode(KeyMappingWindows::get_keysym(ke.wParam));
|
||||
k->set_physical_keycode(KeyMappingWindows::get_scansym((ke.lParam >> 16) & 0xFF, ke.lParam & (1 << 24)));
|
||||
k->set_unicode(ke.wParam);
|
||||
k->set_unicode(unicode);
|
||||
if (k->get_unicode() && gr_mem) {
|
||||
k->set_alt(false);
|
||||
k->set_control(false);
|
||||
|
|
@ -2840,7 +2858,25 @@ void DisplayServerWindows::_process_key_events() {
|
|||
k->set_physical_keycode(KeyMappingWindows::get_scansym((ke.lParam >> 16) & 0xFF, ke.lParam & (1 << 24)));
|
||||
|
||||
if (i + 1 < key_event_pos && key_event_buffer[i + 1].uMsg == WM_CHAR) {
|
||||
k->set_unicode(key_event_buffer[i + 1].wParam);
|
||||
char32_t unicode = key_event_buffer[i + 1].wParam;
|
||||
static char32_t prev_wck = 0;
|
||||
if ((unicode & 0xfffffc00) == 0xd800) {
|
||||
if (prev_wck != 0) {
|
||||
ERR_PRINT("invalid utf16 surrogate input");
|
||||
}
|
||||
prev_wck = unicode;
|
||||
break; // Skip surrogate.
|
||||
} else if ((unicode & 0xfffffc00) == 0xdc00) {
|
||||
if (prev_wck == 0) {
|
||||
ERR_PRINT("invalid utf16 surrogate input");
|
||||
break; // Skip invalid surrogate.
|
||||
}
|
||||
unicode = (prev_wck << 10UL) + unicode - ((0xd800 << 10UL) + 0xdc00 - 0x10000);
|
||||
prev_wck = 0;
|
||||
} else {
|
||||
prev_wck = 0;
|
||||
}
|
||||
k->set_unicode(unicode);
|
||||
}
|
||||
if (k->get_unicode() && gr_mem) {
|
||||
k->set_alt(false);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue