diff --git a/src/backend/wayland/handlers/pointer.rs b/src/backend/wayland/handlers/pointer.rs index 78e3eb21..9f888a25 100644 --- a/src/backend/wayland/handlers/pointer.rs +++ b/src/backend/wayland/handlers/pointer.rs @@ -27,8 +27,12 @@ impl PointerHandler for WaylandState { } else { CursorIcon::Crosshair }; - if let Err(err) = pointer.set_cursor(conn, icon) { - warn!("Failed to set cursor icon: {}", err); + if this.current_pointer_shape != Some(icon) { + if let Err(err) = pointer.set_cursor(conn, icon) { + warn!("Failed to set cursor icon: {}", err); + } else { + this.current_pointer_shape = Some(icon); + } } } }; @@ -117,7 +121,7 @@ impl PointerHandler for WaylandState { if (on_toolbar || inline_active) && !self.is_move_dragging() { self.end_toolbar_move_drag(); } - update_cursor(false, conn, self); + self.current_pointer_shape = None; } PointerEventKind::Motion { .. } => { if self.is_move_dragging() diff --git a/src/backend/wayland/handlers/seat.rs b/src/backend/wayland/handlers/seat.rs index 3cf13396..e73422b6 100644 --- a/src/backend/wayland/handlers/seat.rs +++ b/src/backend/wayland/handlers/seat.rs @@ -41,6 +41,7 @@ impl SeatHandler for WaylandState { Ok(pointer) => { debug!("Pointer initialized with theme"); self.themed_pointer = Some(pointer); + self.current_pointer_shape = None; } Err(err) => { warn!("Pointer initialized without theme: {}", err); @@ -74,6 +75,7 @@ impl SeatHandler for WaylandState { if capability == Capability::Pointer { info!("Pointer capability removed"); self.themed_pointer = None; + self.current_pointer_shape = None; } } diff --git a/src/backend/wayland/state.rs b/src/backend/wayland/state.rs index 9d39878a..aebd1224 100644 --- a/src/backend/wayland/state.rs +++ b/src/backend/wayland/state.rs @@ -3,6 +3,7 @@ use crate::draw::Color; use anyhow::{Context, Result}; use log::{debug, info, warn}; +use smithay_client_toolkit::seat::pointer::CursorIcon; use smithay_client_toolkit::shell::WaylandSurface; use smithay_client_toolkit::{ activation::{ActivationHandler, ActivationState, RequestData}, @@ -162,6 +163,7 @@ pub(super) struct WaylandState { // Pointer cursor pub(super) themed_pointer: Option>, pub(super) locked_pointer: Option, + pub(super) current_pointer_shape: Option, pub(super) relative_pointer: Option, // Tablet / stylus (feature-gated) diff --git a/src/backend/wayland/state/core.rs b/src/backend/wayland/state/core.rs index 8809ec92..9d254e8d 100644 --- a/src/backend/wayland/state/core.rs +++ b/src/backend/wayland/state/core.rs @@ -91,6 +91,7 @@ impl WaylandState { zoom: ZoomState::new(zoom_manager), exit_after_capture_mode, themed_pointer: None, + current_pointer_shape: None, locked_pointer: None, relative_pointer: None, #[cfg(tablet)]