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 package org.jetbrains.skiko
import org.jetbrains.skija.Canvas import org.jetbrains.skija.*
import org.jetbrains.skija.ClipMode
import org.jetbrains.skija.Picture
import org.jetbrains.skija.PictureRecorder
import org.jetbrains.skija.Rect
import org.jetbrains.skiko.context.ContextHandler import org.jetbrains.skiko.context.ContextHandler
import org.jetbrains.skiko.context.createContextHandler import org.jetbrains.skiko.context.createContextHandler
import org.jetbrains.skiko.redrawer.Redrawer 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.Graphics
import java.awt.event.HierarchyEvent import java.awt.event.*
import javax.swing.JPanel import javax.swing.JPanel
import javax.swing.SwingUtilities.invokeLater
import javax.swing.SwingUtilities.isEventDispatchThread import javax.swing.SwingUtilities.isEventDispatchThread
interface SkiaRenderer { interface SkiaRenderer {
...@@ -45,6 +35,7 @@ open class SkiaLayer( ...@@ -45,6 +35,7 @@ open class SkiaLayer(
} }
private var isInited = false private var isInited = false
private var isRendering = false
private fun checkIsShowing() { private fun checkIsShowing() {
if (!isInited && isShowing) { if (!isInited && isShowing) {
...@@ -115,8 +106,19 @@ open class SkiaLayer( ...@@ -115,8 +106,19 @@ open class SkiaLayer(
contentScaleChanged() contentScaleChanged()
} }
redrawer?.syncSize() 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() redrawer?.redrawImmediately()
} }
}
override fun addInputMethodListener(l: InputMethodListener) { override fun addInputMethodListener(l: InputMethodListener) {
backedLayer.addInputMethodListener(l) backedLayer.addInputMethodListener(l)
...@@ -169,7 +171,12 @@ open class SkiaLayer( ...@@ -169,7 +171,12 @@ open class SkiaLayer(
canvas.clipRectBy(component) canvas.clipRectBy(component)
} }
try {
isRendering = true
renderer?.onRender(canvas, pictureWidth, pictureHeight, nanoTime) renderer?.onRender(canvas, pictureWidth, pictureHeight, nanoTime)
} finally {
isRendering = false
}
// we can dispose layer during onRender // we can dispose layer during onRender
if (!isDisposed) { 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