Unverified Commit 4fbabeb5 authored by Roman Sedaikin's avatar Roman Sedaikin Committed by GitHub

Fix fullscreen mode on macos. (#385)

* Fix fullscreen mode on macos.
- fixed case where fullscreen mode is set before the window becomes visible and nothing happens after it becomes visible
see: https://github.com/JetBrains/compose-jb/issues/1134
parent 9454f4d9
...@@ -2,8 +2,40 @@ package org.jetbrains.skiko ...@@ -2,8 +2,40 @@ package org.jetbrains.skiko
import java.awt.Component import java.awt.Component
import java.awt.Window import java.awt.Window
import java.awt.event.ComponentAdapter
import java.awt.event.ComponentEvent
import javax.swing.SwingUtilities import javax.swing.SwingUtilities
internal open class FullscreenAdapter(
val backedLayer: HardwareLayer
): ComponentAdapter() {
private var _isFullscreenDispatched = false
private var _isFullscreen: Boolean = false
var fullscreen: Boolean
get() = _isFullscreen
set(value) {
_isFullscreen = value
val window = SwingUtilities.getRoot(backedLayer)
if ( window == null || !window.isVisible) {
_isFullscreenDispatched = value
} else {
backedLayer.fullscreen = value
}
}
override fun componentShown(e: ComponentEvent) {
backedLayer.fullscreen = _isFullscreenDispatched
}
override fun componentHidden(e: ComponentEvent) {
_isFullscreenDispatched = _isFullscreen
}
override fun componentResized(e: ComponentEvent) {
_isFullscreen = backedLayer.fullscreen
}
}
internal interface PlatformOperations { internal interface PlatformOperations {
fun isFullscreen(component: Component): Boolean fun isFullscreen(component: Component): Boolean
fun setFullscreen(component: Component, value: Boolean) fun setFullscreen(component: Component, value: Boolean)
...@@ -14,7 +46,8 @@ internal interface PlatformOperations { ...@@ -14,7 +46,8 @@ internal interface PlatformOperations {
internal val platformOperations: PlatformOperations by lazy { internal val platformOperations: PlatformOperations by lazy {
when (hostOs) { when (hostOs) {
OS.MacOS -> object: PlatformOperations { OS.MacOS -> {
object: PlatformOperations {
override fun isFullscreen(component: Component): Boolean { override fun isFullscreen(component: Component): Boolean {
return osxIsFullscreenNative(component) return osxIsFullscreenNative(component)
} }
...@@ -35,6 +68,7 @@ internal val platformOperations: PlatformOperations by lazy { ...@@ -35,6 +68,7 @@ internal val platformOperations: PlatformOperations by lazy {
osxOrderEmojiAndSymbolsPopup() osxOrderEmojiAndSymbolsPopup()
} }
} }
}
OS.Windows -> { OS.Windows -> {
object: PlatformOperations { object: PlatformOperations {
override fun isFullscreen(component: Component): Boolean { override fun isFullscreen(component: Component): Boolean {
......
...@@ -8,10 +8,12 @@ import java.awt.Component ...@@ -8,10 +8,12 @@ import java.awt.Component
import java.awt.Graphics import java.awt.Graphics
import java.awt.event.* import java.awt.event.*
import java.awt.im.InputMethodRequests import java.awt.im.InputMethodRequests
import java.awt.Window
import java.util.concurrent.CancellationException import java.util.concurrent.CancellationException
import javax.accessibility.Accessible import javax.accessibility.Accessible
import javax.swing.JComponent import javax.swing.JComponent
import javax.swing.JPanel import javax.swing.JPanel
import javax.swing.SwingUtilities
import javax.swing.SwingUtilities.isEventDispatchThread import javax.swing.SwingUtilities.isEventDispatchThread
import javax.swing.UIManager import javax.swing.UIManager
...@@ -92,13 +94,19 @@ actual open class SkiaLayer internal constructor( ...@@ -92,13 +94,19 @@ actual open class SkiaLayer internal constructor(
} }
} }
private var fullscreenAdapter = FullscreenAdapter(backedLayer)
override fun removeNotify() { override fun removeNotify() {
val window = SwingUtilities.getRoot(this) as Window
window.removeComponentListener(fullscreenAdapter)
dispose() dispose()
super.removeNotify() super.removeNotify()
} }
override fun addNotify() { override fun addNotify() {
super.addNotify() super.addNotify()
val window = SwingUtilities.getRoot(this) as Window
window.addComponentListener(fullscreenAdapter)
backedLayer.defineContentScale() backedLayer.defineContentScale()
checkShowing() checkShowing()
init(isInited) init(isInited)
...@@ -135,9 +143,9 @@ actual open class SkiaLayer internal constructor( ...@@ -135,9 +143,9 @@ actual open class SkiaLayer internal constructor(
get() = backedLayer.windowHandle get() = backedLayer.windowHandle
actual var fullscreen: Boolean actual var fullscreen: Boolean
get() = backedLayer.fullscreen get() = fullscreenAdapter.fullscreen
set(value) { set(value) {
backedLayer.fullscreen = value fullscreenAdapter.fullscreen = value
} }
actual var skikoView: SkikoView? = null actual var skikoView: SkikoView? = 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