From 7c2f104ace0bfdc033145db478f17111fedaa432 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Sequoia Date: Tue, 18 Jul 2017 21:35:49 -0700 Subject: [PATCH] XQuartz: Hack around an issue that can occur on macOS due to background apps incorrectly stealing focus Works around . Tested-by: Tom Lane Signed-off-by: Jeremy Huddleston Sequoia --- hw/xquartz/X11Application.m | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) 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 @@ -276,13 +276,32 @@ 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]; } } -- 2.13.2