Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NPE on Linux when interacting with TextField #281

Closed
juancnuno opened this issue Jan 9, 2024 · 4 comments · Fixed by #282
Closed

NPE on Linux when interacting with TextField #281

juancnuno opened this issue Jan 9, 2024 · 4 comments · Fixed by #282
Assignees
Labels
bug Something isn't working release-blocker Issues that block a (stable) release of the library
Milestone

Comments

@juancnuno
Copy link

The sun.awt.X11.XInputMethod bits of the stack trace may point to this being a Linux only thing

  1. Run the following
import androidx.compose.ui.window.singleWindowApplication
import org.jetbrains.jewel.intui.standalone.theme.IntUiTheme
import org.jetbrains.jewel.ui.component.TextField

fun main() {
  singleWindowApplication { IntUiTheme { TextField("a", {}) } }
}
  1. Click in the text field

  2. Note the following stack trace

ERROR: Unhandled exception in [androidx.compose.ui.awt.ComposeBridge$coroutineExceptionHandler$1@3384b078, androidx.compose.runtime.BroadcastFrameClock@50e0c941, StandaloneCoroutine{Cancelling}@a2bfb53, FlushCoroutineDispatcher@35413f0]
java.lang.NullPointerException: Parameter specified as non-null is null: method androidx.compose.ui.platform.PlatformInput$methodRequestsForInput$1.getTextLocation, parameter offset
	at androidx.compose.ui.platform.PlatformInput$methodRequestsForInput$1.getTextLocation(DesktopPlatformInput.desktop.kt)
	at java.desktop/sun.awt.X11.XInputMethod.updateCandidatesNativeWindowPosition(XInputMethod.java:379)
	at java.desktop/sun.awt.X11.XInputMethod.activate(XInputMethod.java:85)
	at java.desktop/sun.awt.im.InputContext.activateInputMethod(InputContext.java:396)
	at java.desktop/sun.awt.im.InputContext.focusGained(InputContext.java:338)
	at java.desktop/sun.awt.im.InputContext.dispatchEvent(InputContext.java:245)
	at java.desktop/sun.awt.im.InputMethodContext.dispatchEvent(InputMethodContext.java:197)
	at java.desktop/java.awt.Component.enableInputMethods(Component.java:1666)
	at org.jetbrains.skiko.SkiaLayer.enableInputMethods(SkiaLayer.awt.kt:412)
	at androidx.compose.ui.awt.ComposeBridge$platformComponent$1.enableInput(ComposeBridge.desktop.kt:107)
	at androidx.compose.ui.platform.PlatformInput.startInput(DesktopPlatformInput.desktop.kt:71)
	at androidx.compose.ui.text.input.TextInputService.startInput(TextInputService.kt:56)
	at androidx.compose.foundation.text.TextFieldDelegate$Companion.restartInput$foundation(TextFieldDelegate.kt:251)
	at androidx.compose.foundation.text.TextFieldDelegate$Companion.onFocus$foundation(TextFieldDelegate.kt:280)
	at androidx.compose.foundation.text.CoreTextFieldKt.startInputSession(CoreTextField.kt:970)
	at androidx.compose.foundation.text.CoreTextFieldKt.access$startInputSession(CoreTextField.kt:1)
	at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$focusModifier$1.invoke(CoreTextField.kt:307)
	at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$focusModifier$1.invoke(CoreTextField.kt:295)
	at androidx.compose.ui.focus.FocusChangedNode.onFocusEvent(FocusChangedModifier.kt:59)
	at androidx.compose.ui.focus.FocusEventModifierNodeKt.refreshFocusEventNodes(FocusEventModifierNode.kt:68)
	at androidx.compose.ui.focus.FocusTransactionsKt.requestFocusForChild(FocusTransactions.kt:197)
	at androidx.compose.ui.focus.FocusTransactionsKt.performRequestFocus(FocusTransactions.kt:68)
	at androidx.compose.ui.focus.FocusTransactionsKt.requestFocus(FocusTransactions.kt:44)
	at androidx.compose.ui.focus.FocusRequester.focus$ui(FocusRequester.kt:72)
	at androidx.compose.ui.focus.FocusRequester.requestFocus(FocusRequester.kt:63)
	at androidx.compose.foundation.text.selection.TextFieldSelectionManager$mouseSelectionObserver$1.onStart-3MmeM6k(TextFieldSelectionManager.kt:300)
	at androidx.compose.foundation.text.selection.TextSelectionMouseDetectorKt$mouseSelectionDetector$2.invokeSuspend(TextSelectionMouseDetector.kt:100)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:179)
	at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:168)
	at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:474)
	at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:508)
	at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:497)
	at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:368)
	at androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine.offerPointerEvent(SuspendingPointerInputFilter.kt:672)
	at androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNodeImpl.dispatchPointerEvent(SuspendingPointerInputFilter.kt:549)
	at androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNodeImpl.onPointerEvent-H0pRuoY(SuspendingPointerInputFilter.kt:571)
	at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:326)
	at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:312)
	at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:312)
	at androidx.compose.ui.input.pointer.NodeParent.dispatchMainEventPass(HitPathTracker.kt:185)
	at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:104)
	at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:97)
	at androidx.compose.ui.platform.SkiaBasedOwner.processPointerInput-gBdvCQM$ui(SkiaBasedOwner.skiko.kt:362)
	at androidx.compose.ui.platform.SkiaBasedOwner.processPointerInput-gBdvCQM$ui$default(SkiaBasedOwner.skiko.kt:355)
	at androidx.compose.ui.ComposeScene.processPress(ComposeScene.skiko.kt:722)
	at androidx.compose.ui.ComposeScene.processPointerInput(ComposeScene.skiko.kt:697)
	at androidx.compose.ui.ComposeScene.access$processPointerInput(ComposeScene.skiko.kt:68)
	at androidx.compose.ui.ComposeScene$syntheticEventSender$1.invoke(ComposeScene.skiko.kt:299)
	at androidx.compose.ui.ComposeScene$syntheticEventSender$1.invoke(ComposeScene.skiko.kt:299)
	at androidx.compose.ui.SyntheticEventSender.sendInternal(SyntheticEventSender.kt:179)
	at androidx.compose.ui.SyntheticEventSender.send(SyntheticEventSender.kt:83)
	at androidx.compose.ui.ComposeScene.sendPointerEvent-WlEVilQ(ComposeScene.skiko.kt:668)
	at androidx.compose.ui.ComposeScene.sendPointerEvent-BGSDPeU(ComposeScene.skiko.kt:610)
	at androidx.compose.ui.ComposeScene.sendPointerEvent-BGSDPeU$default(ComposeScene.skiko.kt:593)
	at androidx.compose.ui.awt.ComposeBridge_desktopKt.onMouseEvent(ComposeBridge.desktop.kt:440)
	at androidx.compose.ui.awt.ComposeBridge_desktopKt.access$onMouseEvent(ComposeBridge.desktop.kt:1)
	at androidx.compose.ui.awt.ComposeBridge$onMouseEvent$1.invoke(ComposeBridge.desktop.kt:271)
	at androidx.compose.ui.awt.ComposeBridge$onMouseEvent$1.invoke(ComposeBridge.desktop.kt:264)
	at androidx.compose.ui.awt.ComposeBridge.catchExceptions(ComposeBridge.desktop.kt:150)
	at androidx.compose.ui.awt.ComposeBridge.onMouseEvent(ComposeBridge.desktop.kt:264)
	at androidx.compose.ui.awt.ComposeBridge.access$onMouseEvent(ComposeBridge.desktop.kt:64)
	at androidx.compose.ui.awt.ComposeBridge$attachComposeToComponent$3.mousePressed(ComposeBridge.desktop.kt:244)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6654)
	at java.desktop/java.awt.Component.processEvent(Component.java:6422)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5027)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4855)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:794)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:766)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:764)
	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:763)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Parameter specified as non-null is null: method androidx.compose.ui.platform.PlatformInput$methodRequestsForInput$1.getTextLocation, parameter offset
	at androidx.compose.ui.platform.PlatformInput$methodRequestsForInput$1.getTextLocation(DesktopPlatformInput.desktop.kt)
	at java.desktop/sun.awt.X11.XInputMethod.updateCandidatesNativeWindowPosition(XInputMethod.java:379)
	at java.desktop/sun.awt.X11.XInputMethod.activate(XInputMethod.java:85)
	at java.desktop/sun.awt.im.InputContext.activateInputMethod(InputContext.java:396)
	at java.desktop/sun.awt.im.InputContext.focusGained(InputContext.java:338)
	at java.desktop/sun.awt.im.InputContext.dispatchEvent(InputContext.java:245)
	at java.desktop/sun.awt.im.InputMethodContext.dispatchEvent(InputMethodContext.java:197)
	at java.desktop/java.awt.Component.enableInputMethods(Component.java:1666)
	at org.jetbrains.skiko.SkiaLayer.enableInputMethods(SkiaLayer.awt.kt:412)
	at androidx.compose.ui.awt.ComposeBridge$platformComponent$1.enableInput(ComposeBridge.desktop.kt:107)
	at androidx.compose.ui.platform.PlatformInput.startInput(DesktopPlatformInput.desktop.kt:71)
	at androidx.compose.ui.text.input.TextInputService.startInput(TextInputService.kt:56)
	at androidx.compose.foundation.text.TextFieldDelegate$Companion.restartInput$foundation(TextFieldDelegate.kt:251)
	at androidx.compose.foundation.text.TextFieldDelegate$Companion.onFocus$foundation(TextFieldDelegate.kt:280)
	at androidx.compose.foundation.text.CoreTextFieldKt.startInputSession(CoreTextField.kt:970)
	at androidx.compose.foundation.text.CoreTextFieldKt.access$startInputSession(CoreTextField.kt:1)
	at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$focusModifier$1.invoke(CoreTextField.kt:307)
	at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$focusModifier$1.invoke(CoreTextField.kt:295)
	at androidx.compose.ui.focus.FocusChangedNode.onFocusEvent(FocusChangedModifier.kt:59)
	at androidx.compose.ui.focus.FocusEventModifierNodeKt.refreshFocusEventNodes(FocusEventModifierNode.kt:68)
	at androidx.compose.ui.focus.FocusTransactionsKt.requestFocusForChild(FocusTransactions.kt:197)
	at androidx.compose.ui.focus.FocusTransactionsKt.performRequestFocus(FocusTransactions.kt:68)
	at androidx.compose.ui.focus.FocusTransactionsKt.requestFocus(FocusTransactions.kt:44)
	at androidx.compose.ui.focus.FocusRequester.focus$ui(FocusRequester.kt:72)
	at androidx.compose.ui.focus.FocusRequester.requestFocus(FocusRequester.kt:63)
	at androidx.compose.foundation.text.selection.TextFieldSelectionManager$mouseSelectionObserver$1.onStart-3MmeM6k(TextFieldSelectionManager.kt:300)
	at androidx.compose.foundation.text.selection.TextSelectionMouseDetectorKt$mouseSelectionDetector$2.invokeSuspend(TextSelectionMouseDetector.kt:100)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:179)
	at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:168)
	at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:474)
	at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:508)
	at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:497)
	at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:368)
	at androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine.offerPointerEvent(SuspendingPointerInputFilter.kt:672)
	at androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNodeImpl.dispatchPointerEvent(SuspendingPointerInputFilter.kt:549)
	at androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNodeImpl.onPointerEvent-H0pRuoY(SuspendingPointerInputFilter.kt:571)
	at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:326)
	at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:312)
	at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:312)
	at androidx.compose.ui.input.pointer.NodeParent.dispatchMainEventPass(HitPathTracker.kt:185)
	at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:104)
	at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:97)
	at androidx.compose.ui.platform.SkiaBasedOwner.processPointerInput-gBdvCQM$ui(SkiaBasedOwner.skiko.kt:362)
	at androidx.compose.ui.platform.SkiaBasedOwner.processPointerInput-gBdvCQM$ui$default(SkiaBasedOwner.skiko.kt:355)
	at androidx.compose.ui.ComposeScene.processPress(ComposeScene.skiko.kt:722)
	at androidx.compose.ui.ComposeScene.processPointerInput(ComposeScene.skiko.kt:697)
	at androidx.compose.ui.ComposeScene.access$processPointerInput(ComposeScene.skiko.kt:68)
	at androidx.compose.ui.ComposeScene$syntheticEventSender$1.invoke(ComposeScene.skiko.kt:299)
	at androidx.compose.ui.ComposeScene$syntheticEventSender$1.invoke(ComposeScene.skiko.kt:299)
	at androidx.compose.ui.SyntheticEventSender.sendInternal(SyntheticEventSender.kt:179)
	at androidx.compose.ui.SyntheticEventSender.send(SyntheticEventSender.kt:83)
	at androidx.compose.ui.ComposeScene.sendPointerEvent-WlEVilQ(ComposeScene.skiko.kt:668)
	at androidx.compose.ui.ComposeScene.sendPointerEvent-BGSDPeU(ComposeScene.skiko.kt:610)
	at androidx.compose.ui.ComposeScene.sendPointerEvent-BGSDPeU$default(ComposeScene.skiko.kt:593)
	at androidx.compose.ui.awt.ComposeBridge_desktopKt.onMouseEvent(ComposeBridge.desktop.kt:440)
	at androidx.compose.ui.awt.ComposeBridge_desktopKt.access$onMouseEvent(ComposeBridge.desktop.kt:1)
	at androidx.compose.ui.awt.ComposeBridge$onMouseEvent$1.invoke(ComposeBridge.desktop.kt:271)
	at androidx.compose.ui.awt.ComposeBridge$onMouseEvent$1.invoke(ComposeBridge.desktop.kt:264)
	at androidx.compose.ui.awt.ComposeBridge.catchExceptions(ComposeBridge.desktop.kt:150)
	at androidx.compose.ui.awt.ComposeBridge.onMouseEvent(ComposeBridge.desktop.kt:264)
	at androidx.compose.ui.awt.ComposeBridge.access$onMouseEvent(ComposeBridge.desktop.kt:64)
	at androidx.compose.ui.awt.ComposeBridge$attachComposeToComponent$3.mousePressed(ComposeBridge.desktop.kt:244)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6654)
	at java.desktop/java.awt.Component.processEvent(Component.java:6422)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5027)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4855)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:794)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
	at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:766)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:764)
	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:763)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)
	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.ui.awt.ComposeBridge$coroutineExceptionHandler$1@3384b078, androidx.compose.runtime.BroadcastFrameClock@50e0c941, StandaloneCoroutine{Cancelling}@a2bfb53, FlushCoroutineDispatcher@35413f0]
@rock3r rock3r changed the title java.lang.NullPointerException: Parameter specified as non-null is null: method androidx.compose.ui.platform.PlatformInput$methodRequestsForInput$1.getTextLocation, parameter offset NPE on Linux when interacting with TextField Jan 10, 2024
@rock3r rock3r self-assigned this Jan 10, 2024
@rock3r rock3r added bug Something isn't working release-blocker Issues that block a (stable) release of the library labels Jan 10, 2024
@rock3r rock3r added this to the Milestone 13 milestone Jan 10, 2024
@rock3r
Copy link
Collaborator

rock3r commented Jan 10, 2024

After investigating this, I can repro on Ubuntu 22.04.3 with this minimal repro code:

import androidx.compose.foundation.border
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.singleWindowApplication

fun main() = singleWindowApplication {
    var text by remember { mutableStateOf("") }
    BasicTextField(text, { text = it }, modifier = Modifier.padding(8.dp).border(1.dp, Color.Red))
}

Clicking on the BasicTextField is enough to get the NPE.

Notice that there is nothing Jewel-related here. This only seems to happen when running on the JBR. I am trying to test under different JDKs and will also try to test on x64 (I am on arm64)

@rock3r
Copy link
Collaborator

rock3r commented Jan 10, 2024

I can confirm this is a regression on JBR 17.0.9 — the issue isn't reproduced on Zulu 17 nor JBR 17.0.8.1. Opening an issue against CfD.

@Leslie-DD
Copy link

Leslie-DD commented Jan 12, 2024

reported in this issue
solution
and use the latest compose.version=1.6.0-dev1362

@rock3r
Copy link
Collaborator

rock3r commented Jan 12, 2024

It's been fixed in #282

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working release-blocker Issues that block a (stable) release of the library
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants