xserver: Branch 'master'

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Thu Jul 20 08:18:13 UTC 2017


 hw/xquartz/X11Application.m |   29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

New commits:
commit dd0b721c977e88d7c3830cc2a672c2793bca4fa0
Author: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
Date:   Tue Jul 18 21:35:49 2017 -0700

    XQuartz: Hack around an issue that can occur on macOS due to background apps incorrectly stealing focus
    
    Works around <rdar://problem/7150340>.
    
    Tested-by: Martin Otte <martinjotte at gmail.com>
    Tested-by: Tom Lane <tgl at sss.pgh.pa.us>
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>

diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index 768eecf68..821e1c5a1 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -275,13 +275,32 @@ message_kit_thread(SEL selector, NSObject *arg)
             if (_x_active) [self activateX:NO];
         }
         else if ([self modalWindow] == nil) {
-            /* Must be an X window. Tell appkit it doesn't have focus. */
+            /* Must be an X window. Tell appkit windows to resign main/key */
             for_appkit = NO;
 
-            if ([self isActive]) {
-                [self deactivate];
-                if (!_x_active && quartzProcs->IsX11Window([e windowNumber]))
-                    [self activateX:YES];
+            if (!_x_active && quartzProcs->IsX11Window([e windowNumber])) {
+                if ([self respondsToSelector:@selector(_setKeyWindow:)] && [self respondsToSelector:@selector(_setMainWindow:)]) {
+                    NSWindow *keyWindow = [self keyWindow];
+                    if (keyWindow) {
+                        [self _setKeyWindow:nil];
+                        [keyWindow resignKeyWindow];
+                    }
+
+                    NSWindow *mainWindow = [self mainWindow];
+                    if (mainWindow) {
+                        [self _setMainWindow:nil];
+                        [mainWindow resignMainWindow];
+                   }
+                 } else {
+                    /* This has a side effect of causing background apps to steal focus from XQuartz.
+                     * Unfortunately, there is no public and stable API to do what we want, but this
+                     * is a decent fallback in the off chance that the above selectors get dropped
+                     * in the future.
+                     */
+                    [self deactivate];
+                }
+
+                [self activateX:YES];
             }
         }
 


More information about the xorg-commit mailing list