Unverified Commit cb53dfe0 authored by Aleksandr Veselov's avatar Aleksandr Veselov Committed by GitHub

Replace timer with a Job (#502)

parent ed8ee560
package org.jetbrains.skiko package org.jetbrains.skiko
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay import kotlinx.coroutines.swing.Swing
import kotlinx.coroutines.launch
import java.awt.* import java.awt.*
import java.awt.event.InputMethodEvent import java.awt.event.InputMethodEvent
import java.beans.PropertyChangeEvent import java.beans.PropertyChangeEvent
import javax.accessibility.Accessible import javax.accessibility.Accessible
import javax.accessibility.AccessibleContext import javax.accessibility.AccessibleContext
import javax.swing.Timer
import kotlin.time.ExperimentalTime import kotlin.time.ExperimentalTime
internal open class HardwareLayer( internal open class HardwareLayer(
...@@ -35,6 +33,7 @@ internal open class HardwareLayer( ...@@ -35,6 +33,7 @@ internal open class HardwareLayer(
} }
open fun dispose() { open fun dispose() {
resetFocusAccessibleJob?.cancel()
nativeDispose() nativeDispose()
} }
...@@ -88,7 +87,7 @@ internal open class HardwareLayer( ...@@ -88,7 +87,7 @@ internal open class HardwareLayer(
return res ?: super.getAccessibleContext() return res ?: super.getAccessibleContext()
} }
val resetFocusAccessibleTimer: Timer = Timer(100) { _focusedAccessible = null } private var resetFocusAccessibleJob: Job? = null
fun requestNativeFocusOnAccessible(accessible: Accessible?) { fun requestNativeFocusOnAccessible(accessible: Accessible?) {
_focusedAccessible = accessible _focusedAccessible = accessible
...@@ -99,9 +98,13 @@ internal open class HardwareLayer( ...@@ -99,9 +98,13 @@ internal open class HardwareLayer(
listeners.forEach { it.propertyChange(event) } listeners.forEach { it.propertyChange(event) }
// Listener spawns asynchronous notification post procedure, reading current focus owner // Listener spawns asynchronous notification post procedure, reading current focus owner
// and its accessibility context. This timer 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
resetFocusAccessibleTimer.restart() resetFocusAccessibleJob?.cancel()
resetFocusAccessibleJob = GlobalScope.launch(Dispatchers.Swing) {
delay(100)
_focusedAccessible = null
}
} }
} }
......
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