From fa4bffdbe6818c1e005712186b3cd1e79638c95f Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Fri, 6 Jun 2025 15:33:58 -0700 Subject: [PATCH] Add `cursor_image_status`/`set_cursor_image_status` to `SeatExt` The `cursor_image_status()` function saves some duplication in various places. The `set_cursor_image_status()` saves a bit less, but is also handy. --- src/backend/render/cursor.rs | 18 ++----------- src/shell/element/stack.rs | 6 ++--- src/shell/element/window.rs | 6 ++--- src/shell/mod.rs | 7 +----- src/shell/seats.rs | 39 ++++++++++++++++++----------- src/state.rs | 32 +++-------------------- src/wayland/handlers/data_device.rs | 34 +++++++++++-------------- src/wayland/handlers/seat.rs | 15 +++-------- 8 files changed, 52 insertions(+), 105 deletions(-) diff --git a/src/backend/render/cursor.rs b/src/backend/render/cursor.rs index 745955bd..3abf7ad7 100644 --- a/src/backend/render/cursor.rs +++ b/src/backend/render/cursor.rs @@ -20,8 +20,7 @@ use smithay::{ reexports::wayland_server::protocol::wl_surface, render_elements, utils::{ - Buffer as BufferCoords, IsAlive, Logical, Monotonic, Physical, Point, Scale, Size, Time, - Transform, + Buffer as BufferCoords, Logical, Monotonic, Physical, Point, Scale, Size, Time, Transform, }, wayland::compositor::{get_role, with_states}, }; @@ -266,20 +265,7 @@ where R::TextureId: Send + Clone + 'static, { // draw the cursor as relevant - // reset the cursor if the surface is no longer alive - let cursor_status = seat - .user_data() - .get::>() - .map(|lock| { - let mut cursor_status = lock.lock().unwrap(); - if let CursorImageStatus::Surface(ref surface) = *cursor_status { - if !surface.alive() { - *cursor_status = CursorImageStatus::default_named(); - } - } - cursor_status.clone() - }) - .unwrap_or(CursorImageStatus::default_named()); + let cursor_status = seat.cursor_image_status(); let seat_userdata = seat.user_data(); let mut state_ref = seat_userdata.get::().unwrap().lock().unwrap(); diff --git a/src/shell/element/stack.rs b/src/shell/element/stack.rs index f984fdd4..3011ac46 100644 --- a/src/shell/element/stack.rs +++ b/src/shell/element/stack.rs @@ -1333,8 +1333,7 @@ impl PointerTarget for CosmicStack { .lock() .unwrap(); cursor_state.set_shape(next.cursor_shape()); - let cursor_status = seat.user_data().get::>().unwrap(); - *cursor_status.lock().unwrap() = CursorImageStatus::default_named(); + seat.set_cursor_image_status(CursorImageStatus::default_named()); }); event.location -= self.0.with_program(|p| { @@ -1363,8 +1362,7 @@ impl PointerTarget for CosmicStack { .lock() .unwrap(); cursor_state.set_shape(next.cursor_shape()); - let cursor_status = seat.user_data().get::>().unwrap(); - *cursor_status.lock().unwrap() = CursorImageStatus::default_named(); + seat.set_cursor_image_status(CursorImageStatus::default_named()); }); let active_window_geo = self.0.with_program(|p| { diff --git a/src/shell/element/window.rs b/src/shell/element/window.rs index 5080ecff..788c5d08 100644 --- a/src/shell/element/window.rs +++ b/src/shell/element/window.rs @@ -711,8 +711,7 @@ impl PointerTarget for CosmicWindow { let cursor_state = seat.user_data().get::().unwrap(); cursor_state.lock().unwrap().set_shape(next.cursor_shape()); - let cursor_status = seat.user_data().get::>().unwrap(); - *cursor_status.lock().unwrap() = CursorImageStatus::default_named(); + seat.set_cursor_image_status(CursorImageStatus::default_named()); } }); @@ -736,8 +735,7 @@ impl PointerTarget for CosmicWindow { let cursor_state = seat.user_data().get::().unwrap(); cursor_state.lock().unwrap().set_shape(next.cursor_shape()); - let cursor_status = seat.user_data().get::>().unwrap(); - *cursor_status.lock().unwrap() = CursorImageStatus::default_named(); + seat.set_cursor_image_status(CursorImageStatus::default_named()); } }); diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 4a69af2f..42dc82e5 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -1427,12 +1427,7 @@ impl Common { } let is_cursor_image = shell.seats.iter().any(|seat| { - seat.user_data() - .get::>() - .map(|guard| { - matches!(*guard.lock().unwrap(), CursorImageStatus::Surface(ref cursor_surface) if cursor_surface == surface) - }) - .unwrap_or(false) + matches!(seat.cursor_image_status(), CursorImageStatus::Surface(ref cursor_surface) if cursor_surface == surface) }); if is_cursor_image { diff --git a/src/shell/seats.rs b/src/shell/seats.rs index deeca2be..8a17b500 100644 --- a/src/shell/seats.rs +++ b/src/shell/seats.rs @@ -252,6 +252,8 @@ pub trait SeatExt { loc: impl Into>, time: Time, ) -> Option<(Rectangle, Point)>; + fn cursor_image_status(&self) -> CursorImageStatus; + fn set_cursor_image_status(&self, status: CursorImageStatus); } impl SeatExt for Seat { @@ -337,21 +339,7 @@ impl SeatExt for Seat { ) -> Option<(Rectangle, Point)> { let location = loc.into().to_i32_round(); - let cursor_status = self - .user_data() - .get::>() - .map(|lock| { - let mut cursor_status = lock.lock().unwrap(); - if let CursorImageStatus::Surface(ref surface) = *cursor_status { - if !surface.alive() { - *cursor_status = CursorImageStatus::default_named(); - } - } - cursor_status.clone() - }) - .unwrap_or(CursorImageStatus::default_named()); - - match cursor_status { + match self.cursor_image_status() { CursorImageStatus::Surface(surface) => { let hotspot = with_states(&surface, |states| { states @@ -387,4 +375,25 @@ impl SeatExt for Seat { CursorImageStatus::Hidden => None, } } + + fn cursor_image_status(&self) -> CursorImageStatus { + self.user_data() + .get::>() + // Reset the cursor if the surface is no longer alive + .map(|lock| { + let mut cursor_status = lock.lock().unwrap(); + if let CursorImageStatus::Surface(ref surface) = *cursor_status { + if !surface.alive() { + *cursor_status = CursorImageStatus::default_named(); + } + } + cursor_status.clone() + }) + .unwrap_or(CursorImageStatus::default_named()) + } + + fn set_cursor_image_status(&self, status: CursorImageStatus) { + let cursor_status = self.user_data().get::>().unwrap(); + *cursor_status.lock().unwrap() = status; + } } diff --git a/src/state.rs b/src/state.rs index 9337a902..66f9926e 100644 --- a/src/state.rs +++ b/src/state.rs @@ -70,7 +70,7 @@ use smithay::{ Client, DisplayHandle, Resource, }, }, - utils::{Clock, IsAlive, Monotonic, Point}, + utils::{Clock, Monotonic, Point}, wayland::{ alpha_modifier::AlphaModifierState, compositor::{CompositorClientState, CompositorState, SurfaceData}, @@ -118,7 +118,7 @@ use std::{ collections::HashSet, ffi::OsString, process::Child, - sync::{atomic::AtomicBool, Arc, Mutex, Once}, + sync::{atomic::AtomicBool, Arc, Once}, time::{Duration, Instant}, }; @@ -729,19 +729,7 @@ impl Common { .iter() .filter(|seat| &seat.active_output() == output) { - let cursor_status = seat - .user_data() - .get::>() - .map(|lock| { - let mut cursor_status = lock.lock().unwrap(); - if let CursorImageStatus::Surface(ref surface) = *cursor_status { - if !surface.alive() { - *cursor_status = CursorImageStatus::default_named(); - } - } - cursor_status.clone() - }) - .unwrap_or(CursorImageStatus::default_named()); + let cursor_status = seat.cursor_image_status(); // cursor ... if let CursorImageStatus::Surface(wl_surface) = cursor_status { @@ -1021,19 +1009,7 @@ impl Common { .iter() .filter(|seat| &seat.active_output() == output) { - let cursor_status = seat - .user_data() - .get::>() - .map(|lock| { - let mut cursor_status = lock.lock().unwrap(); - if let CursorImageStatus::Surface(ref surface) = *cursor_status { - if !surface.alive() { - *cursor_status = CursorImageStatus::default_named(); - } - } - cursor_status.clone() - }) - .unwrap_or(CursorImageStatus::default_named()); + let cursor_status = seat.cursor_image_status(); if let CursorImageStatus::Surface(wl_surface) = cursor_status { send_frames_surface_tree( diff --git a/src/wayland/handlers/data_device.rs b/src/wayland/handlers/data_device.rs index 672a7cb7..9007e889 100644 --- a/src/wayland/handlers/data_device.rs +++ b/src/wayland/handlers/data_device.rs @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only -use crate::state::State; +use crate::{state::State, utils::prelude::SeatExt}; use smithay::{ delegate_data_device, input::{ @@ -70,26 +70,20 @@ impl ClientDndGrabHandler for State { let user_data = seat.user_data(); user_data.insert_if_missing_threadsafe::>, _>(|| Default::default()); - let offset = seat - .user_data() - .get::>() - .map(|guard| { - if let CursorImageStatus::Surface(ref surface) = *guard.lock().unwrap() { - compositor::with_states(surface, |states| { - let hotspot = states - .data_map - .get::() - .unwrap() - .lock() - .unwrap() - .hotspot; - Point::from((-hotspot.x, -hotspot.y)) - }) - } else { - (0, 0).into() - } + let offset = if let CursorImageStatus::Surface(ref surface) = seat.cursor_image_status() { + compositor::with_states(surface, |states| { + let hotspot = states + .data_map + .get::() + .unwrap() + .lock() + .unwrap() + .hotspot; + Point::from((-hotspot.x, -hotspot.y)) }) - .unwrap_or_default(); + } else { + (0, 0).into() + }; *user_data .get::>>() diff --git a/src/wayland/handlers/seat.rs b/src/wayland/handlers/seat.rs index 60511b08..2c184dd2 100644 --- a/src/wayland/handlers/seat.rs +++ b/src/wayland/handlers/seat.rs @@ -4,12 +4,12 @@ use crate::{ shell::focus::target::{KeyboardFocusTarget, PointerFocusTarget}, shell::Devices, state::State, + utils::prelude::SeatExt, }; use smithay::{ delegate_cursor_shape, delegate_seat, input::{keyboard::LedState, pointer::CursorImageStatus, SeatHandler, SeatState}, }; -use std::sync::Mutex; impl SeatHandler for State { type KeyboardFocus = KeyboardFocusTarget; @@ -20,17 +20,8 @@ impl SeatHandler for State { &mut self.common.seat_state } - fn cursor_image( - &mut self, - seat: &smithay::input::Seat, - image: smithay::input::pointer::CursorImageStatus, - ) { - *seat - .user_data() - .get::>() - .unwrap() - .lock() - .unwrap() = image; + fn cursor_image(&mut self, seat: &smithay::input::Seat, image: CursorImageStatus) { + seat.set_cursor_image_status(image); } fn focus_changed(