diff options
| author | Alex Blewitt | 2021-01-17 17:54:18 +0000 |
|---|---|---|
| committer | Alex Blewitt | 2021-01-23 23:19:00 +0000 |
| commit | e323e5d89a1d1413968d3b1160e632e77227fd72 (patch) | |
| tree | 095ed270cb9d897bc39f177a1e78fed65e860442 | |
| parent | 8b6d832f777f19b05f10b061188c906d74ffed4a (diff) | |
| download | eclipse.platform.swt-e323e5d89a1d1413968d3b1160e632e77227fd72.tar.gz eclipse.platform.swt-e323e5d89a1d1413968d3b1160e632e77227fd72.tar.xz eclipse.platform.swt-e323e5d89a1d1413968d3b1160e632e77227fd72.zip | |
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>
5 files changed, 18 insertions, 57 deletions
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 03617127fc..3ca0290eec 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 a36cddb30e..0000000000 --- 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 08a90047c1..ec6ba7ae8d 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_NSProcessInfo = objc_getClass("NSProcessInfo"); 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_accessibilitySetOverrideValue_forAttribute_ = Selec 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_appendString_ = Selector.sel_appendString_.value; 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_credentialWithUser_password_persistence_ = Selector 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 3625842269..01082e35d5 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 @@ public enum Selector { , 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 @@ public enum Selector { , 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 @@ public enum Selector { , 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 254071833a..79f4ae6cfa 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 @@ void createDisplay (DeviceData data) { 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 @@ void createDisplay (DeviceData data) { 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 @@ void applicationSendEvent (long id, long sel, long event) { 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 @@ static long applicationProc(long id, long sel, long arg0) { 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; |
