Hack to force macOS window activation for non-bundled app.

This commit is contained in:
bruvzg 2018-03-02 18:38:42 +02:00
parent 618b22bbec
commit 506e17ee70
No known key found for this signature in database
GPG Key ID: 89DD917D9CE4218D
1 changed files with 35 additions and 1 deletions

View File

@ -150,10 +150,44 @@ static Vector2 get_mouse_pos(NSEvent *event) {
@end @end
@interface GodotApplicationDelegate : NSObject @interface GodotApplicationDelegate : NSObject
- (void)forceUnbundledWindowActivationHackStep1;
- (void)forceUnbundledWindowActivationHackStep2;
- (void)forceUnbundledWindowActivationHackStep3;
@end @end
@implementation GodotApplicationDelegate @implementation GodotApplicationDelegate
- (void)forceUnbundledWindowActivationHackStep1 {
// Step1: Switch focus to macOS Dock.
// Required to perform step 2, TransformProcessType will fail if app is already the in focus.
for (NSRunningApplication *app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.dock"]) {
[app activateWithOptions:NSApplicationActivateIgnoringOtherApps];
break;
}
[self performSelector:@selector(forceUnbundledWindowActivationHackStep2) withObject:nil afterDelay:0.02];
}
- (void)forceUnbundledWindowActivationHackStep2 {
// Step 2: Register app as foreground process.
ProcessSerialNumber psn = { 0, kCurrentProcess };
(void)TransformProcessType(&psn, kProcessTransformToForegroundApplication);
[self performSelector:@selector(forceUnbundledWindowActivationHackStep3) withObject:nil afterDelay:0.02];
}
- (void)forceUnbundledWindowActivationHackStep3 {
// Step 3: Switch focus back to app window.
[[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps];
}
- (void)applicationDidFinishLaunching:(NSNotification *)notice {
NSString *nsappname = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
if (nsappname == nil) {
// If executable is not a bundled, macOS WindowServer won't register and activate app window correctly (menu and title bar are grayed out and input ignored).
[self performSelector:@selector(forceUnbundledWindowActivationHackStep1) withObject:nil afterDelay:0.02];
}
}
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename { - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename {
// Note: called before main loop init! // Note: called before main loop init!
char *utfs = strdup([filename UTF8String]); char *utfs = strdup([filename UTF8String]);
@ -2340,7 +2374,7 @@ OS_OSX::OS_OSX() {
NSMenuItem *menu_item; NSMenuItem *menu_item;
NSString *title; NSString *title;
NSString *nsappname = [[[NSBundle mainBundle] performSelector:@selector(localizedInfoDictionary)] objectForKey:@"CFBundleName"]; NSString *nsappname = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
if (nsappname == nil) if (nsappname == nil)
nsappname = [[NSProcessInfo processInfo] processName]; nsappname = [[NSProcessInfo processInfo] processName];