summaryrefslogtreecommitdiff
path: root/src/river_protocols/status/dispatch.rs
blob: d38037d6778b6ca2de44ac6c7e4f336000a91d0e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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: _ } => (),
            }
        }
    }
}