shell: Using parking_lot's RwLock for fairness guarantees

This commit is contained in:
Victoria Brekenfeld 2025-05-20 17:41:27 +02:00 committed by Victoria Brekenfeld
parent 8194be30c6
commit 465813c1c5
42 changed files with 247 additions and 396 deletions

View file

@ -695,7 +695,7 @@ impl CosmicStack {
surface.send_configure();
if let Some(surface) = surface.wl_surface().map(Cow::into_owned) {
let _ = data.common.event_loop_handle.insert_idle(move |state| {
let res = state.common.shell.write().unwrap().move_request(
let res = state.common.shell.write().move_request(
&surface,
&seat,
serial,
@ -837,7 +837,7 @@ impl Program for CosmicStackInternal {
.map(Cow::into_owned)
{
loop_handle.insert_idle(move |state| {
let res = state.common.shell.write().unwrap().move_request(
let res = state.common.shell.write().move_request(
&surface,
&seat,
serial,
@ -867,12 +867,8 @@ impl Program for CosmicStackInternal {
*self.potential_drag.lock().unwrap() = None;
if let Some(surface) = self.windows.lock().unwrap().get(idx).cloned() {
loop_handle.insert_idle(move |state| {
if let Some(mapped) = state
.common
.shell
.read()
.unwrap()
.element_for_surface(&surface)
if let Some(mapped) =
state.common.shell.read().element_for_surface(&surface)
{
mapped.stack_ref().unwrap().set_active(&surface);
}
@ -896,7 +892,7 @@ impl Program for CosmicStackInternal {
.map(Cow::into_owned)
{
loop_handle.insert_idle(move |state| {
let shell = state.common.shell.read().unwrap();
let shell = state.common.shell.read();
if let Some(mapped) = shell.element_for_surface(&surface).cloned() {
let position = if let Some((output, set)) =
shell.workspaces.sets.iter().find(|(_, set)| {
@ -950,7 +946,7 @@ impl Program for CosmicStackInternal {
.map(Cow::into_owned)
{
loop_handle.insert_idle(move |state| {
let shell = state.common.shell.read().unwrap();
let shell = state.common.shell.read();
if let Some(mapped) = shell.element_for_surface(&surface).cloned() {
if let Some(workspace) = shell.space_for(&mapped) {
let Some(elem_geo) = workspace.element_geometry(&mapped) else {
@ -1407,7 +1403,7 @@ impl PointerTarget<State> for CosmicStack {
return;
};
self.0.loop_handle().insert_idle(move |state| {
let res = state.common.shell.write().unwrap().resize_request(
let res = state.common.shell.write().resize_request(
&surface,
&seat,
serial,
@ -1481,7 +1477,7 @@ impl PointerTarget<State> for CosmicStack {
surface.send_configure();
if let Some(surface) = surface.wl_surface().map(Cow::into_owned) {
let _ = data.common.event_loop_handle.insert_idle(move |state| {
let res = state.common.shell.write().unwrap().move_request(
let res = state.common.shell.write().move_request(
&surface,
&seat,
serial,

View file

@ -441,7 +441,7 @@ impl Program for CosmicWindowInternal {
if let Some((seat, serial)) = last_seat.cloned() {
if let Some(surface) = self.window.wl_surface().map(Cow::into_owned) {
loop_handle.insert_idle(move |state| {
let res = state.common.shell.write().unwrap().move_request(
let res = state.common.shell.write().move_request(
&surface,
&seat,
serial,
@ -467,7 +467,7 @@ impl Program for CosmicWindowInternal {
Message::Minimize => {
if let Some(surface) = self.window.wl_surface().map(Cow::into_owned) {
loop_handle.insert_idle(move |state| {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
if let Some(mapped) = shell.element_for_surface(&surface).cloned() {
shell.minimize_request(&mapped)
}
@ -477,7 +477,7 @@ impl Program for CosmicWindowInternal {
Message::Maximize => {
if let Some(surface) = self.window.wl_surface().map(Cow::into_owned) {
loop_handle.insert_idle(move |state| {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
if let Some(mapped) = shell.element_for_surface(&surface).cloned() {
let seat = shell.seats.last_active().clone();
shell.maximize_toggle(&mapped, &seat)
@ -490,7 +490,7 @@ impl Program for CosmicWindowInternal {
if let Some((seat, serial)) = last_seat.cloned() {
if let Some(surface) = self.window.wl_surface().map(Cow::into_owned) {
loop_handle.insert_idle(move |state| {
let shell = state.common.shell.read().unwrap();
let shell = state.common.shell.read();
if let Some(mapped) = shell.element_for_surface(&surface).cloned() {
let position = if let Some((output, set)) =
shell.workspaces.sets.iter().find(|(_, set)| {
@ -763,7 +763,7 @@ impl PointerTarget<State> for CosmicWindow {
return;
};
self.0.loop_handle().insert_idle(move |state| {
let res = state.common.shell.write().unwrap().resize_request(
let res = state.common.shell.write().resize_request(
&surface,
&seat,
serial,

View file

@ -112,7 +112,6 @@ impl Shell {
.common
.shell
.read()
.unwrap()
.element_for_surface(window)
.cloned(),
_ => None,
@ -123,17 +122,12 @@ impl Shell {
return;
}
state
.common
.shell
.write()
.unwrap()
.append_focus_stack(&mapped, seat);
state.common.shell.write().append_focus_stack(&mapped, seat);
}
update_focus_state(seat, target, state, serial, update_cursor);
state.common.shell.write().unwrap().update_active();
state.common.shell.write().update_active();
}
pub fn append_focus_stack(&mut self, mapped: &CosmicMapped, seat: &Seat<State>) {
@ -242,7 +236,7 @@ fn update_focus_state(
if should_update_cursor && state.common.config.cosmic_conf.cursor_follows_focus {
if target.is_some() {
//need to borrow mutably for surface under
let shell = state.common.shell.read().unwrap();
let shell = state.common.shell.read();
// get the top left corner of the target element
let geometry = shell.focused_geometry(target.unwrap());
if let Some(geometry) = geometry {
@ -292,7 +286,6 @@ fn update_focus_state(
.common
.shell
.read()
.unwrap()
.get_output_for_focus(seat)
.as_ref(),
)
@ -339,14 +332,13 @@ impl Common {
.common
.shell
.read()
.unwrap()
.seats
.iter()
.cloned()
.collect::<Vec<_>>();
for seat in &seats {
{
let shell = state.common.shell.read().unwrap();
let shell = state.common.shell.read();
let focused_output = seat.focused_output();
let active_output = seat.active_output();
@ -365,7 +357,7 @@ impl Common {
update_pointer_focus(state, &seat);
let output = seat.focused_or_active_output();
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let last_known_focus = ActiveFocus::get(&seat);
if let Some(target) = last_known_focus {
@ -454,7 +446,7 @@ impl Common {
}
}
state.common.shell.write().unwrap().update_active()
state.common.shell.write().update_active()
}
}
@ -582,7 +574,7 @@ fn update_pointer_focus(state: &mut State, seat: &Seat<State>) {
let output = seat.active_output();
let position = pointer.current_location().as_global();
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let under = State::surface_under(position, &output, &mut shell)
.map(|(target, pos)| (target, pos.as_logical()));
drop(shell);

View file

@ -240,7 +240,7 @@ impl IsAlive for KeyboardFocusTarget {
impl PointerTarget<State> for PointerFocusTarget {
fn enter(&self, seat: &Seat<State>, data: &mut State, event: &PointerMotionEvent) {
let toplevel = self.toplevel(&*data.common.shell.read().unwrap());
let toplevel = self.toplevel(&*data.common.shell.read());
if let Some(element) = toplevel {
for session in element.cursor_sessions() {
session.set_cursor_pos(Some(
@ -270,7 +270,7 @@ impl PointerTarget<State> for PointerFocusTarget {
}
}
fn motion(&self, seat: &Seat<State>, data: &mut State, event: &PointerMotionEvent) {
let toplevel = self.toplevel(&*data.common.shell.read().unwrap());
let toplevel = self.toplevel(&*data.common.shell.read());
if let Some(element) = toplevel {
for session in element.cursor_sessions() {
session.set_cursor_pos(Some(
@ -346,7 +346,7 @@ impl PointerTarget<State> for PointerFocusTarget {
}
}
fn leave(&self, seat: &Seat<State>, data: &mut State, serial: Serial, time: u32) {
let toplevel = self.toplevel(&*data.common.shell.read().unwrap());
let toplevel = self.toplevel(&*data.common.shell.read());
if let Some(element) = toplevel {
for session in element.cursor_sessions() {
session.set_cursor_pos(None);

View file

@ -16,7 +16,7 @@ use crate::{
use super::{Item, ResizeEdge};
fn toggle_stacking(state: &mut State, mapped: &CosmicMapped) {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
if let Some(new_focus) = shell.toggle_stacking(&seat, mapped) {
std::mem::drop(shell);
@ -25,7 +25,7 @@ fn toggle_stacking(state: &mut State, mapped: &CosmicMapped) {
}
fn move_prev_workspace(state: &mut State, mapped: &CosmicMapped) {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
let (current_handle, output) = {
let Some(ws) = shell.space_for(mapped) else {
@ -58,7 +58,7 @@ fn move_prev_workspace(state: &mut State, mapped: &CosmicMapped) {
}
fn move_next_workspace(state: &mut State, mapped: &CosmicMapped) {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
let (current_handle, output) = {
let Some(ws) = shell.space_for(mapped) else {
@ -114,7 +114,7 @@ pub fn tab_items(
)
.into();
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
let output = seat.active_output();
let workspace = shell.workspaces.active_mut(&output).unwrap();
@ -198,12 +198,7 @@ pub fn window_items(
Item::new(fl!("window-menu-minimize"), move |handle| {
let mapped = minimize_clone.clone();
let _ = handle.insert_idle(move |state| {
state
.common
.shell
.write()
.unwrap()
.minimize_request(&mapped);
state.common.shell.write().minimize_request(&mapped);
});
})
.shortcut(config.shortcut_for_action(&Action::Minimize)),
@ -212,7 +207,7 @@ pub fn window_items(
Item::new(fl!("window-menu-maximize"), move |handle| {
let mapped = maximize_clone.clone();
let _ = handle.insert_idle(move |state| {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
shell.maximize_toggle(&mapped, &seat);
});
@ -224,7 +219,7 @@ pub fn window_items(
Item::new(fl!("window-menu-tiled"), move |handle| {
let tile_clone = tile_clone.clone();
let _ = handle.insert_idle(move |state| {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
if let Some(ws) = shell.space_for_mut(&tile_clone) {
ws.toggle_floating_window(&seat, &tile_clone);
@ -246,7 +241,7 @@ pub fn window_items(
let move_clone = move_clone.clone();
let _ = handle.insert_idle(move |state| {
if let Some(surface) = move_clone.wl_surface() {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
let res = shell.move_request(
&surface,
@ -285,7 +280,7 @@ pub fn window_items(
Item::new(fl!("window-menu-resize-edge-top"), move |handle| {
let resize_clone = resize_top_clone.clone();
let _ = handle.insert_idle(move |state| {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
let res = shell.menu_resize_request(
&resize_clone,
@ -320,7 +315,7 @@ pub fn window_items(
Item::new(fl!("window-menu-resize-edge-left"), move |handle| {
let resize_clone = resize_left_clone.clone();
let _ = handle.insert_idle(move |state| {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
let res = shell.menu_resize_request(
&resize_clone,
@ -355,7 +350,7 @@ pub fn window_items(
Item::new(fl!("window-menu-resize-edge-right"), move |handle| {
let resize_clone = resize_right_clone.clone();
let _ = handle.insert_idle(move |state| {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
let res = shell.menu_resize_request(
&resize_clone,
@ -390,7 +385,7 @@ pub fn window_items(
Item::new(fl!("window-menu-resize-edge-bottom"), move |handle| {
let resize_clone = resize_bottom_clone.clone();
let _ = handle.insert_idle(move |state| {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
let res = shell.menu_resize_request(
&resize_clone,
@ -445,7 +440,7 @@ pub fn window_items(
Item::new(fl!("window-menu-sticky"), move |handle| {
let mapped = sticky_clone.clone();
let _ = handle.insert_idle(move |state| {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let seat = shell.seats.last_active().clone();
shell.toggle_sticky(&seat, &mapped);
});

View file

@ -522,7 +522,7 @@ impl PointerGrab<State> for MenuGrab {
let mut guard = self.elements.lock().unwrap();
let elements = &mut *guard;
let event_location = if let Some(output) = self.screen_space_relative.as_ref() {
if state.common.shell.read().unwrap().zoom_state().is_some() {
if state.common.shell.read().zoom_state().is_some() {
event
.location
.as_global()
@ -726,7 +726,7 @@ impl TouchGrab<State> for MenuGrab {
let mut guard = self.elements.lock().unwrap();
let elements = &mut *guard;
let event_location = if let Some(output) = self.screen_space_relative.as_ref() {
if data.common.shell.read().unwrap().zoom_state().is_some() {
if data.common.shell.read().zoom_state().is_some() {
event
.location
.as_global()

View file

@ -347,7 +347,7 @@ pub struct MoveGrab {
impl MoveGrab {
fn update_location(&mut self, state: &mut State, location: Point<f64, Logical>) {
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let Some(current_output) = shell
.outputs()
@ -792,7 +792,7 @@ impl Drop for MoveGrab {
if grab_state.window.alive() {
let window_location =
(grab_state.location.to_i32_round() + grab_state.window_offset).as_global();
let mut shell = state.common.shell.write().unwrap();
let mut shell = state.common.shell.write();
let workspace_handle = shell.active_space(&output).unwrap().handle;
for old_output in window_outputs.iter().filter(|o| *o != &output) {

View file

@ -227,7 +227,7 @@ impl ResizeForkGrab {
self.last_loc = location.as_global();
if let Some(output) = self.output.upgrade() {
let mut shell = data.common.shell.write().unwrap();
let mut shell = data.common.shell.write();
let Some(workspace) = shell.active_space_mut(&output) else {
return false;
};

View file

@ -39,7 +39,7 @@ impl KeyboardGrab<State> for SwapWindowGrab {
serial: Serial,
time: u32,
) {
if !matches!(&data.common.shell.read().unwrap().overview_mode.active_trigger(), Some(Trigger::KeyboardSwap(_, d)) if d == &self.desc)
if !matches!(&data.common.shell.read().overview_mode.active_trigger(), Some(Trigger::KeyboardSwap(_, d)) if d == &self.desc)
{
handle.unset_grab(self, data, serial, false);
return;

View file

@ -1309,7 +1309,7 @@ pub struct InvalidWorkspaceIndex;
impl Common {
pub fn add_output(&mut self, output: &Output) {
let mut shell = self.shell.write().unwrap();
let mut shell = self.shell.write();
shell
.workspaces
.add_output(output, &mut self.workspace_state.update());
@ -1333,7 +1333,7 @@ impl Common {
}
pub fn remove_output(&mut self, output: &Output) {
let mut shell = self.shell.write().unwrap();
let mut shell = self.shell.write();
let shell_ref = &mut *shell;
shell_ref.workspaces.remove_output(
output,
@ -1351,7 +1351,7 @@ impl Common {
return;
}
let mut shell = self.shell.write().unwrap();
let mut shell = self.shell.write();
shell
.workspaces
.migrate_workspace(from, to, handle, &mut self.workspace_state.update());
@ -1360,7 +1360,7 @@ impl Common {
}
pub fn update_config(&mut self) {
let mut shell = self.shell.write().unwrap();
let mut shell = self.shell.write();
let shell_ref = &mut *shell;
shell_ref.active_hint = self.config.cosmic_conf.active_hint;
if let Some(zoom_state) = shell_ref.zoom_state.as_mut() {
@ -1388,7 +1388,7 @@ impl Common {
pub fn refresh(&mut self) {
self.xdg_activation_state
.retain_tokens(|_, data| data.timestamp.elapsed() < ACTIVATION_TOKEN_EXPIRE_TIME);
self.shell.write().unwrap().refresh(
self.shell.write().refresh(
&self.xdg_activation_state,
&mut self.workspace_state.update(),
);
@ -1410,7 +1410,7 @@ impl Common {
pub fn on_commit(&mut self, surface: &WlSurface) {
{
let shell = self.shell.read().unwrap();
let shell = self.shell.read();
for seat in shell.seats.iter() {
if let Some(move_grab) = seat.user_data().get::<SeatMoveGrabState>() {

View file

@ -539,14 +539,7 @@ impl Program for ZoomProgram {
match message {
ZoomMessage::Decrease => {
let _ = loop_handle.insert_idle(|state| {
let seat = state
.common
.shell
.read()
.unwrap()
.seats
.last_active()
.clone();
let seat = state.common.shell.read().seats.last_active().clone();
let increment =
state.common.config.cosmic_conf.accessibility_zoom.increment as f64 / 100.0;
@ -555,14 +548,7 @@ impl Program for ZoomProgram {
}
ZoomMessage::Increase => {
let _ = loop_handle.insert_idle(|state| {
let seat = state
.common
.shell
.read()
.unwrap()
.seats
.last_active()
.clone();
let seat = state.common.shell.read().seats.last_active().clone();
let increment =
state.common.config.cosmic_conf.accessibility_zoom.increment as f64 / 100.0;
@ -576,7 +562,7 @@ impl Program for ZoomProgram {
if let Some(start_data) =
check_grab_preconditions(&seat, Some(serial), None)
{
let shell = state.common.shell.read().unwrap();
let shell = state.common.shell.read();
let output = seat.active_output();
if shell.zoom_state().is_some() {
@ -741,7 +727,7 @@ impl Program for ZoomProgram {
if let Some(start_data) =
check_grab_preconditions(&seat, Some(serial), None)
{
let shell = state.common.shell.read().unwrap();
let shell = state.common.shell.read();
let output = seat.active_output();
if shell.zoom_state().is_some() {