|
@@ -138,10 +138,44 @@ static bool mouse_down_control = false;
|
|
|
@end
|
|
|
|
|
|
@interface GodotApplicationDelegate : NSObject
|
|
|
+- (void)forceUnbundledWindowActivationHackStep1;
|
|
|
+- (void)forceUnbundledWindowActivationHackStep2;
|
|
|
+- (void)forceUnbundledWindowActivationHackStep3;
|
|
|
@end
|
|
|
|
|
|
@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];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
|
|
|
if (OS_OSX::singleton->get_main_loop())
|
|
|
OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_QUIT_REQUEST);
|
|
@@ -2043,7 +2077,7 @@ OS_OSX::OS_OSX() {
|
|
|
NSMenuItem *menu_item;
|
|
|
NSString *title;
|
|
|
|
|
|
- NSString *nsappname = [[[NSBundle mainBundle] performSelector:@selector(localizedInfoDictionary)] objectForKey:@"CFBundleName"];
|
|
|
+ NSString *nsappname = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
|
|
|
if (nsappname == nil)
|
|
|
nsappname = [[NSProcessInfo processInfo] processName];
|
|
|
|