diff options
| author | MaxVerevkin <maxxverrr@gmail.com> | 2022-12-10 17:46:48 +0200 |
|---|---|---|
| committer | MaxVerevkin <maxxverrr@gmail.com> | 2022-12-10 17:46:48 +0200 |
| commit | 2570f39b5daf6e2a13b3973d47aa7c67fbb457fb (patch) | |
| tree | e330dee89380a94635113c1312a9dcbb0d9e5883 /src/river_protocols | |
| parent | f6727acdd4cc112c51d3dd71df61689738e31de9 (diff) | |
| download | i3bar-mango-2570f39b5daf6e2a13b3973d47aa7c67fbb457fb.tar.gz | |
refactor
Diffstat (limited to 'src/river_protocols')
| -rw-r--r-- | src/river_protocols/status.rs | 135 |
1 files changed, 35 insertions, 100 deletions
diff --git a/src/river_protocols/status.rs b/src/river_protocols/status.rs index 4424c58..ad93279 100644 --- a/src/river_protocols/status.rs +++ b/src/river_protocols/status.rs @@ -1,5 +1,3 @@ -use std::sync::{Arc, Weak}; - use wayland_client::{ globals::{BindError, GlobalList}, protocol::wl_output, @@ -11,7 +9,6 @@ use protocol::{zriver_output_status_v1, zriver_status_manager_v1}; #[derive(Debug, Clone)] pub struct RiverStatusState { status_manager: zriver_status_manager_v1::ZriverStatusManagerV1, - output_statuses: Vec<Weak<OutputStatusInner>>, } impl RiverStatusState { @@ -19,22 +16,8 @@ impl RiverStatusState { where D: Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, (), D> + 'static, { - let status_manager = globals.bind(qh, 1..=3, ())?; - Ok(Self { - status_manager, - output_statuses: Vec::new(), - }) - } - - pub fn get_output_status( - &self, - status: &zriver_output_status_v1::ZriverOutputStatusV1, - ) -> Option<RiverOutputStatus> { - self.output_statuses - .iter() - .filter_map(Weak::upgrade) - .find(|inner| &inner.status == status) - .map(RiverOutputStatus) + let status_manager = globals.bind(qh, 1..=4, ())?; + Ok(Self { status_manager }) } #[must_use = "The output status is destroyed if dropped"] @@ -48,70 +31,37 @@ impl RiverStatusState { + Dispatch<zriver_output_status_v1::ZriverOutputStatusV1, RiverStatusData> + 'static, { - let output_status = - self.status_manager - .get_river_output_status(output, qh, RiverStatusData {}); - - let output_status = RiverOutputStatus(Arc::new(OutputStatusInner { - status: output_status, - })); - - self.output_statuses.push(Arc::downgrade(&output_status.0)); - - output_status + RiverOutputStatus(self.status_manager.get_river_output_status( + output, + qh, + RiverStatusData { + output: output.clone(), + }, + )) } } pub trait RiverStatusHandler: Sized { fn river_status_state(&mut self) -> &mut RiverStatusState; - fn focused_tags_updated( - &mut self, - conn: &Connection, - qh: &QueueHandle<Self>, - output_status: &RiverOutputStatus, - focused: u32, - ); + fn focused_tags_updated(&mut self, output: &wl_output::WlOutput, focused: u32); - fn urgent_tags_updated( - &mut self, - conn: &Connection, - qh: &QueueHandle<Self>, - output_status: &RiverOutputStatus, - urgent: u32, - ); + fn urgent_tags_updated(&mut self, output: &wl_output::WlOutput, urgent: u32); - fn views_tags_updated( - &mut self, - conn: &Connection, - qh: &QueueHandle<Self>, - output_status: &RiverOutputStatus, - tags: Vec<u32>, - ); + fn views_tags_updated(&mut self, output: &wl_output::WlOutput, tags: Vec<u32>); - fn layout_name_updated( - &mut self, - conn: &Connection, - qh: &QueueHandle<Self>, - output_status: &RiverOutputStatus, - layout_name: Option<String>, - ); + fn layout_name_updated(&mut self, output: &wl_output::WlOutput, layout_name: Option<String>); } -#[derive(Debug, Clone)] -pub struct RiverOutputStatus(Arc<OutputStatusInner>); +#[derive(Debug)] +pub struct RiverOutputStatus(zriver_output_status_v1::ZriverOutputStatusV1); -impl PartialEq for RiverOutputStatus { - fn eq(&self, other: &Self) -> bool { - Arc::ptr_eq(&self.0, &other.0) +impl Drop for RiverOutputStatus { + fn drop(&mut self) { + self.0.destroy(); } } -#[derive(Debug)] -pub struct RiverStatusData { - // This is empty right now, but may be populated in the future. -} - #[macro_export] macro_rules! delegate_river_status { ($ty: ty) => { @@ -125,14 +75,8 @@ macro_rules! delegate_river_status { } #[derive(Debug)] -struct OutputStatusInner { - status: zriver_output_status_v1::ZriverOutputStatusV1, -} - -impl Drop for OutputStatusInner { - fn drop(&mut self) { - self.status.destroy(); - } +pub struct RiverStatusData { + output: wl_output::WlOutput, } impl<D> Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, (), D> for RiverStatusState @@ -160,35 +104,26 @@ where { fn event( data: &mut D, - status: &zriver_output_status_v1::ZriverOutputStatusV1, + _: &zriver_output_status_v1::ZriverOutputStatusV1, event: zriver_output_status_v1::Event, - _udata: &RiverStatusData, - conn: &Connection, - qh: &QueueHandle<D>, + udata: &RiverStatusData, + _: &Connection, + _: &QueueHandle<D>, ) { use zriver_output_status_v1::Event; - // Remove any statuses that have been dropped - data.river_status_state() - .output_statuses - .retain(|status| status.upgrade().is_some()); - - if let Some(status) = data.river_status_state().get_output_status(status) { - match event { - Event::FocusedTags { tags } => data.focused_tags_updated(conn, qh, &status, tags), - Event::UrgentTags { tags } => data.urgent_tags_updated(conn, qh, &status, tags), - Event::ViewTags { tags } => { - let tags = tags - .chunks_exact(4) - .map(|bytes| u32::from_ne_bytes(bytes.try_into().unwrap())) - .collect(); - data.views_tags_updated(conn, qh, &status, tags); - } - Event::LayoutName { name } => { - data.layout_name_updated(conn, qh, &status, Some(name)) - } - Event::LayoutNameClear => data.layout_name_updated(conn, qh, &status, None), + match event { + Event::FocusedTags { tags } => data.focused_tags_updated(&udata.output, tags), + Event::UrgentTags { tags } => data.urgent_tags_updated(&udata.output, tags), + Event::ViewTags { tags } => { + let tags = tags + .chunks_exact(4) + .map(|bytes| u32::from_ne_bytes(bytes.try_into().unwrap())) + .collect(); + data.views_tags_updated(&udata.output, tags); } + Event::LayoutName { name } => data.layout_name_updated(&udata.output, Some(name)), + Event::LayoutNameClear => data.layout_name_updated(&udata.output, None), } } } |
