bsjy
bsjy

Reputation: 25

Is there a way to check the Mac version using Platform.OS on Windows?

In the code I'm currently writing, I've written to provide a buffer to improve drawing performance on MacOS BigSur.

Example code is as follows.

class EcoreGridEditPane<PayloadType extends EObject> {
    static val DEFAULT_STYLES = #[
        SWT.DOUBLE_BUFFERED,
        SWT.BORDER,
        SWT.MULTI,
        SWT.V_SCROLL,
        SWT.H_SCROLL,
        SWT.FULL_SELECTION
    ].reduce[p1, p2|p1.bitwiseOr(p2)];
   // ...

   new(Composite parent, int styles) {
        create(parent, DEFAULT_STYLES.bitwiseOr(styles))
   }
   // ...
   private def create(Composite parent, int styles) {
        fViewer = new TableViewer(parent, styles) => [
            table => [
                layoutData = new GridData(GridData.FILL_BOTH)
                
                OSKit.instance.ensureDrawingBuffer(it) // problem in windows os
                headerVisible = true;
                linesVisible = true;
                addListener(SWT.Dispose) [
                    handleDispose()
                ]
            ]

OSKit.xend

interface OSKit {
    static def OSKit getInstance() {
        switch Platform.OS {
            case Platform.OS_MACOSX: MacOSKit.instance
            default: CommonOSKit.instance
        }
    }

    def void ensureDrawingBuffer(Control control);

    def boolean isBigSurOrLater();
}

MacOSKit.xtend

private def makeBackingLayer(NSView view) {
        if (view.id.performSelector("layer") !== 0L) {
            // Already background layer exist
            return;
        }

        // layer request
        view.id.performSelector("setWantsLayer:", true);

        // layer setting
        val layer = view.id.performSelector("layer");
        layer.performSelector("setContentsFormat:", kCAContentsFormatRGBA8Uint)
    }

    override ensureDrawingBuffer(Control control) {
        control.view.makeBackingLayer()
    }
   
    // ...
    package def Long performSelector(Long receiver, String selector) {
        return OS.objc_msgSend(receiver, selector.selectorId)
    }

    package def Long performSelector(Long receiver, String selector, boolean arg1) {
        return OS.objc_msgSend(receiver, selector.selectorId, arg1)
    }

    package def Long performSelector(Long receiver, String selector, Long arg1) {
        return OS.objc_msgSend(receiver, selector.selectorId, arg1)
    }

    package def Long performSelector(NSObject receiver, String selector) {
        return OS.objc_msgSend(receiver.id, selector.selectorId)
    }

    package def Long performSelector(NSObject receiver, String selector, boolean arg1) {
        return OS.objc_msgSend(receiver.id, selector.selectorId, arg1)
    }

    package def Long performSelector(NSObject receiver, String selector, Long arg1) {
        return OS.objc_msgSend(receiver.id, selector.selectorId, arg1)
    }
    // ...

In this structure, the class called OS is currently org.eclipse.swt.internal.cocoa.OS.

Of course, Windows cannot find the OS class of org.eclipse.swt.internal.cocoa.OS.

So the light comes on in Eclipse for Windows.

Of course, it is understandable that the light indicating an error comes on, and even if the light is displayed, there is no problem with running it at runtime.

However, it is impossible to predict what problems will occur when building this using a build script (Ant) and creating UpdateSite.

Is it possible to add a library for macos (e.g. a Mac-specific JAR such as org.eclipse.swt.cocoa.macosx*) to the target platform used when building on Windows?

Upvotes: 0

Views: 25

Answers (0)

Related Questions