Skip to content

Commit 7306b40

Browse files
authored
Use skiko's transparentWindowBackgroundHack (#2671)
1 parent c2bdf44 commit 7306b40

File tree

3 files changed

+11
-24
lines changed

3 files changed

+11
-24
lines changed

compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindowPanel.desktop.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ import java.awt.FocusTraversalPolicy
3232
import java.awt.Window
3333
import java.awt.event.MouseListener
3434
import java.awt.event.MouseMotionListener
35+
import org.jetbrains.skiko.DelicateSkikoApi
3536
import org.jetbrains.skiko.SkiaLayerAnalytics
37+
import org.jetbrains.skiko.transparentWindowBackgroundHack
3638

3739
/**
3840
* A panel used as a main view in [ComposeWindow] and [ComposeDialog].
@@ -93,7 +95,9 @@ internal class ComposeWindowPanel(
9395
field = value
9496
composeContainer.onWindowTransparencyChanged(value)
9597
isOpaque = !value
96-
window.background = getTransparentWindowBackground(value, renderApi)
98+
99+
@OptIn(DelicateSkikoApi::class)
100+
window.background = if (value) transparentWindowBackgroundHack(renderApi) else null
97101
}
98102
}
99103

compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/Utils.desktop.kt

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import javax.swing.JLayeredPane
3232
import kotlin.math.ceil
3333
import kotlin.math.floor
3434
import kotlin.math.roundToInt
35-
import org.jetbrains.skiko.GraphicsApi
3635
import org.jetbrains.skiko.OS
3736
import org.jetbrains.skiko.hostOs
3837

@@ -87,23 +86,6 @@ internal fun Rect.toAwtRectangleRounded(density: Density): Rectangle {
8786

8887
internal fun Color.toAwtColor() = java.awt.Color(red, green, blue, alpha)
8988

90-
internal fun getTransparentWindowBackground(
91-
isWindowTransparent: Boolean,
92-
renderApi: GraphicsApi
93-
): java.awt.Color? {
94-
/**
95-
* There is a hack inside skiko OpenGL and Software redrawers for Windows that makes current
96-
* window transparent without setting `background` to JDK's window. It's done by getting native
97-
* component parent and calling `DwmEnableBlurBehindWindow`.
98-
*
99-
* FIXME: Make OpenGL work inside transparent window (background == Color(0, 0, 0, 0)) without this hack.
100-
*
101-
* See `enableTransparentWindow` (skiko/src/awtMain/cpp/windows/window_util.cc)
102-
*/
103-
val skikoTransparentWindowHack = hostOs == OS.Windows && renderApi != GraphicsApi.DIRECT3D
104-
return if (isWindowTransparent && !skikoTransparentWindowHack) java.awt.Color(0, 0, 0, 0) else null
105-
}
106-
10789
// See https://developer.apple.com/library/archive/technotes/tn2007/tn2196.html#WINDOW_SHADOW
10890
private var JComponent.hasMacOsShadow: Boolean
10991
get() = getClientProperty("Window.shadow") as? Boolean? ?: false

compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/scene/WindowComposeSceneLayer.desktop.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package androidx.compose.ui.scene
1919
import androidx.compose.runtime.CompositionContext
2020
import androidx.compose.ui.awt.JLayeredPaneWithTransparencyHack
2121
import androidx.compose.ui.awt.RenderSettings
22-
import androidx.compose.ui.awt.getTransparentWindowBackground
2322
import androidx.compose.ui.awt.hasMacOsShadow
2423
import androidx.compose.ui.awt.toAwtRectangle
2524
import androidx.compose.ui.geometry.Rect
@@ -43,7 +42,9 @@ import java.awt.event.ComponentEvent
4342
import javax.swing.JDialog
4443
import org.jetbrains.skia.Canvas
4544
import org.jetbrains.skia.Rect as SkRect
45+
import org.jetbrains.skiko.DelicateSkikoApi
4646
import org.jetbrains.skiko.SkiaLayerAnalytics
47+
import org.jetbrains.skiko.transparentWindowBackgroundHack
4748

4849
internal class WindowComposeSceneLayer(
4950
composeContainer: ComposeContainer,
@@ -67,10 +68,10 @@ internal class WindowComposeSceneLayer(
6768
it.isAlwaysOnTop = true
6869
it.focusableWindowState = focusable
6970
it.isUndecorated = true
70-
it.background = getTransparentWindowBackground(
71-
isWindowTransparent = transparent,
72-
renderApi = composeContainer.renderApi
73-
)
71+
72+
@OptIn(DelicateSkikoApi::class)
73+
it.background =
74+
if (transparent) transparentWindowBackgroundHack(composeContainer.renderApi) else null
7475
if (transparent) {
7576
it.hasMacOsShadow = false
7677
}

0 commit comments

Comments
 (0)