tuxguitar icon indicating copy to clipboard operation
tuxguitar copied to clipboard

MacOS Cocoa plugin shows error with SWT 4.15 and above

Open helge17 opened this issue 10 months ago • 2 comments

When upgrading SWT to version 4.15 or higher, the MacOS Cocoa integration plugin shows the following error at startup:

MacOS14_SWT_cocoa-plugin

MacOS14 00-Binary_Packages % ./tuxguitar-2024-02-22-snapshot-macosx-swt-cocoa-x86_64.app/Contents/MacOS/tuxguitar.sh
org.herac.tuxguitar.util.plugin.TGPluginException: org.eclipse.swt.internal.cocoa.NSWindow.standardWindowButton(long)
	at org.herac.tuxguitar.cocoa.toolbar.MacToolbarPlugin.connect(MacToolbarPlugin.java:28)
	at org.herac.tuxguitar.util.plugin.TGPluginManager.connectPlugin(TGPluginManager.java:88)
	at org.herac.tuxguitar.util.plugin.TGPluginManager.connectEnabled(TGPluginManager.java:65)
	at org.herac.tuxguitar.app.TuxGuitar.startUIContext(TuxGuitar.java:141)
	at org.herac.tuxguitar.app.TuxGuitar.access$100(TuxGuitar.java:69)
	at org.herac.tuxguitar.app.TuxGuitar$1$1.run(TuxGuitar.java:124)
	at org.herac.tuxguitar.app.synchronizer.TGSynchronizerControllerImpl$1$1.run(TGSynchronizerControllerImpl.java:29)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4262)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3885)
	at org.herac.tuxguitar.ui.swt.SWTApplication.start(SWTApplication.java:64)
	at org.herac.tuxguitar.app.TuxGuitar.createUIContext(TuxGuitar.java:117)
	at org.herac.tuxguitar.app.TuxGuitar.createApplication(TuxGuitar.java:102)
	at org.herac.tuxguitar.app.TGMainSingleton.launchTuxGuitar(TGMainSingleton.java:57)
	at org.herac.tuxguitar.app.TGMainSingleton.launchSingleton(TGMainSingleton.java:45)
	at org.herac.tuxguitar.app.TGMainSingleton.main(TGMainSingleton.java:35)
Caused by: java.lang.NoSuchMethodException: org.eclipse.swt.internal.cocoa.NSWindow.standardWindowButton(long)
	at java.base/java.lang.Class.getMethod(Class.java:2395)
	at org.herac.tuxguitar.cocoa.TGCocoa.invokeMethod(TGCocoa.java:118)
	at org.herac.tuxguitar.cocoa.TGCocoa.getStandardWindowButton(TGCocoa.java:66)
	at org.herac.tuxguitar.cocoa.toolbar.MacToolbar.init(MacToolbar.java:59)
	at org.herac.tuxguitar.cocoa.toolbar.MacToolbarPlugin.connect(MacToolbarPlugin.java:25)
	... 16 more

The error is caused by this change from SWT 4.14 to 4.15:

  • https://bugs.eclipse.org/bugs/show_bug.cgi?id=547194
  • https://github.com/eclipse-platform/eclipse.platform.swt/commit/50e3251a674a8b4a7b3ac9cdc3f764ea7d1ae30a#diff-9427e335ac226d6bfcc5e9ebc41b8d49874971ba4f4a057b083e060358d34396L358

This bug currently prevents the use of newer versions of SWT on MacOS.

The warning disappears if you simply comment out the following lines:

diff --git a/desktop/TuxGuitar-cocoa-integration-swt/src/org/herac/tuxguitar/cocoa/TGCocoa.java b/desktop/TuxGuitar-cocoa-integration-swt/src/org/herac/tuxguitar/cocoa/TGCocoa.java
index 45a89266..0bd34ba5 100644
--- a/desktop/TuxGuitar-cocoa-integration-swt/src/org/herac/tuxguitar/cocoa/TGCocoa.java
+++ b/desktop/TuxGuitar-cocoa-integration-swt/src/org/herac/tuxguitar/cocoa/TGCocoa.java
@@ -61,10 +61,11 @@ public class TGCocoa {
 	public static final NSMenuItem getMenuItemAtIndex(NSMenu menu, long index) throws Throwable{
 		return (NSMenuItem)invokeMethod(NSMenu.class, menu, "itemAtIndex", new Object[] { osType(index) });
 	}
-	
-	public static final NSButton getStandardWindowButton(NSWindow nsWindow, long index) throws Throwable{
-		return (NSButton)invokeMethod(NSWindow.class, nsWindow, "standardWindowButton", new Object[] { osType(index) });
-	}
+
+	// Not compatible with SWT 4.15 and above - see https://github.com/helge17/tuxguitar/issues/355
+	// public static final NSButton getStandardWindowButton(NSWindow nsWindow, long index) throws Throwable{
+	// 	return (NSButton)invokeMethod(NSWindow.class, nsWindow, "standardWindowButton", new Object[] { osType(index) });
+	// }
 	
 	public static final String getNSStringValue( long pointer ) throws Throwable {
 		NSString nsString = new NSString();
diff --git a/desktop/TuxGuitar-cocoa-integration-swt/src/org/herac/tuxguitar/cocoa/toolbar/MacToolbar.java b/desktop/TuxGuitar-cocoa-integration-swt/src/org/herac/tuxguitar/cocoa/toolbar/MacToolbar.java
index 5bfc7cd4..d37bfaca 100644
--- a/desktop/TuxGuitar-cocoa-integration-swt/src/org/herac/tuxguitar/cocoa/toolbar/MacToolbar.java
+++ b/desktop/TuxGuitar-cocoa-integration-swt/src/org/herac/tuxguitar/cocoa/toolbar/MacToolbar.java
@@ -55,12 +55,13 @@ public class MacToolbar {
 			nsWindow.setToolbar(dummyBar);
 			dummyBar.release();
 			nsWindow.setShowsToolbarButton(true);
-			
-			NSButton toolbarButton = TGCocoa.getStandardWindowButton(nsWindow, NSWindowToolbarButton);
-			if (toolbarButton != null) {
-				toolbarButton.setTarget( delegate );
-				TGCocoa.setControlAction( toolbarButton , sel_toolbarButtonClicked_ );
-			}
+
+			// Not compatible with SWT 4.15 and above - see https://github.com/helge17/tuxguitar/issues/355
+			// NSButton toolbarButton = TGCocoa.getStandardWindowButton(nsWindow, NSWindowToolbarButton);
+			// if (toolbarButton != null) {
+			// 	toolbarButton.setTarget( delegate );
+			// 	TGCocoa.setControlAction( toolbarButton , sel_toolbarButtonClicked_ );
+			// }
 		}
 	}
 	

I have not noticed any negative side effects of this patch. So until someone finds the time to rework this part of the code, I would like to commit this patch and update SWT to 4.26.

helge17 avatar Apr 18 '24 16:04 helge17