Bug 552063 - [Cocoa] Menu not clickable on macOS at launch

When Eclipse launches, the menu is not immediately clickable. A recent
change in macOS broke the functionality used before, which calls
`activateWithOptions` outside of the `applicationDidFinishLaunching`
delegate call.

As per https://stackoverflow.com/questions/62739862 this can be fixed by
moving the `activateWithOptions` call into a new handler for the
delegate.

On macOS 10.15 (but not 11.1), `setActivationPolicy` also has to be
moved to `applicationDidFinishLaunching`.

The erroneous behaviour is still seen when the splash screen is shown,
but when running Eclipse with `-nosplash` the menu is clickable with
this fix.

Change-Id: Ibfffab20b66e843cc507a1982dc16f0f257cf92a
Signed-off-by: Alex Blewitt <alex.blewitt@gmail.com>
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport.extras b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport.extras
index 0361712..3ca0290 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport.extras
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport.extras
@@ -2524,15 +2524,6 @@
 			<retval swt_gen="true"></retval>
 		</method>
 	</class>
-	<class name="NSRunningApplication" swt_gen="mixed">
-		<method selector="activateWithOptions:" swt_gen="true">
-			<arg swt_gen="true"></arg>
-			<retval swt_gen="true"></retval>
-		</method>
-		<method class_method="true" selector="currentApplication" swt_gen="true">
-			<retval swt_gen="true"></retval>
-		</method>
-	</class>
 	<class name="NSSavePanel" swt_gen="mixed" swt_superclass="NSPanel">
 		<method selector="filename" swt_gen="true">
 			<retval swt_gen="true"></retval>
@@ -4674,6 +4665,10 @@
 			<arg swt_gen="true"></arg>
 			<retval swt_gen="true"></retval>
 		</method>
+		<method selector="applicationDidFinishLaunching:" swt_gen="true">
+			<arg swt_gen="true"></arg>
+			<retval swt_gen="true"></retval>
+		</method>
 		<method selector="applicationDidResignActive:" swt_gen="true">
 			<arg swt_gen="true"></arg>
 			<retval swt_gen="true"></retval>
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/NSRunningApplication.java b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/NSRunningApplication.java
deleted file mode 100644
index a36cddb..0000000
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/NSRunningApplication.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2015 IBM Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *    IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swt.internal.cocoa;
-
-public class NSRunningApplication extends NSObject {
-
-public NSRunningApplication() {
-	super();
-}
-
-public NSRunningApplication(long id) {
-	super(id);
-}
-
-public NSRunningApplication(id id) {
-	super(id);
-}
-
-public boolean activateWithOptions(long options) {
-	return OS.objc_msgSend_bool(this.id, OS.sel_activateWithOptions_, options);
-}
-
-public static NSRunningApplication currentApplication() {
-	long result = OS.objc_msgSend(OS.class_NSRunningApplication, OS.sel_currentApplication);
-	return result != 0 ? new NSRunningApplication(result) : null;
-}
-
-}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/OS.java
index 08a9004..ec6ba7a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/OS.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/OS.java
@@ -705,7 +705,6 @@
 public static final long class_NSProgressIndicator = objc_getClass("NSProgressIndicator");
 public static final long class_NSResponder = objc_getClass("NSResponder");
 public static final long class_NSRunLoop = objc_getClass("NSRunLoop");
-public static final long class_NSRunningApplication = objc_getClass("NSRunningApplication");
 public static final long class_NSSavePanel = objc_getClass("NSSavePanel");
 public static final long class_NSScreen = objc_getClass("NSScreen");
 public static final long class_NSScrollView = objc_getClass("NSScrollView");
@@ -840,7 +839,6 @@
 public static final long sel_accessibilitySetValue_forAttribute_ = Selector.sel_accessibilitySetValue_forAttribute_.value;
 public static final long sel_action = Selector.sel_action.value;
 public static final long sel_activateIgnoringOtherApps_ = Selector.sel_activateIgnoringOtherApps_.value;
-public static final long sel_activateWithOptions_ = Selector.sel_activateWithOptions_.value;
 public static final long sel_addAttribute_value_range_ = Selector.sel_addAttribute_value_range_.value;
 public static final long sel_addButtonWithTitle_ = Selector.sel_addButtonWithTitle_.value;
 public static final long sel_addChildWindow_ordered_ = Selector.sel_addChildWindow_ordered_.value;
@@ -885,6 +883,7 @@
 public static final long sel_application_openFile_ = Selector.sel_application_openFile_.value;
 public static final long sel_application_openFiles_ = Selector.sel_application_openFiles_.value;
 public static final long sel_applicationDidBecomeActive_ = Selector.sel_applicationDidBecomeActive_.value;
+public static final long sel_applicationDidFinishLaunching_ = Selector.sel_applicationDidFinishLaunching_.value;
 public static final long sel_applicationDidResignActive_ = Selector.sel_applicationDidResignActive_.value;
 public static final long sel_applicationDockMenu_ = Selector.sel_applicationDockMenu_.value;
 public static final long sel_applicationIconImage = Selector.sel_applicationIconImage.value;
@@ -1046,7 +1045,6 @@
 public static final long sel_crosshairCursor = Selector.sel_crosshairCursor.value;
 public static final long sel_ctrlKey = Selector.sel_ctrlKey.value;
 public static final long sel_currentAppearance = Selector.sel_currentAppearance.value;
-public static final long sel_currentApplication = Selector.sel_currentApplication.value;
 public static final long sel_currentContext = Selector.sel_currentContext.value;
 public static final long sel_currentCursor = Selector.sel_currentCursor.value;
 public static final long sel_currentEditor = Selector.sel_currentEditor.value;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/Selector.java b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/Selector.java
index 3625842..01082e3 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/Selector.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/Selector.java
@@ -112,7 +112,6 @@
 	, sel_accessibilitySetValue_forAttribute_("accessibilitySetValue:forAttribute:")
 	, sel_action("action")
 	, sel_activateIgnoringOtherApps_("activateIgnoringOtherApps:")
-	, sel_activateWithOptions_("activateWithOptions:")
 	, sel_addAttribute_value_range_("addAttribute:value:range:")
 	, sel_addButtonWithTitle_("addButtonWithTitle:")
 	, sel_addChildWindow_ordered_("addChildWindow:ordered:")
@@ -157,6 +156,7 @@
 	, sel_application_openFile_("application:openFile:")
 	, sel_application_openFiles_("application:openFiles:")
 	, sel_applicationDidBecomeActive_("applicationDidBecomeActive:")
+	, sel_applicationDidFinishLaunching_("applicationDidFinishLaunching:")
 	, sel_applicationDidResignActive_("applicationDidResignActive:")
 	, sel_applicationDockMenu_("applicationDockMenu:")
 	, sel_applicationIconImage("applicationIconImage")
@@ -318,7 +318,6 @@
 	, sel_crosshairCursor("crosshairCursor")
 	, sel_ctrlKey("ctrlKey")
 	, sel_currentAppearance("currentAppearance")
-	, sel_currentApplication("currentApplication")
 	, sel_currentContext("currentContext")
 	, sel_currentCursor("currentCursor")
 	, sel_currentEditor("currentEditor")
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java
index 2540718..79f4ae6 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Display.java
@@ -877,10 +877,6 @@
 		int pid = OS.getpid ();
 		long ptr = getApplicationName().UTF8String();
 		if (ptr != 0) OS.CPSSetProcessName (psn, ptr);
-		if (!isBundled ()) {
-			application.setActivationPolicy (OS.NSApplicationActivationPolicyRegular);
-			NSRunningApplication.currentApplication().activateWithOptions (OS.NSApplicationActivateIgnoringOtherApps);
-		}
 		ptr = C.getenv (ascii ("APP_ICON_" + pid));
 		if (ptr != 0) {
 			NSString path = NSString.stringWithUTF8String (ptr);
@@ -937,6 +933,7 @@
 		OS.class_addMethod(cls, OS.sel_hide_, appProc3, "@:@");
 		OS.class_addMethod(cls, OS.sel_unhideAllApplications_, appProc3, "@:@");
 		OS.class_addMethod(cls, OS.sel_applicationDidBecomeActive_, appProc3, "@:@");
+		OS.class_addMethod(cls, OS.sel_applicationDidFinishLaunching_, appProc3, "@:@");
 		OS.class_addMethod(cls, OS.sel_applicationDidResignActive_, appProc3, "@:@");
 		OS.class_addMethod(cls, OS.sel_applicationDockMenu_, appProc3, "@:@");
 		OS.class_addMethod(cls, OS.sel_application_openFile_, appProc4, "@:@@");
@@ -5447,6 +5444,13 @@
 	if (type != OS.NSAppKitDefined) sendEvent = false;
 }
 
+void applicationDidFinishLaunching (long id, long sel, long notification) {
+	if (!isBundled()) {
+		application.setActivationPolicy (OS.NSApplicationActivationPolicyRegular);
+		application.activateIgnoringOtherApps (true);
+	}
+}
+
 void applicationWillFinishLaunching (long id, long sel, long notification) {
 	boolean loaded = false;
 
@@ -5581,6 +5585,10 @@
 			display.applicationSendEvent (id, sel, arg0);
 			return 0;
 		}
+		case sel_applicationDidFinishLaunching_: {
+			display.applicationDidFinishLaunching(id, sel, arg0);
+			return 0;
+		}
 		case sel_applicationWillFinishLaunching_: {
 			display.applicationWillFinishLaunching(id, sel, arg0);
 			return 0;