1 | use crate::error::GlobalError; |
2 | use crate::globals::{GlobalData, ProvidesBoundGlobal}; |
3 | use crate::reexports::client::{ |
4 | globals::{BindError, GlobalList}, |
5 | protocol::{ |
6 | wl_data_device, |
7 | wl_data_device_manager::{self, DndAction, WlDataDeviceManager}, |
8 | wl_data_source::WlDataSource, |
9 | wl_seat::WlSeat, |
10 | }, |
11 | Connection, Dispatch, Proxy, QueueHandle, |
12 | }; |
13 | |
14 | pub mod data_device; |
15 | pub mod data_offer; |
16 | pub mod data_source; |
17 | mod read_pipe; |
18 | mod write_pipe; |
19 | |
20 | pub use read_pipe::*; |
21 | pub use write_pipe::*; |
22 | |
23 | use data_device::{DataDevice, DataDeviceData}; |
24 | use data_source::{CopyPasteSource, DataSourceData, DragSource}; |
25 | |
26 | #[derive (Debug)] |
27 | pub struct DataDeviceManagerState { |
28 | manager: WlDataDeviceManager, |
29 | } |
30 | |
31 | impl DataDeviceManagerState { |
32 | pub fn bind<State>(globals: &GlobalList, qh: &QueueHandle<State>) -> Result<Self, BindError> |
33 | where |
34 | State: Dispatch<WlDataDeviceManager, GlobalData, State> + 'static, |
35 | { |
36 | let manager = globals.bind(qh, 1..=3, GlobalData)?; |
37 | Ok(Self { manager }) |
38 | } |
39 | |
40 | pub fn data_device_manager(&self) -> &WlDataDeviceManager { |
41 | &self.manager |
42 | } |
43 | |
44 | /// creates a data source for copy paste |
45 | pub fn create_copy_paste_source<D, T: ToString>( |
46 | &self, |
47 | qh: &QueueHandle<D>, |
48 | mime_types: impl IntoIterator<Item = T>, |
49 | ) -> CopyPasteSource |
50 | where |
51 | D: Dispatch<WlDataSource, DataSourceData> + 'static, |
52 | { |
53 | CopyPasteSource { inner: self.create_data_source(qh, mime_types, None) } |
54 | } |
55 | |
56 | /// creates a data source for drag and drop |
57 | pub fn create_drag_and_drop_source<D, T: ToString>( |
58 | &self, |
59 | qh: &QueueHandle<D>, |
60 | mime_types: impl IntoIterator<Item = T>, |
61 | dnd_actions: DndAction, |
62 | ) -> DragSource |
63 | where |
64 | D: Dispatch<WlDataSource, DataSourceData> + 'static, |
65 | { |
66 | DragSource { inner: self.create_data_source(qh, mime_types, Some(dnd_actions)) } |
67 | } |
68 | |
69 | /// creates a data source |
70 | fn create_data_source<D, T: ToString>( |
71 | &self, |
72 | qh: &QueueHandle<D>, |
73 | mime_types: impl IntoIterator<Item = T>, |
74 | dnd_actions: Option<DndAction>, |
75 | ) -> WlDataSource |
76 | where |
77 | D: Dispatch<WlDataSource, DataSourceData> + 'static, |
78 | { |
79 | let source = self.manager.create_data_source(qh, Default::default()); |
80 | |
81 | for mime in mime_types { |
82 | source.offer(mime.to_string()); |
83 | } |
84 | |
85 | if self.manager.version() >= 3 { |
86 | if let Some(dnd_actions) = dnd_actions { |
87 | source.set_actions(dnd_actions); |
88 | } |
89 | } |
90 | |
91 | source |
92 | } |
93 | |
94 | /// create a new data device for a given seat |
95 | pub fn get_data_device<D>(&self, qh: &QueueHandle<D>, seat: &WlSeat) -> DataDevice |
96 | where |
97 | D: Dispatch<wl_data_device::WlDataDevice, DataDeviceData> + 'static, |
98 | { |
99 | let data = DataDeviceData::new(seat.clone()); |
100 | DataDevice { device: self.manager.get_data_device(seat, qh, data) } |
101 | } |
102 | } |
103 | |
104 | impl ProvidesBoundGlobal<WlDataDeviceManager, 3> for DataDeviceManagerState { |
105 | fn bound_global(&self) -> Result<WlDataDeviceManager, GlobalError> { |
106 | Ok(self.manager.clone()) |
107 | } |
108 | } |
109 | |
110 | impl<D> Dispatch<wl_data_device_manager::WlDataDeviceManager, GlobalData, D> |
111 | for DataDeviceManagerState |
112 | where |
113 | D: Dispatch<wl_data_device_manager::WlDataDeviceManager, GlobalData>, |
114 | { |
115 | fn event( |
116 | _state: &mut D, |
117 | _proxy: &wl_data_device_manager::WlDataDeviceManager, |
118 | _event: <wl_data_device_manager::WlDataDeviceManager as wayland_client::Proxy>::Event, |
119 | _data: &GlobalData, |
120 | _conn: &Connection, |
121 | _qhandle: &QueueHandle<D>, |
122 | ) { |
123 | unreachable!("wl_data_device_manager has no events" ) |
124 | } |
125 | } |
126 | |
127 | #[macro_export ] |
128 | macro_rules! delegate_data_device { |
129 | ($(@<$( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+>)? $ty: ty) => { |
130 | $crate::reexports::client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: |
131 | [ |
132 | $crate::reexports::client::protocol::wl_data_device_manager::WlDataDeviceManager: $crate::globals::GlobalData |
133 | ] => $crate::data_device_manager::DataDeviceManagerState); |
134 | $crate::reexports::client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: |
135 | [ |
136 | $crate::reexports::client::protocol::wl_data_offer::WlDataOffer: $crate::data_device_manager::data_offer::DataOfferData |
137 | ] => $crate::data_device_manager::DataDeviceManagerState); |
138 | $crate::reexports::client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: |
139 | [ |
140 | $crate::reexports::client::protocol::wl_data_source::WlDataSource: $crate::data_device_manager::data_source::DataSourceData |
141 | ] => $crate::data_device_manager::DataDeviceManagerState |
142 | ); |
143 | $crate::reexports::client::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: |
144 | [ |
145 | $crate::reexports::client::protocol::wl_data_device::WlDataDevice: $crate::data_device_manager::data_device::DataDeviceData |
146 | ] => $crate::data_device_manager::DataDeviceManagerState |
147 | ); |
148 | }; |
149 | } |
150 | |