From 954aa6edeb452cf61d6d4111d16b323cf7576340 Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Mon, 6 May 2024 18:02:19 +0200 Subject: [PATCH] output-management: Handle destroy requests better --- .../output_configuration/handlers/cosmic.rs | 74 +++++++++---------- .../output_configuration/handlers/wlr.rs | 66 ++++++++--------- .../protocols/output_configuration/mod.rs | 35 ++------- 3 files changed, 71 insertions(+), 104 deletions(-) diff --git a/src/wayland/protocols/output_configuration/handlers/cosmic.rs b/src/wayland/protocols/output_configuration/handlers/cosmic.rs index 04dfcb54..bbd98de9 100644 --- a/src/wayland/protocols/output_configuration/handlers/cosmic.rs +++ b/src/wayland/protocols/output_configuration/handlers/cosmic.rs @@ -35,16 +35,14 @@ where + 'static, { fn bind( - state: &mut D, + _state: &mut D, _dh: &DisplayHandle, _client: &Client, resource: New, _global_data: &OutputMngrGlobalData, data_init: &mut DataInit<'_, D>, ) { - let obj = data_init.init(resource, ()); - let mngr_state = state.output_configuration_state(); - mngr_state.extension_instances.push(obj); + data_init.init(resource, ()); } fn can_view(client: Client, global_data: &OutputMngrGlobalData) -> bool { @@ -55,7 +53,7 @@ where impl Dispatch for OutputConfigurationState where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch @@ -110,9 +108,36 @@ where extended, config_head, } => { - if let Some(pending) = config_head.data::() { - let obj = data_init.init(extended, config_head.downgrade()); - pending.lock().unwrap().extension_obj = Some(obj); + data_init.init(extended, config_head.downgrade()); + } + _ => {} + } + } +} + +impl Dispatch, D> for OutputConfigurationState +where + D: OutputConfigurationHandler + 'static, +{ + fn request( + state: &mut D, + _client: &Client, + obj: &ZcosmicOutputHeadV1, + request: zcosmic_output_head_v1::Request, + _data: &Weak, + _dh: &DisplayHandle, + _data_init: &mut DataInit<'_, D>, + ) { + match request { + zcosmic_output_head_v1::Request::Release => { + let inner = state.output_configuration_state(); + if let Some(head) = inner + .instances + .iter_mut() + .flat_map(|instance| instance.heads.iter_mut()) + .find(|head| head.extension_obj.as_ref().is_some_and(|o| o == obj)) + { + head.extension_obj.take(); } } _ => {} @@ -120,24 +145,11 @@ where } } -impl Dispatch, D> for OutputConfigurationState { - fn request( - _state: &mut D, - _client: &Client, - _obj: &ZcosmicOutputHeadV1, - _request: zcosmic_output_head_v1::Request, - _data: &Weak, - _dh: &DisplayHandle, - _data_init: &mut DataInit<'_, D>, - ) { - } -} - impl Dispatch, D> for OutputConfigurationState where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch @@ -209,22 +221,10 @@ where } } } - zcosmic_output_configuration_v1::Request::Destroy => { + zcosmic_output_configuration_v1::Request::Release => { if let Ok(obj) = obj.upgrade() { if let Some(data) = obj.data::() { - let mut pending = data.lock().unwrap(); - let _ = pending.extension_obj.take(); - pending.heads.retain(|(_, conf)| match conf { - Some(head) => { - if let Some(data) = head.data::() { - let output_conf = data.lock().unwrap(); - output_conf.mirroring.is_none() - } else { - true - } - } - None => true, - }) + data.lock().unwrap().extension_obj.take(); } } } @@ -237,7 +237,7 @@ impl Dispatch where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch diff --git a/src/wayland/protocols/output_configuration/handlers/wlr.rs b/src/wayland/protocols/output_configuration/handlers/wlr.rs index 425146b7..84800f6e 100644 --- a/src/wayland/protocols/output_configuration/handlers/wlr.rs +++ b/src/wayland/protocols/output_configuration/handlers/wlr.rs @@ -18,20 +18,14 @@ use smithay::{ }, utils::{Point, Size}, }; -use std::{ - convert::TryInto, - sync::{ - atomic::{AtomicBool, Ordering}, - Arc, - }, -}; +use std::convert::TryInto; use crate::wayland::protocols::output_configuration::*; impl GlobalDispatch for OutputConfigurationState where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch @@ -47,15 +41,9 @@ where _global_data: &OutputMngrGlobalData, data_init: &mut DataInit<'_, D>, ) { - let active = Arc::new(AtomicBool::new(true)); - let data = OutputMngrInstanceData { - active: active.clone(), - }; let mut instance = OutputMngrInstance { - obj: data_init.init(resource, data), + obj: data_init.init(resource, ()), heads: Vec::new(), - active, - stale_modes: Vec::new(), }; let mngr_state = state.output_configuration_state(); @@ -71,10 +59,10 @@ where } } -impl Dispatch for OutputConfigurationState +impl Dispatch for OutputConfigurationState where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch @@ -85,9 +73,9 @@ where fn request( state: &mut D, _client: &Client, - _obj: &ZwlrOutputManagerV1, + obj: &ZwlrOutputManagerV1, request: zwlr_output_manager_v1::Request, - data: &OutputMngrInstanceData, + _data: &(), _dh: &DisplayHandle, data_init: &mut DataInit<'_, D>, ) { @@ -109,17 +97,29 @@ where } } zwlr_output_manager_v1::Request::Stop => { - data.active.store(false, Ordering::SeqCst); + let state = state.output_configuration_state(); + state.instances.retain(|instance| instance.obj != *obj); + obj.finished(); } _ => {} } } + + fn destroyed( + state: &mut D, + _client: wayland_backend::server::ClientId, + obj: &ZwlrOutputManagerV1, + _data: &(), + ) { + let state = state.output_configuration_state(); + state.instances.retain(|instance| instance.obj != *obj); + } } impl Dispatch for OutputConfigurationState where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch @@ -156,7 +156,7 @@ where impl Dispatch for OutputConfigurationState where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch @@ -175,30 +175,22 @@ where ) { match request { zwlr_output_mode_v1::Request::Release => { - for instance in &mut state.output_configuration_state().instances { - instance.stale_modes.retain(|mode| mode != obj) + let state = state.output_configuration_state(); + for instance in &mut state.instances { + for head in &mut instance.heads { + head.modes.retain(|mode| mode != obj) + } } } _ => {} } } - - fn destroyed( - state: &mut D, - _client: wayland_backend::server::ClientId, - obj: &ZwlrOutputModeV1, - _data: &Mode, - ) { - for instance in &mut state.output_configuration_state().instances { - instance.stale_modes.retain(|mode| mode != obj) - } - } } impl Dispatch for OutputConfigurationState where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch @@ -389,7 +381,7 @@ impl Dispatch for OutputConfigurationState where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch diff --git a/src/wayland/protocols/output_configuration/mod.rs b/src/wayland/protocols/output_configuration/mod.rs index 4961181d..e575a126 100644 --- a/src/wayland/protocols/output_configuration/mod.rs +++ b/src/wayland/protocols/output_configuration/mod.rs @@ -13,7 +13,7 @@ use smithay::{ zwlr_output_configuration_v1::ZwlrOutputConfigurationV1, zwlr_output_head_v1::{self, ZwlrOutputHeadV1}, zwlr_output_manager_v1::ZwlrOutputManagerV1, - zwlr_output_mode_v1::{self, ZwlrOutputModeV1}, + zwlr_output_mode_v1::ZwlrOutputModeV1, }, wayland_server::{ backend::GlobalId, protocol::wl_output::WlOutput, Client, Dispatch, DisplayHandle, @@ -23,13 +23,7 @@ use smithay::{ utils::{Logical, Physical, Point, Size, Transform}, wayland::output::WlOutputData, }; -use std::{ - convert::TryFrom, - sync::{ - atomic::{AtomicBool, Ordering}, - Arc, Mutex, - }, -}; +use std::{convert::TryFrom, sync::Mutex}; mod handlers; @@ -38,7 +32,6 @@ pub struct OutputConfigurationState { outputs: Vec, removed_outputs: Vec, instances: Vec, - extension_instances: Vec, serial_counter: u32, global: GlobalId, extension_global: GlobalId, @@ -60,9 +53,7 @@ pub struct OutputMngrGlobalData { #[derive(Debug)] struct OutputMngrInstance { obj: ZwlrOutputManagerV1, - active: Arc, heads: Vec, - stale_modes: Vec, } #[derive(Debug)] @@ -74,10 +65,6 @@ struct OutputHeadInstance { finished: bool, } -pub struct OutputMngrInstanceData { - active: Arc, -} - #[derive(Debug, Default)] pub struct PendingConfigurationInner { extension_obj: Option, @@ -99,7 +86,6 @@ pub enum ModeConfiguration { #[derive(Debug, Default, Clone)] pub struct PendingOutputConfigurationInner { - extension_obj: Option, mirroring: Option, mode: Option>, position: Option>, @@ -160,7 +146,7 @@ impl OutputConfigurationState where D: GlobalDispatch + GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch @@ -195,7 +181,6 @@ where outputs: Vec::new(), removed_outputs: Vec::new(), instances: Vec::new(), - extension_instances: Vec::new(), serial_counter: 0, global, extension_global, @@ -260,7 +245,6 @@ where } pub fn update(&mut self) { - self.instances.retain(|x| x.active.load(Ordering::SeqCst)); self.serial_counter += 1; for output in std::mem::take(&mut self.removed_outputs).into_iter() { @@ -273,11 +257,6 @@ where } for mode in &mut head.modes { mode.finished(); - if mode.version() < zwlr_output_mode_v1::REQ_RELEASE_SINCE { - // on >=v3 we keep the obj around until we get a release-request - // otherwise we will drop this with the head - instance.stale_modes.push(mode.clone()); - } } head.obj.finished(); head.finished = true; @@ -316,7 +295,7 @@ where fn send_head_to_client(dh: &DisplayHandle, mngr: &mut OutputMngrInstance, output: &Output) where D: GlobalDispatch - + Dispatch + + Dispatch + Dispatch + Dispatch + Dispatch @@ -375,10 +354,6 @@ where instance.modes.retain_mut(|m| { if !output_modes.contains(m.data::().unwrap()) { m.finished(); - if m.version() < zwlr_output_mode_v1::REQ_RELEASE_SINCE { - // on >=v3 we keep the obj around until we get a release-request - mngr.stale_modes.push(m.clone()); - } false } else { true @@ -474,7 +449,7 @@ macro_rules! delegate_output_configuration { smithay::reexports::wayland_protocols_wlr::output_management::v1::server::zwlr_output_manager_v1::ZwlrOutputManagerV1: $crate::wayland::protocols::output_configuration::OutputMngrGlobalData ] => $crate::wayland::protocols::output_configuration::OutputConfigurationState); smithay::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [ - smithay::reexports::wayland_protocols_wlr::output_management::v1::server::zwlr_output_manager_v1::ZwlrOutputManagerV1: $crate::wayland::protocols::output_configuration::OutputMngrInstanceData + smithay::reexports::wayland_protocols_wlr::output_management::v1::server::zwlr_output_manager_v1::ZwlrOutputManagerV1: () ] => $crate::wayland::protocols::output_configuration::OutputConfigurationState); smithay::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [ smithay::reexports::wayland_protocols_wlr::output_management::v1::server::zwlr_output_head_v1::ZwlrOutputHeadV1: smithay::output::Output