Commit 1d61852a authored by Igor Demin's avatar Igor Demin

Linux. Fix crash in Compose on dialog open https://github.com/JetBrains/compose-jb/issues/444

parent bc43ce21
package org.jetbrains.skiko
import org.jetbrains.skija.Canvas
import org.jetbrains.skija.ClipMode
import org.jetbrains.skija.Picture
import org.jetbrains.skija.PictureRecorder
import org.jetbrains.skija.Rect
import org.jetbrains.skija.*
import org.jetbrains.skiko.context.ContextHandler
import org.jetbrains.skiko.context.createContextHandler
import org.jetbrains.skiko.redrawer.Redrawer
import java.awt.event.InputMethodListener
import java.awt.event.KeyListener
import java.awt.event.MouseListener
import java.awt.event.MouseMotionListener
import java.awt.event.MouseWheelListener
import java.awt.Graphics
import java.awt.event.HierarchyEvent
import java.awt.event.*
import javax.swing.JPanel
import javax.swing.SwingUtilities.invokeLater
import javax.swing.SwingUtilities.isEventDispatchThread
interface SkiaRenderer {
......@@ -45,6 +35,7 @@ open class SkiaLayer(
}
private var isInited = false
private var isRendering = false
private fun checkIsShowing() {
if (!isInited && isShowing) {
......@@ -115,8 +106,19 @@ open class SkiaLayer(
contentScaleChanged()
}
redrawer?.syncSize()
// `paint` can be called when we already inside `draw` method.
//
// For example if we call some AWT function inside renderer.onRender,
// such as `jframe.isEnabled = false` on Linux
//
// To avoid recursive call of `draw` (we don't support recursive calls) we just schedule redrawing.
if (isRendering) {
redrawer?.needRedraw()
} else {
redrawer?.redrawImmediately()
}
}
override fun addInputMethodListener(l: InputMethodListener) {
backedLayer.addInputMethodListener(l)
......@@ -169,7 +171,12 @@ open class SkiaLayer(
canvas.clipRectBy(component)
}
try {
isRendering = true
renderer?.onRender(canvas, pictureWidth, pictureHeight, nanoTime)
} finally {
isRendering = false
}
// we can dispose layer during onRender
if (!isDisposed) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment