JetBrains / compose-multiplatform

Compose Multiplatform, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and enjoyable.
https://jetbrains.com/lp/compose-multiplatform
Apache License 2.0
15.95k stars 1.16k forks source link

Adaptive window size doesn't count the insets of a decorated window (Linux) #1297

Open igordmn opened 2 years ago

igordmn commented 2 years ago

Compose 1.0-beta1, Ubuntu 20.04, X11, JDK 11/16

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.WindowState
import androidx.compose.ui.window.singleWindowApplication

fun main() = singleWindowApplication(
    state = WindowState(size = DpSize(Dp.Unspecified, Dp.Unspecified))
) {
    Box(
        Modifier
            .width(400.dp)
            .height(200.dp)
            .background(Color.Green)
    )
}

Screenshot from 2021-10-22 21-56-37

I investigated, and figured out that Swing (or it is X11?) returns wrong insets for JFrame right after it is visible:

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.swing.Swing
import kotlinx.coroutines.yield
import java.awt.Dimension
import javax.swing.JFrame

fun main() {
    runBlocking(Dispatchers.Swing) {
        val f = JFrame()
        f.size = Dimension(410, 230)
        f.isVisible = true
        println("${f.insets} ${f.isDisplayable}")
        yield()
        println("${f.insets} ${f.isDisplayable}")
    }
}

Result:

java.awt.Insets[top=25,left=5,bottom=5,right=5] true // wrong insets
java.awt.Insets[top=37,left=0,bottom=0,right=0] true // correct insets
okushnikov commented 4 weeks ago

Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks.