summaryrefslogtreecommitdiff
path: root/src/river_protocols/status/dispatch.rs
diff options
context:
space:
mode:
authorMaxVerevkin <maxxverrr@gmail.com>2022-08-08 23:12:23 +0300
committerMaxVerevkin <maxxverrr@gmail.com>2022-08-08 23:59:59 +0300
commit1851c56e407cac72ca104cc5e75692cd9c648986 (patch)
tree31473532e01ee6ee1571974a6abf59463e3265ed /src/river_protocols/status/dispatch.rs
parent9ddde2d2ee9833412e39afbd1ed907cdea22f08f (diff)
downloadi3bar-mango-1851c56e407cac72ca104cc5e75692cd9c648986.tar.gz
rewrite using latest walayd libs & implement HiDPI
Diffstat (limited to 'src/river_protocols/status/dispatch.rs')
-rw-r--r--src/river_protocols/status/dispatch.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/river_protocols/status/dispatch.rs b/src/river_protocols/status/dispatch.rs
new file mode 100644
index 0000000..d38037d
--- /dev/null
+++ b/src/river_protocols/status/dispatch.rs
@@ -0,0 +1,86 @@
+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<D> RegistryHandler<D> for RiverStatusState
+where
+ D: Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, GlobalData>
+ + RiverStatusHandler
+ + ProvidesRegistryState
+ + 'static,
+{
+ fn ready(data: &mut D, _conn: &Connection, qh: &QueueHandle<D>) {
+ data.river_status_state().status_manager =
+ data.registry().bind_one(qh, 1..=2, GlobalData).into();
+ }
+}
+
+impl ProvidesBoundGlobal<zriver_status_manager_v1::ZriverStatusManagerV1, 1> for RiverStatusState {
+ fn bound_global(&self) -> Result<zriver_status_manager_v1::ZriverStatusManagerV1, GlobalError> {
+ self.status_manager.get().cloned()
+ }
+}
+
+impl ProvidesBoundGlobal<zriver_status_manager_v1::ZriverStatusManagerV1, 2> for RiverStatusState {
+ fn bound_global(&self) -> Result<zriver_status_manager_v1::ZriverStatusManagerV1, GlobalError> {
+ self.status_manager.get().cloned()
+ }
+}
+
+impl<D> Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, GlobalData, D>
+ for RiverStatusState
+where
+ D: Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, GlobalData>
+ + RiverStatusHandler
+ + 'static,
+{
+ fn event(
+ _: &mut D,
+ _: &zriver_status_manager_v1::ZriverStatusManagerV1,
+ _: zriver_status_manager_v1::Event,
+ _: &GlobalData,
+ _: &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: _ } => (),
+ }
+ }
+ }
+}