diff options
Diffstat (limited to 'src/phosphor.rs')
-rw-r--r-- | src/phosphor.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/phosphor.rs b/src/phosphor.rs index ab13cb0..08c71da 100644 --- a/src/phosphor.rs +++ b/src/phosphor.rs @@ -134,10 +134,16 @@ impl PhosphorApplication { } } WindowEvent::CursorEntered { .. } => { + window.pointer_state = PointerState::In; handle!(Event::CursorEnter); } WindowEvent::CursorLeft { .. } => { - handle!(Event::CursorExit); + if window.mouse_buttons.iter().all(|b| !b) { + window.pointer_state = PointerState::Out; + handle!(Event::CursorExit); + } else { + window.pointer_state = PointerState::PendingOut; + } } WindowEvent::MouseWheel { delta, .. } => match delta { MouseScrollDelta::LineDelta(x, y) => { @@ -159,6 +165,20 @@ impl PhosphorApplication { WinitMouseButton::Forward => handle!(Event::MouseButton { button: MouseButton::Forward, action }), _ => (), } + // Keep track of mouse button hold states, and mark cursor as out when all are released. + let button_index = match button { + WinitMouseButton::Left => 0, + WinitMouseButton::Middle => 1, + WinitMouseButton::Right => 2, + WinitMouseButton::Back => 3, + WinitMouseButton::Forward => 4, + _ => return, + }; + window.mouse_buttons[button_index] = action.is_pressed(); + if window.pointer_state == PointerState::PendingOut && window.mouse_buttons.iter().all(|b| !b) { + window.pointer_state = PointerState::Out; + handle!(Event::CursorExit); + } } WindowEvent::RedrawRequested => { window.redraw(); |