use super::protocol::{zriver_output_status_v1, zriver_status_manager_v1}; use wayland_client::{Connection, Dispatch, QueueHandle}; use smithay_client_toolkit::{ error::GlobalError, globals::{GlobalData, ProvidesBoundGlobal}, registry::{ProvidesRegistryState, RegistryHandler}, }; use super::{RiverStatusData, RiverStatusHandler, RiverStatusState}; impl RegistryHandler for RiverStatusState where D: Dispatch + RiverStatusHandler + ProvidesRegistryState + 'static, { fn ready(data: &mut D, _conn: &Connection, qh: &QueueHandle) { data.river_status_state().status_manager = data.registry().bind_one(qh, 1..=2, GlobalData).into(); } } impl ProvidesBoundGlobal for RiverStatusState { fn bound_global(&self) -> Result { self.status_manager.get().cloned() } } impl ProvidesBoundGlobal for RiverStatusState { fn bound_global(&self) -> Result { self.status_manager.get().cloned() } } impl Dispatch for RiverStatusState where D: Dispatch + RiverStatusHandler + 'static, { fn event( _: &mut D, _: &zriver_status_manager_v1::ZriverStatusManagerV1, _: zriver_status_manager_v1::Event, _: &GlobalData, _: &Connection, _: &QueueHandle, ) { unreachable!("zriver_status_manager_v1 has no events") } } impl Dispatch for RiverStatusState where D: Dispatch + 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, ) { 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); } } } } }