xserver: Branch 'master'

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Feb 17 17:55:48 UTC 2021


 hw/xquartz/quartzKeyboard.c |   32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

New commits:
commit c9a3b14c1472632afaff340f73a77a2b961f195a
Author: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
Date:   Mon Feb 1 16:27:38 2021 -0800

    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 at apple.com>

diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 9845b82ec..c35a2d15d 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -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) {


More information about the xorg-commit mailing list