summaryrefslogtreecommitdiff
path: root/src/river_protocols/status.rs
diff options
context:
space:
mode:
authorMaxVerevkin <maxxverrr@gmail.com>2022-12-10 17:46:48 +0200
committerMaxVerevkin <maxxverrr@gmail.com>2022-12-10 17:46:48 +0200
commit2570f39b5daf6e2a13b3973d47aa7c67fbb457fb (patch)
treee330dee89380a94635113c1312a9dcbb0d9e5883 /src/river_protocols/status.rs
parentf6727acdd4cc112c51d3dd71df61689738e31de9 (diff)
downloadi3bar-mango-2570f39b5daf6e2a13b3973d47aa7c67fbb457fb.tar.gz
refactor
Diffstat (limited to 'src/river_protocols/status.rs')
-rw-r--r--src/river_protocols/status.rs135
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),
}
}
}