fn on_pointerupdate()

in native/desktop-win32/src/win32/event_loop.rs [410:452]


fn on_pointerupdate(event_loop: &EventLoop, window: &Window, msg: u32, wparam: WPARAM) -> Option<LRESULT> {
    let is_non_client = matches!(msg, WM_NCPOINTERUPDATE);
    let pointer_info = PointerInfo::try_from_message(wparam).ok()?;
    let event = if window.is_pointer_in_window() {
        let button_change = pointer_info.get_pointer_button_change();
        match button_change.kind() {
            PointerButtonChangeKind::Pressed => {
                let click_location = pointer_info.get_physical_location();
                let click_count = window.with_mut_pointer_click_counter(|c| c.register_click(button_change.button(), click_location));
                Event::PointerDown(PointerDownEvent {
                    button: button_change.button(),
                    click_count,
                    location_in_window: pointer_info.get_location_in_window(),
                    non_client_area: is_non_client,
                    state: pointer_info.get_pointer_state(),
                    timestamp: pointer_info.get_timestamp(),
                })
            }
            PointerButtonChangeKind::Released => Event::PointerUp(PointerUpEvent {
                button: button_change.button(),
                location_in_window: pointer_info.get_location_in_window(),
                non_client_area: is_non_client,
                state: pointer_info.get_pointer_state(),
                timestamp: pointer_info.get_timestamp(),
            }),
            PointerButtonChangeKind::Other => Event::PointerUpdated(PointerUpdatedEvent {
                location_in_window: pointer_info.get_location_in_window(),
                non_client_area: is_non_client,
                state: pointer_info.get_pointer_state(),
                timestamp: pointer_info.get_timestamp(),
            }),
        }
    } else {
        // see https://devblogs.microsoft.com/oldnewthing/20031013-00/?p=42193
        window.set_is_pointer_in_window(true);
        Event::PointerEntered(PointerEnteredEvent {
            location_in_window: pointer_info.get_location_in_window(),
            state: pointer_info.get_pointer_state(),
            timestamp: pointer_info.get_timestamp(),
        })
    };
    event_loop.handle_event(window, event)
}