seat: Make render-related state thread-safe

This commit is contained in:
Victoria Brekenfeld 2024-06-07 19:26:23 +02:00 committed by Victoria Brekenfeld
parent bd58481d19
commit c7d50e7c5b
11 changed files with 137 additions and 112 deletions

View file

@ -1,9 +1,6 @@
use std::{
cell::RefCell,
sync::{
atomic::{AtomicBool, Ordering},
Arc, Mutex,
},
use std::sync::{
atomic::{AtomicBool, Ordering},
Arc, Mutex,
};
use calloop::LoopHandle;
@ -57,7 +54,7 @@ pub use self::default::*;
pub struct MenuGrabState {
elements: Arc<Mutex<Vec<Element>>>,
}
pub type SeatMenuGrabState = RefCell<Option<MenuGrabState>>;
pub type SeatMenuGrabState = Mutex<Option<MenuGrabState>>;
impl MenuGrabState {
pub fn render<I, R>(&self, renderer: &mut R, output: &Output) -> Vec<I>
@ -228,7 +225,8 @@ impl Program for ContextMenu {
.user_data()
.get::<SeatMenuGrabState>()
.unwrap()
.borrow_mut();
.lock()
.unwrap();
if let Some(grab_state) = &*grab_state {
let mut elements = grab_state.elements.lock().unwrap();
@ -320,7 +318,8 @@ impl Program for ContextMenu {
.user_data()
.get::<SeatMenuGrabState>()
.unwrap()
.borrow_mut();
.lock()
.unwrap();
if let Some(grab_state) = &*grab_state {
let mut elements = grab_state.elements.lock().unwrap();
@ -713,7 +712,8 @@ impl MenuGrab {
.user_data()
.get::<SeatMenuGrabState>()
.unwrap()
.borrow_mut() = Some(grab_state);
.lock()
.unwrap() = Some(grab_state);
MenuGrab {
elements,
@ -729,7 +729,8 @@ impl Drop for MenuGrab {
.user_data()
.get::<SeatMenuGrabState>()
.unwrap()
.borrow_mut()
.lock()
.unwrap()
.take();
}
}

View file

@ -44,11 +44,15 @@ use smithay::{
output::Output,
utils::{IsAlive, Logical, Point, Rectangle, Scale, Serial, SERIAL_COUNTER},
};
use std::{cell::RefCell, collections::HashSet, sync::atomic::Ordering, time::Instant};
use std::{
collections::HashSet,
sync::{atomic::Ordering, Mutex},
time::Instant,
};
use super::{GrabStartData, ReleaseMode};
pub type SeatMoveGrabState = RefCell<Option<MoveGrabState>>;
pub type SeatMoveGrabState = Mutex<Option<MoveGrabState>>;
const RESCALE_ANIMATION_DURATION: f64 = 150.0;
@ -363,7 +367,7 @@ impl MoveGrab {
.seat
.user_data()
.get::<SeatMoveGrabState>()
.map(|s| s.borrow_mut());
.map(|s| s.lock().unwrap());
if let Some(grab_state) = borrow.as_mut().and_then(|s| s.as_mut()) {
grab_state.location = location;
grab_state.cursor_output = self.cursor_output.clone();
@ -698,11 +702,12 @@ impl MoveGrab {
.user_data()
.get::<SeatMoveGrabState>()
.unwrap()
.borrow_mut() = Some(grab_state);
.lock()
.unwrap() = Some(grab_state);
{
let cursor_state = seat.user_data().get::<CursorState>().unwrap();
cursor_state.set_shape(CursorShape::Grab);
cursor_state.lock().unwrap().set_shape(CursorShape::Grab);
}
MoveGrab {
@ -743,7 +748,7 @@ impl Drop for MoveGrab {
let position: Option<(CosmicMapped, Point<i32, Global>)> = if let Some(grab_state) =
seat.user_data()
.get::<SeatMoveGrabState>()
.and_then(|s| s.borrow_mut().take())
.and_then(|s| s.lock().unwrap().take())
{
if grab_state.window.alive() {
let window_location =
@ -842,7 +847,7 @@ impl Drop for MoveGrab {
{
let cursor_state = seat.user_data().get::<CursorState>().unwrap();
cursor_state.set_shape(CursorShape::Default);
cursor_state.lock().unwrap().set_shape(CursorShape::Default);
}
if let Some((mapped, position)) = position {