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@gmail.com>
Tested-by: Tom Lane <tgl@sss.pgh.pa.us>
Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
This commit is contained in:
Jeremy Huddleston Sequoia 2017-07-18 21:35:49 -07:00
parent 211e05ac85
commit dd0b721c97

View File

@ -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];
}
}