diff options
| author | MaxVerevkin <maxxverrr@gmail.com> | 2022-11-27 21:06:35 +0200 |
|---|---|---|
| committer | MaxVerevkin <maxxverrr@gmail.com> | 2022-11-27 21:06:35 +0200 |
| commit | d45a4ef408c0f5a2071194d4c3285f0b7cb27dd0 (patch) | |
| tree | 0794e56251e223388463a84d09616ef47a918bb4 /src/river_protocols/status.rs | |
| parent | a5baa2574ac0f8ff9ca8fbec0ff57145641ded47 (diff) | |
| download | i3bar-mango-d45a4ef408c0f5a2071194d4c3285f0b7cb27dd0.tar.gz | |
update wayland libs & readd set_cursor
Diffstat (limited to 'src/river_protocols/status.rs')
| -rw-r--r-- | src/river_protocols/status.rs | 129 |
1 files changed, 91 insertions, 38 deletions
diff --git a/src/river_protocols/status.rs b/src/river_protocols/status.rs index 079572a..1779719 100644 --- a/src/river_protocols/status.rs +++ b/src/river_protocols/status.rs @@ -1,46 +1,29 @@ -pub mod protocol { - use smithay_client_toolkit::reexports::client as wayland_client; - use smithay_client_toolkit::reexports::client::protocol::*; - - pub mod __interfaces { - use smithay_client_toolkit::reexports::client::protocol::__interfaces::*; - wayland_scanner::generate_interfaces!("protocols/river-status-unstable-v1.xml"); - } - use self::__interfaces::*; - - wayland_scanner::generate_client_code!("protocols/river-status-unstable-v1.xml"); -} - -mod dispatch; - use std::sync::{Arc, Weak}; -use smithay_client_toolkit::globals::GlobalData; -use wayland_client::{protocol::wl_output, Connection, Dispatch, QueueHandle}; +use wayland_client::{ + globals::{BindError, GlobalList}, + protocol::wl_output, + Connection, Dispatch, QueueHandle, +}; use protocol::{zriver_output_status_v1, zriver_status_manager_v1}; -use smithay_client_toolkit::error::GlobalError; -use smithay_client_toolkit::registry::GlobalProxy; - -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct RiverStatusState { - status_manager: GlobalProxy<zriver_status_manager_v1::ZriverStatusManagerV1>, + status_manager: zriver_status_manager_v1::ZriverStatusManagerV1, output_statuses: Vec<Weak<OutputStatusInner>>, } impl RiverStatusState { - pub fn new() -> Self { - Self { - status_manager: GlobalProxy::NotReady, + pub fn new<D>(globals: &GlobalList, qh: &QueueHandle<D>) -> Result<Self, BindError> + where + D: Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, (), D> + 'static, + { + let status_manager = globals.bind(qh, 1..=1, ())?; + Ok(Self { + status_manager, output_statuses: Vec::new(), - } - } - - pub fn status_manager( - &self, - ) -> Result<&zriver_status_manager_v1::ZriverStatusManagerV1, GlobalError> { - self.status_manager.get() + }) } pub fn get_output_status( @@ -59,14 +42,15 @@ impl RiverStatusState { &mut self, qh: &QueueHandle<D>, output: &wl_output::WlOutput, - ) -> Result<RiverOutputStatus, GlobalError> + ) -> RiverOutputStatus where - D: Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, GlobalData> + D: Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, ()> + Dispatch<zriver_output_status_v1::ZriverOutputStatusV1, RiverStatusData> + 'static, { - let manager = self.status_manager()?; - let output_status = manager.get_river_output_status(output, qh, RiverStatusData {}); + let output_status = + self.status_manager + .get_river_output_status(output, qh, RiverStatusData {}); let output_status = RiverOutputStatus(Arc::new(OutputStatusInner { status: output_status, @@ -74,7 +58,7 @@ impl RiverStatusState { self.output_statuses.push(Arc::downgrade(&output_status.0)); - Ok(output_status) + output_status } } @@ -124,7 +108,7 @@ pub struct RiverStatusData { macro_rules! delegate_river_status { ($ty: ty) => { ::smithay_client_toolkit::reexports::client::delegate_dispatch!($ty: [ - $crate::river_protocols::status::protocol::zriver_status_manager_v1::ZriverStatusManagerV1: ::smithay_client_toolkit::globals::GlobalData + $crate::river_protocols::status::protocol::zriver_status_manager_v1::ZriverStatusManagerV1: () ] => $crate::river_protocols::status::RiverStatusState); ::smithay_client_toolkit::reexports::client::delegate_dispatch!($ty: [ $crate::river_protocols::status::protocol::zriver_output_status_v1::ZriverOutputStatusV1: $crate::river_protocols::status::RiverStatusData @@ -142,3 +126,72 @@ impl Drop for OutputStatusInner { self.status.destroy(); } } + +impl<D> Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, (), D> for RiverStatusState +where + D: Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, ()> + RiverStatusHandler + 'static, +{ + fn event( + _: &mut D, + _: &zriver_status_manager_v1::ZriverStatusManagerV1, + _: zriver_status_manager_v1::Event, + _: &(), + _: &Connection, + _: &QueueHandle<D>, + ) { + unreachable!("zriver_status_manager_v1 has no events") + } +} + +impl<D> Dispatch<zriver_output_status_v1::ZriverOutputStatusV1, RiverStatusData, D> + for RiverStatusState +where + D: Dispatch<zriver_output_status_v1::ZriverOutputStatusV1, RiverStatusData> + + RiverStatusHandler + + 'static, +{ + fn event( + data: &mut D, + status: &zriver_output_status_v1::ZriverOutputStatusV1, + event: zriver_output_status_v1::Event, + _udata: &RiverStatusData, + conn: &Connection, + qh: &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); + } + } + } + } +} + +pub mod protocol { + #![allow(non_upper_case_globals)] + + use smithay_client_toolkit::reexports::client as wayland_client; + use smithay_client_toolkit::reexports::client::protocol::*; + + pub mod __interfaces { + use smithay_client_toolkit::reexports::client::protocol::__interfaces::*; + wayland_scanner::generate_interfaces!("protocols/river-status-unstable-v1.xml"); + } + use self::__interfaces::*; + + wayland_scanner::generate_client_code!("protocols/river-status-unstable-v1.xml"); +} |
