diff --git a/src/ifs/wl_surface.rs b/src/ifs/wl_surface.rs index ba52ea2e..fb33481e 100644 --- a/src/ifs/wl_surface.rs +++ b/src/ifs/wl_surface.rs @@ -49,6 +49,8 @@ use { thiserror::Error, zwp_idle_inhibitor_v1::ZwpIdleInhibitorV1, }; +use crate::utils::copyhashmap::CopyHashMap; +use crate::wire::ZwpIdleInhibitorV1Id; #[allow(dead_code)] const INVALID_SCALE: u32 = 0; @@ -105,7 +107,7 @@ pub struct WlSurface { cursors: SmallMap, 1>, pub dnd_icons: SmallMap, 1>, pub tracker: Tracker, - idle_inhibitor: CloneCell>>, + idle_inhibitors: CopyHashMap>, } impl Debug for WlSurface { @@ -222,7 +224,7 @@ impl WlSurface { cursors: Default::default(), dnd_icons: Default::default(), tracker: Default::default(), - idle_inhibitor: Default::default(), + idle_inhibitors: Default::default(), } } @@ -389,7 +391,7 @@ impl WlSurface { self.frame_requests.borrow_mut().clear(); self.toplevel.set(None); self.client.remove_obj(self)?; - self.idle_inhibitor.take(); + self.idle_inhibitors.clear(); Ok(()) } @@ -627,7 +629,7 @@ impl Object for WlSurface { mem::take(self.frame_requests.borrow_mut().deref_mut()); self.buffer.set(None); self.toplevel.set(None); - self.idle_inhibitor.take(); + self.idle_inhibitors.clear(); } } @@ -644,7 +646,7 @@ impl SizedNode for WlSurface { } fn destroy_node(&self, _detach: bool) { - if let Some(inhibitor) = self.idle_inhibitor.get() { + for (_, inhibitor) in self.idle_inhibitors.lock().drain() { inhibitor.deactivate(); } let children = self.children.borrow(); @@ -691,7 +693,7 @@ impl SizedNode for WlSurface { fn set_visible(&self, visible: bool) { self.visible.set(visible); - if let Some(inhibitor) = self.idle_inhibitor.get() { + for inhibitor in self.idle_inhibitors.lock().values() { if visible { inhibitor.activate(); } else { diff --git a/src/ifs/wl_surface/zwp_idle_inhibitor_v1.rs b/src/ifs/wl_surface/zwp_idle_inhibitor_v1.rs index af8e6e18..45c177cb 100644 --- a/src/ifs/wl_surface/zwp_idle_inhibitor_v1.rs +++ b/src/ifs/wl_surface/zwp_idle_inhibitor_v1.rs @@ -25,17 +25,14 @@ impl ZwpIdleInhibitorV1 { fn destroy(&self, parser: MsgParser<'_, '_>) -> Result<(), ZwpIdleInhibitorV1Error> { let _req: Destroy = self.client.parse(self, parser)?; self.client.remove_obj(self)?; - if self.surface.idle_inhibitor.take().is_some() { + if self.surface.idle_inhibitors.remove(&self.id).is_some() { self.deactivate(); } Ok(()) } pub fn install(self: &Rc) -> Result<(), ZwpIdleInhibitorV1Error> { - if self.surface.idle_inhibitor.get().is_some() { - return Err(ZwpIdleInhibitorV1Error::MultipleInhibitors(self.surface.id)); - } - self.surface.idle_inhibitor.set(Some(self.clone())); + self.surface.idle_inhibitors.set(self.id, self.clone()); if self.surface.visible.get() { self.activate(); } @@ -75,8 +72,6 @@ pub enum ZwpIdleInhibitorV1Error { MsgParserError(#[source] Box), #[error(transparent)] ClientError(Box), - #[error("The surface {0} already has an inhibitor attached")] - MultipleInhibitors(WlSurfaceId), } efrom!(ZwpIdleInhibitorV1Error, ClientError); efrom!(ZwpIdleInhibitorV1Error, MsgParserError);