helge17 / tuxguitar

Improve TuxGuitar and provide builds
Other
304 stars 29 forks source link

MacOS Cocoa plugin shows error with SWT 4.15 and above #355

Open helge17 opened 2 months ago

helge17 commented 2 months ago

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:

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.

G-eos commented 2 months ago

Hello, this part of code is obscure for me. But I will try.

Following the code, I start from seltoolbarButtonClicked it leads to call toogleToolbar() from MacToolbarAction.java

Which then call processAction

This function seems to toggle display of the Main toolbar. The corresponding action is action.gui.toggle-main-toolbar

I comment like you, compile and execute without changing SWT version. The toolbar can be toggled (I add a shortcut to call action.gui.toggle-main-toolbar) ... this means that above analysis is not true ...

helge17 commented 2 months ago

In 2.0beta there is this patch https://github.com/helge17/tuxguitar-2.0beta/commit/03c86e01 that updates the MacOS menu. It cannot be applied here without customization, but maybe it helps.