Unverified Commit 617eae52 authored by Igor Demin's avatar Igor Demin Committed by GitHub

Don't depend on kotlinx-coroutines-swing (#515)

Because it overrides Dispatchers.Main

Fixes https://github.com/JetBrains/compose-jb/issues/1943 on skiko side
parent 95ef46bf
...@@ -273,9 +273,6 @@ kotlin { ...@@ -273,9 +273,6 @@ kotlin {
val awtMain by getting { val awtMain by getting {
dependsOn(jvmMain) dependsOn(jvmMain)
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:$coroutinesVersion")
}
} }
if (supportAndroid) { if (supportAndroid) {
...@@ -298,9 +295,6 @@ kotlin { ...@@ -298,9 +295,6 @@ kotlin {
val awtTest by getting { val awtTest by getting {
dependsOn(jvmTest) dependsOn(jvmTest)
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:$coroutinesVersion")
}
} }
if (supportAndroid) { if (supportAndroid) {
......
...@@ -2,7 +2,6 @@ package org.jetbrains.skiko ...@@ -2,7 +2,6 @@ package org.jetbrains.skiko
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.swing.Swing
import java.awt.* import java.awt.*
import java.awt.event.FocusEvent import java.awt.event.FocusEvent
import java.awt.event.InputMethodEvent import java.awt.event.InputMethodEvent
...@@ -110,7 +109,7 @@ internal open class HardwareLayer( ...@@ -110,7 +109,7 @@ internal open class HardwareLayer(
// and its accessibility context. This timeout is used to deal with concurrency // and its accessibility context. This timeout is used to deal with concurrency
// TODO Find more reliable procedure // TODO Find more reliable procedure
resetFocusAccessibleJob?.cancel() resetFocusAccessibleJob?.cancel()
resetFocusAccessibleJob = GlobalScope.launch(Dispatchers.Swing) { resetFocusAccessibleJob = GlobalScope.launch(MainUIDispatcher) {
delay(100) delay(100)
_focusedAccessible = null _focusedAccessible = null
} }
......
package org.jetbrains.skiko
import kotlinx.coroutines.*
import java.awt.event.ActionListener
import java.lang.Runnable
import java.util.concurrent.TimeUnit
import javax.swing.SwingUtilities
import javax.swing.Timer
import kotlin.coroutines.CoroutineContext
/**
* Dispatcher for UI thread, which is used in the current implementation of native UI integration.
* Currently, it uses Swing event dispatching thread.
*/
val MainUIDispatcher: CoroutineDispatcher
get() = SwingDispatcher
/**
* Dispatcher for Swing event dispatching thread.
*
* Copy of Dispatchers.Swing from kotlinx-coroutines-swing.
*
* We don't depend on kotlinx-coroutines-swing, because it will override Dispatchers.Main, and
* application can require a different Dispatchers.Main.
*
* Note, that we use internal API `Delay` and experimental `resumeUndispatched`.
* That means it can be changed in the future. When it happens, we need
* to release a new version of Skiko.
*/
@OptIn(InternalCoroutinesApi::class, ExperimentalCoroutinesApi::class)
private object SwingDispatcher : CoroutineDispatcher(), Delay {
override fun dispatch(context: CoroutineContext, block: Runnable): Unit = SwingUtilities.invokeLater(block)
override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation<Unit>) {
val timer = schedule(timeMillis, TimeUnit.MILLISECONDS) {
with(continuation) { resumeUndispatched(Unit) }
}
continuation.invokeOnCancellation { timer.stop() }
}
override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle {
val timer = schedule(timeMillis, TimeUnit.MILLISECONDS) {
block.run()
}
return object : DisposableHandle {
override fun dispose() {
timer.stop()
}
}
}
private fun schedule(time: Long, unit: TimeUnit, action: ActionListener): Timer =
Timer(unit.toMillis(time).coerceAtMost(Int.MAX_VALUE.toLong()).toInt(), action).apply {
isRepeats = false
start()
}
}
\ No newline at end of file
...@@ -5,6 +5,7 @@ import kotlinx.coroutines.* ...@@ -5,6 +5,7 @@ import kotlinx.coroutines.*
import org.jetbrains.skiko.FrameDispatcher import org.jetbrains.skiko.FrameDispatcher
import org.jetbrains.skiko.FrameLimiter import org.jetbrains.skiko.FrameLimiter
import org.jetbrains.skiko.RenderException import org.jetbrains.skiko.RenderException
import org.jetbrains.skiko.MainUIDispatcher
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkiaLayerProperties import org.jetbrains.skiko.SkiaLayerProperties
import org.jetbrains.skiko.context.DirectSoftwareContextHandler import org.jetbrains.skiko.context.DirectSoftwareContextHandler
......
...@@ -3,6 +3,7 @@ package org.jetbrains.skiko.redrawer ...@@ -3,6 +3,7 @@ package org.jetbrains.skiko.redrawer
import org.jetbrains.skia.BackendRenderTarget import org.jetbrains.skia.BackendRenderTarget
import org.jetbrains.skia.DirectContext import org.jetbrains.skia.DirectContext
import org.jetbrains.skiko.FrameDispatcher import org.jetbrains.skiko.FrameDispatcher
import org.jetbrains.skiko.MainUIDispatcher
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkiaLayerProperties import org.jetbrains.skiko.SkiaLayerProperties
import org.jetbrains.skiko.context.AngleContextHandler import org.jetbrains.skiko.context.AngleContextHandler
......
package org.jetbrains.skiko.redrawer
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainCoroutineDispatcher
import kotlinx.coroutines.swing.Swing
val MainUIDispatcher: MainCoroutineDispatcher
get() = Dispatchers.Swing
...@@ -3,6 +3,7 @@ package org.jetbrains.skiko.redrawer ...@@ -3,6 +3,7 @@ package org.jetbrains.skiko.redrawer
import kotlinx.coroutines.* import kotlinx.coroutines.*
import org.jetbrains.skiko.FrameDispatcher import org.jetbrains.skiko.FrameDispatcher
import org.jetbrains.skiko.FrameLimiter import org.jetbrains.skiko.FrameLimiter
import org.jetbrains.skiko.MainUIDispatcher
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkiaLayerProperties import org.jetbrains.skiko.SkiaLayerProperties
import org.jetbrains.skiko.context.SoftwareContextHandler import org.jetbrains.skiko.context.SoftwareContextHandler
......
package org.jetbrains.skiko.util package org.jetbrains.skiko.util
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.swing.Swing
import org.jetbrains.skiko.* import org.jetbrains.skiko.*
import org.junit.Assume.assumeFalse import org.junit.Assume.assumeFalse
import org.junit.Assume.assumeTrue import org.junit.Assume.assumeTrue
...@@ -16,7 +14,7 @@ internal fun uiTest(block: suspend UiTestScope.() -> Unit) { ...@@ -16,7 +14,7 @@ internal fun uiTest(block: suspend UiTestScope.() -> Unit) {
val renderApi = System.getProperty("skiko.test.ui.renderApi", "all") val renderApi = System.getProperty("skiko.test.ui.renderApi", "all")
runBlocking(Dispatchers.Swing) { runBlocking(MainUIDispatcher) {
if (renderApi == "all") { if (renderApi == "all") {
SkikoProperties.fallbackRenderApiQueue(SkikoProperties.renderApi).forEach { SkikoProperties.fallbackRenderApiQueue(SkikoProperties.renderApi).forEach {
println("Testing $it renderApi") println("Testing $it renderApi")
......
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