こちらで紹介したので 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 } } } } } } }