fn pointer_frame()

in native/desktop-linux/src/linux/mouse.rs [49:139]


    fn pointer_frame(&mut self, conn: &Connection, qh: &QueueHandle<Self>, _pointer: &WlPointer, events: &[PointerEvent]) {
        for event in events {
            let Some(window) = self.windows.get_mut(&event.surface.id()) else {
                continue;
            };
            let scale = window.current_scale;
            let window_id = window.window_id;

            _ = match event.kind {
                PointerEventKind::Enter { .. } => {
                    window.num_pointer_buttons_down = 0;
                    window.set_cursor = true;
                    let res = self.send_event(MouseEnteredEvent {
                        window_id,
                        location_in_window: event.position.into(),
                    });
                    if let Some(themed_pointer) = self.themed_pointer.take() {
                        let pointer_surface = themed_pointer.surface();
                        if let Some(pointer_surface_data) = pointer_surface.data() {
                            #[allow(clippy::cast_possible_truncation)]
                            let pointer_surface_event = wl_surface::Event::PreferredBufferScale {
                                factor: scale.round() as i32,
                            };
                            debug!("Setting cursor scale to {scale:?}");
                            Dispatch::<WlSurface, SurfaceData>::event(
                                self,
                                pointer_surface,
                                pointer_surface_event,
                                pointer_surface_data,
                                conn,
                                qh,
                            );
                        }
                        self.themed_pointer = Some(themed_pointer);
                    }
                    res
                }
                PointerEventKind::Leave { .. } => {
                    window.num_pointer_buttons_down = 0;
                    self.send_event(MouseExitedEvent {
                        window_id,
                        location_in_window: event.position.into(),
                    })
                }
                PointerEventKind::Motion { time } => self.send_event(MouseMovedEvent {
                    window_id,
                    location_in_window: event.position.into(),
                    timestamp: Timestamp(time),
                }),
                PointerEventKind::Press { button, serial, time } => {
                    if window.num_pointer_buttons_down == 0 {
                        self.last_pointer_down_event_serial = Some(serial);
                    }
                    window.num_pointer_buttons_down += 1;
                    self.send_event(MouseDownEvent {
                        window_id,
                        button: MouseButton(button),
                        location_in_window: event.position.into(),
                        timestamp: Timestamp(time),
                    })
                }
                PointerEventKind::Release { button, serial: _, time } => {
                    // Sometimes the Release event can occur without the Press event beforehand. E.g., when dismissing the window menu.
                    if window.num_pointer_buttons_down > 0 {
                        window.num_pointer_buttons_down -= 1;
                    }
                    self.send_event(MouseUpEvent {
                        window_id,
                        button: MouseButton(button),
                        location_in_window: event.position.into(),
                        timestamp: Timestamp(time),
                    })
                }
                PointerEventKind::Axis {
                    time,
                    horizontal,
                    vertical,
                    ..
                } => {
                    debug!("wl_pointer vertical={vertical:?}");
                    self.send_event(ScrollWheelEvent {
                        window_id,
                        location_in_window: event.position.into(),
                        timestamp: Timestamp(time),
                        horizontal_scroll: horizontal.into(),
                        vertical_scroll: vertical.into(),
                    })
                }
            };
        }
    }