Commit a16df602 authored by Jeremy Huddleston Sequoia's avatar Jeremy Huddleston Sequoia
Browse files

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's avatarJeremy Huddleston Sequoia <jeremyhu@apple.com>
(cherry picked from commit c9a3b14c)
parent 2087b778
......@@ -757,23 +757,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) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment