summaryrefslogtreecommitdiff
path: root/src/river_protocols/control/dispatch.rs
blob: 14759e71c02a2285f77ff700708c5750844f717e (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
use std::sync::Arc;

use super::protocol::{zriver_command_callback_v1, zriver_control_v1};
use wayland_client::{Connection, Dispatch, QueueHandle};

use smithay_client_toolkit::{
    error::GlobalError,
    globals::{GlobalData, ProvidesBoundGlobal},
    registry::{ProvidesRegistryState, RegistryHandler},
};

use super::{RiverCommandCallbackData, RiverControlHandler, RiverControlState};

impl<D> RegistryHandler<D> for RiverControlState
where
    D: Dispatch<zriver_control_v1::ZriverControlV1, GlobalData>
        + RiverControlHandler
        + ProvidesRegistryState
        + 'static,
{
    fn ready(data: &mut D, _conn: &Connection, qh: &QueueHandle<D>) {
        data.river_control_state().control =
            Arc::new(data.registry().bind_one(qh, 1..=1, GlobalData).into());
    }
}

impl ProvidesBoundGlobal<zriver_control_v1::ZriverControlV1, 1> for RiverControlState {
    fn bound_global(&self) -> Result<zriver_control_v1::ZriverControlV1, GlobalError> {
        self.control.get().cloned()
    }
}

impl<D> Dispatch<zriver_control_v1::ZriverControlV1, GlobalData, D> for RiverControlState
where
    D: Dispatch<zriver_control_v1::ZriverControlV1, GlobalData> + RiverControlHandler + 'static,
{
    fn event(
        _: &mut D,
        _: &zriver_control_v1::ZriverControlV1,
        _: zriver_control_v1::Event,
        _: &GlobalData,
        _: &Connection,
        _: &QueueHandle<D>,
    ) {
        unreachable!("zriver_control_v1 has no events")
    }
}

impl<D> Dispatch<zriver_command_callback_v1::ZriverCommandCallbackV1, RiverCommandCallbackData, D>
    for RiverControlState
where
    D: Dispatch<zriver_command_callback_v1::ZriverCommandCallbackV1, RiverCommandCallbackData>
        + RiverControlHandler
        + 'static,
{
    fn event(
        data: &mut D,
        _callback: &zriver_command_callback_v1::ZriverCommandCallbackV1,
        event: zriver_command_callback_v1::Event,
        _udata: &RiverCommandCallbackData,
        conn: &Connection,
        qh: &QueueHandle<D>,
    ) {
        use zriver_command_callback_v1::Event;
        match event {
            Event::Success { output } => data.command_success(conn, qh, output),
            Event::Failure { failure_message } => data.command_success(conn, qh, failure_message),
        }
    }
}