JetBrains / compose-multiplatform

Compose Multiplatform, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and enjoyable.
https://jetbrains.com/lp/compose-multiplatform
Apache License 2.0
15.89k stars 1.15k forks source link

Compose Desktop crashes on machines with AtkWrapper #2553

Open jimgoog opened 1 year ago

jimgoog commented 1 year ago

It appears SUSE Linux now ships with AtkWrapper which is supposed to improve accessibility integration for java/swing applications (Enables accessibility support in OpenJDK 17 by using java-atk-wrapper. This allows compatible at-spi2 based accessibility programs to work for AWT and Swing-based programs).

Apparently this causes Compose Desktop applications to crash:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "kotlin.Lazy.getValue()" because "<local1>" is null
    at androidx.compose.ui.awt.ComposeLayer.getA11yDisabled(ComposeLayer.desktop.kt:185)
    at androidx.compose.ui.awt.ComposeLayer.access$getA11yDisabled(ComposeLayer.desktop.kt:85)
    at androidx.compose.ui.awt.ComposeLayer$makeAccessible$1.getAccessibleContext(ComposeLayer.desktop.kt:192)
    at org.jetbrains.skiko.HardwareLayer.getAccessibleContext(HardwareLayer.kt:90)
    at atk.wrapper/org.GNOME.Accessibility.AtkWrapper$2.eventDispatched(AtkWrapper.java:245)
    at java.desktop/java.awt.Toolkit$SelectiveAWTEventListener.eventDispatched(Toolkit.java:2201)
    at java.desktop/java.awt.Toolkit.notifyAWTEventListeners(Toolkit.java:2049)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4907)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
    at java.desktop/java.awt.Container.addImpl(Container.java:1167)
    at java.desktop/java.awt.Container.add(Container.java:440)
    at org.jetbrains.skiko.SkiaLayer.<init>(SkiaLayer.awt.kt:107)
    at org.jetbrains.skiko.SkiaLayer.<init>(SkiaLayer.awt.kt:57)
    at org.jetbrains.skiko.SkiaLayer.<init>(SkiaLayer.awt.kt:51)
    at androidx.compose.ui.awt.ComposeLayer$ComponentImpl.<init>(ComposeLayer.desktop.kt:205)
    at androidx.compose.ui.awt.ComposeLayer.<init>(ComposeLayer.desktop.kt:90)
    at androidx.compose.ui.awt.ComposeWindowDelegate.<init>(ComposeWindowDelegate.desktop.kt:54)
    at androidx.compose.ui.awt.ComposeWindow.<init>(ComposeWindow.desktop.kt:61)
    at androidx.compose.ui.awt.ComposeWindow.<init>(ComposeWindow.desktop.kt:59)
    at androidx.compose.ui.window.Window_desktopKt$Window$3.invoke(Window.desktop.kt:162)
    at androidx.compose.ui.window.Window_desktopKt$Window$3.invoke(Window.desktop.kt:156)
    at androidx.compose.ui.window.Window_desktopKt$Window$10$1.invoke(Window.desktop.kt:378)
    at androidx.compose.ui.window.Window_desktopKt$Window$10$1.invoke(Window.desktop.kt:377)
    at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$2.invoke(AwtWindow.desktop.kt:75)
    at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$2.invoke(AwtWindow.desktop.kt:74)
    at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:81)
    at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1032)
    at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:793)
    at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:813)
    at androidx.compose.runtime.Recomposer.composeInitial$runtime(Recomposer.kt:827)
    at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:519)
    at androidx.compose.ui.window.Application_desktopKt$awaitApplication$2$1$2.invokeSuspend(Application.desktop.kt:219)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
    at atk.wrapper/org.GNOME.Accessibility.AtkWrapper$4.dispatchEvent(AtkWrapper.java:643)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

For more details, check out this post: https://qiita.com/cozyk100/items/634e7bd773f1e2b1ddee

The post is in Japanese, so using Google Translate may be required.

okushnikov commented 1 month ago

Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks.