diff --git a/tutorials/Mouse_Events/README.md b/tutorials/Mouse_Events/README.md index 0eeb037f22..69411100d1 100644 --- a/tutorials/Mouse_Events/README.md +++ b/tutorials/Mouse_Events/README.md @@ -140,4 +140,58 @@ fun main() = Window(title = "Compose for Desktop", size = IntSize(400, 400)) { } } ``` -![Application running](mouse_enter.gif) \ No newline at end of file +![Application running](mouse_enter.gif) + +### Mouse right/middle clicks and keyboard modifiers + +While first-class support for pointer type-specific data, like pressed mouse buttons, is still in development in Compose, there is an available raw AWT mouse event object in Compose for Desktop, that can be used as a workaround when you need advanced functionality. + +```kotlin +import androidx.compose.desktop.Window +import androidx.compose.foundation.gestures.forEachGesture +import androidx.compose.foundation.layout.Column +import androidx.compose.material.Text +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.AwaitPointerEventScope +import androidx.compose.ui.input.pointer.PointerEvent +import androidx.compose.ui.input.pointer.changedToDown +import androidx.compose.ui.input.pointer.consumeDownChange +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.unit.IntSize +import java.awt.event.MouseEvent + +fun main() = Window(title = "Compose for Desktop", size = IntSize(400, 400)) { + var lastEvent by remember { mutableStateOf(null) } + Column { + Text( + text = "Custom button", + modifier = Modifier.pointerInput(Unit) { + forEachGesture { + awaitPointerEventScope { + lastEvent = awaitEventFirstDown().also { + it.changes.forEach { it.consumeDownChange() } + }.mouseEvent + } + } + } + ) + Text("Mouse event: ${lastEvent?.paramString()}") + } + +} + +private suspend fun AwaitPointerEventScope.awaitEventFirstDown(): PointerEvent { + var event: PointerEvent + do { + event = awaitPointerEvent() + } while ( + !event.changes.all { it.changedToDown() } + ) + return event +} +``` +![Application running](mouse_event.gif) \ No newline at end of file diff --git a/tutorials/Mouse_Events/mouse_event.gif b/tutorials/Mouse_Events/mouse_event.gif new file mode 100644 index 0000000000..0cde3989a5 Binary files /dev/null and b/tutorials/Mouse_Events/mouse_event.gif differ