Module: wine Branch: master Commit: 6ee486644a4313366fa7c95b93d371ef3e04255a URL: http://source.winehq.org/git/wine.git/?a=commit;h=6ee486644a4313366fa7c95b93...
Author: Ken Thomases ken@codeweavers.com Date: Sun Mar 17 22:40:59 2013 -0500
winemac: Allow Command-[Shift-]Tab to switch apps even when the displays are captured.
---
dlls/winemac.drv/cocoa_app.m | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 56 insertions(+), 0 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m index a417674..b14c550 100644 --- a/dlls/winemac.drv/cocoa_app.m +++ b/dlls/winemac.drv/cocoa_app.m @@ -672,6 +672,49 @@ int macdrv_err_on; [self setApplicationIconImage:nsimage]; }
+ - (void) handleCommandTab + { + if ([self isActive]) + { + NSRunningApplication* thisApp = [NSRunningApplication currentApplication]; + NSRunningApplication* app; + NSRunningApplication* otherValidApp = nil; + + if ([originalDisplayModes count]) + { + CGRestorePermanentDisplayConfiguration(); + CGReleaseAllDisplays(); + [originalDisplayModes removeAllObjects]; + } + + for (app in [[NSWorkspace sharedWorkspace] runningApplications]) + { + if (![app isEqual:thisApp] && !app.terminated && + app.activationPolicy == NSApplicationActivationPolicyRegular) + { + if (!app.hidden) + { + // There's another visible app. Just hide ourselves and let + // the system activate the other app. + [self hide:self]; + return; + } + + if (!otherValidApp) + otherValidApp = app; + } + } + + // Didn't find a visible GUI app. Try the Finder or, if that's not + // running, the first hidden GUI app. If even that doesn't work, we + // just fail to switch and remain the active app. + app = [[NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.finder"] lastObject]; + if (!app) app = otherValidApp; + [app unhide]; + [app activateWithOptions:0]; + } + } + /* * ---------- Cursor clipping methods ---------- * @@ -1084,6 +1127,19 @@ int macdrv_err_on; // Make sure next mouse move event starts over from an absolute baseline. forceNextMouseMoveAbsolute = TRUE; } + else if (type == NSKeyDown && ![anEvent isARepeat] && [anEvent keyCode] == kVK_Tab) + { + NSUInteger modifiers = [anEvent modifierFlags]; + if ((modifiers & NSCommandKeyMask) && + !(modifiers & (NSControlKeyMask | NSAlternateKeyMask))) + { + // Command-Tab and Command-Shift-Tab would normally be intercepted + // by the system to switch applications. If we're seeing it, it's + // presumably because we've captured the displays, preventing + // normal application switching. Do it manually. + [self handleCommandTab]; + } + } }