xquartz: Ensure we call into TIS on the main thread

There is a place where this code was called on the main thread.

We're using a rather nasty anti-pattern to just call a block inline rather
than synchonously calling it on the main thread if we're already on the main
thread.  This code could use a good overhaul, but I don't have time to rip
it apart right now.  This will address the immediate issue.

Fixes: https://github.com/XQuartz/XQuartz/issues/40
Fixes: https://github.com/XQuartz/XQuartz/issues/48
Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
This commit is contained in:
Jeremy Huddleston Sequoia 2021-02-01 16:27:38 -08:00
parent af17b5c499
commit c9a3b14c14
1 changed files with 21 additions and 11 deletions

View File

@ -746,23 +746,33 @@ make_dead_key(KeySym in)
static Bool
QuartzReadSystemKeymap(darwinKeyboardInfo *info)
{
const void *chr_data = NULL;
__block const void *chr_data = NULL;
int num_keycodes = NUM_KEYCODES;
UInt32 keyboard_type = LMGetKbdType();
__block UInt32 keyboard_type;
int i, j;
OSStatus err;
KeySym *k;
CFDataRef currentKeyLayoutDataRef = NULL;
TISInputSourceRef currentKeyLayoutRef =
TISCopyCurrentKeyboardLayoutInputSource();
dispatch_block_t getKeyboardData = ^{
keyboard_type = LMGetKbdType();
if (currentKeyLayoutRef) {
currentKeyLayoutDataRef = (CFDataRef)TISGetInputSourceProperty(
currentKeyLayoutRef, kTISPropertyUnicodeKeyLayoutData);
if (currentKeyLayoutDataRef)
chr_data = CFDataGetBytePtr(currentKeyLayoutDataRef);
CFRelease(currentKeyLayoutRef);
TISInputSourceRef currentKeyLayoutRef = TISCopyCurrentKeyboardLayoutInputSource();
if (currentKeyLayoutRef) {
CFDataRef currentKeyLayoutDataRef = (CFDataRef)TISGetInputSourceProperty(currentKeyLayoutRef,
kTISPropertyUnicodeKeyLayoutData);
if (currentKeyLayoutDataRef)
chr_data = CFDataGetBytePtr(currentKeyLayoutDataRef);
CFRelease(currentKeyLayoutRef);
}
};
/* This is an ugly ant-pattern, but it is more expedient to address the problem right now. */
if (pthread_main_np()) {
getKeyboardData();
} else {
dispatch_sync(dispatch_get_main_queue(), getKeyboardData);
}
if (chr_data == NULL) {