アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

【Compose Desktop】フレームなしウィンドウを移動させる【1.1.1】

こちらで紹介したので 0.3.0-build150 のバージョンでしたが、 LocalAppWindow が無くなったので、代わりにWindowに与える引数の、WindowStateを使います。
https://matsudamper.hatenablog.com/entry/2021/02/08/025214

コード

Compose Desktopのバージョンは1.1.1です。

import androidx.compose.foundation.gestures.forEachGesture
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.awt.awtEventOrNull
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.WindowPosition
import androidx.compose.ui.window.WindowState
import java.awt.event.MouseEvent

@Composable
fun Modifier.windowDraggable(windowProvider: () -> WindowState): Modifier {
    return pointerInput(Unit) {
        forEachGesture {
            awaitPointerEventScope {
                val window = windowProvider()
                val firstEvent = awaitPointerEvent()
                when (firstEvent.awtEventOrNull?.id) {
                    MouseEvent.MOUSE_PRESSED -> Unit
                    else -> return@awaitPointerEventScope
                }
                val firstWindowPoint = firstEvent.awtEventOrNull?.locationOnScreen ?: return@awaitPointerEventScope
                val startPosition = window.position
                while (true) {
                    val event = awaitPointerEvent()
                    val currentPoint = event.awtEventOrNull?.locationOnScreen ?: break
                  
                    window.position = WindowPosition(
                        x = startPosition.x + (currentPoint.x - firstWindowPoint.x).dp,
                        y = startPosition.y + (currentPoint.y - firstWindowPoint.y).dp,
                    )

                    when (event.awtEventOrNull?.id) {
                        null,
                        MouseEvent.MOUSE_RELEASED -> {
                            break
                        }
                    }
                }
            }
        }
    }
}