smithay_client_toolkit/primary_selection/
mod.rs

1use crate::globals::GlobalData;
2use crate::reexports::client::{
3    globals::{BindError, GlobalList},
4    protocol::wl_seat::WlSeat,
5    Dispatch, QueueHandle,
6};
7use crate::reexports::protocols::wp::primary_selection::zv1::client::{
8    zwp_primary_selection_device_manager_v1::ZwpPrimarySelectionDeviceManagerV1,
9    zwp_primary_selection_device_v1::ZwpPrimarySelectionDeviceV1,
10    zwp_primary_selection_source_v1::ZwpPrimarySelectionSourceV1,
11};
12
13pub mod device;
14pub mod offer;
15pub mod selection;
16
17use self::device::{PrimarySelectionDevice, PrimarySelectionDeviceData};
18use selection::PrimarySelectionSource;
19
20#[derive(Debug)]
21pub struct PrimarySelectionManagerState {
22    manager: ZwpPrimarySelectionDeviceManagerV1,
23}
24
25impl PrimarySelectionManagerState {
26    pub fn bind<State>(globals: &GlobalList, qh: &QueueHandle<State>) -> Result<Self, BindError>
27    where
28        State: Dispatch<ZwpPrimarySelectionDeviceManagerV1, GlobalData, State> + 'static,
29    {
30        let manager = globals.bind(qh, 1..=1, GlobalData)?;
31        Ok(Self { manager })
32    }
33
34    /// The underlying wayland object.
35    pub fn primary_selection_manager(&self) -> &ZwpPrimarySelectionDeviceManagerV1 {
36        &self.manager
37    }
38
39    /// Create a primary selection source.
40    pub fn create_selection_source<State, I, T>(
41        &self,
42        qh: &QueueHandle<State>,
43        mime_types: I,
44    ) -> PrimarySelectionSource
45    where
46        State: Dispatch<ZwpPrimarySelectionSourceV1, GlobalData, State> + 'static,
47        I: IntoIterator<Item = T>,
48        T: ToString,
49    {
50        let source = self.manager.create_source(qh, GlobalData);
51
52        for mime_type in mime_types {
53            source.offer(mime_type.to_string());
54        }
55
56        PrimarySelectionSource::new(source)
57    }
58
59    /// Get the primary selection data device for the given seat.
60    pub fn get_selection_device<State>(
61        &self,
62        qh: &QueueHandle<State>,
63        seat: &WlSeat,
64    ) -> PrimarySelectionDevice
65    where
66        State: Dispatch<ZwpPrimarySelectionDeviceV1, PrimarySelectionDeviceData, State> + 'static,
67    {
68        PrimarySelectionDevice {
69            device: self.manager.get_device(
70                seat,
71                qh,
72                PrimarySelectionDeviceData::new(seat.clone()),
73            ),
74        }
75    }
76}
77
78impl Drop for PrimarySelectionManagerState {
79    fn drop(&mut self) {
80        self.manager.destroy();
81    }
82}
83
84impl<D> Dispatch<ZwpPrimarySelectionDeviceManagerV1, GlobalData, D> for PrimarySelectionManagerState
85where
86    D: Dispatch<ZwpPrimarySelectionDeviceManagerV1, GlobalData>,
87{
88    fn event(
89        _: &mut D,
90        _: &ZwpPrimarySelectionDeviceManagerV1,
91        _: <ZwpPrimarySelectionDeviceManagerV1 as wayland_client::Proxy>::Event,
92        _: &GlobalData,
93        _: &wayland_client::Connection,
94        _: &QueueHandle<D>,
95    ) {
96        unreachable!("zwp_primary_selection_device_manager_v1 has no events")
97    }
98}
99
100#[macro_export]
101macro_rules! delegate_primary_selection {
102    ($(@<$( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+>)? $ty: ty) => {
103        $crate::reexports::client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty:
104            [
105                $crate::reexports::protocols::wp::primary_selection::zv1::client::zwp_primary_selection_device_manager_v1::ZwpPrimarySelectionDeviceManagerV1: $crate::globals::GlobalData
106            ] => $crate::primary_selection::PrimarySelectionManagerState);
107        $crate::reexports::client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty:
108            [
109                $crate::reexports::protocols::wp::primary_selection::zv1::client::zwp_primary_selection_device_v1::ZwpPrimarySelectionDeviceV1: $crate::primary_selection::device::PrimarySelectionDeviceData
110            ] => $crate::primary_selection::PrimarySelectionManagerState);
111        $crate::reexports::client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty:
112            [
113                $crate::reexports::protocols::wp::primary_selection::zv1::client::zwp_primary_selection_offer_v1::ZwpPrimarySelectionOfferV1: $crate::primary_selection::offer::PrimarySelectionOfferData
114            ] => $crate::primary_selection::PrimarySelectionManagerState);
115        $crate::reexports::client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty:
116            [
117                $crate::reexports::protocols::wp::primary_selection::zv1::client::zwp_primary_selection_source_v1::ZwpPrimarySelectionSourceV1: $crate::globals::GlobalData
118            ] => $crate::primary_selection::PrimarySelectionManagerState);
119    };
120}