1use crate::protocol_helpers::prelude::*;
15use super::super::all_types::*;
16
17pub struct WlDataDeviceManager {
21 core: ObjectCore,
22 handler: HandlerHolder<dyn WlDataDeviceManagerHandler>,
23}
24
25struct DefaultHandler;
26
27impl WlDataDeviceManagerHandler for DefaultHandler { }
28
29impl ConcreteObject for WlDataDeviceManager {
30 const XML_VERSION: u32 = 3;
31 const INTERFACE: ObjectInterface = ObjectInterface::WlDataDeviceManager;
32 const INTERFACE_NAME: &str = "wl_data_device_manager";
33}
34
35impl WlDataDeviceManager {
36 pub fn set_handler(&self, handler: impl WlDataDeviceManagerHandler) {
38 self.set_boxed_handler(Box::new(handler));
39 }
40
41 pub fn set_boxed_handler(&self, handler: Box<dyn WlDataDeviceManagerHandler>) {
43 if self.core.state.destroyed.get() {
44 return;
45 }
46 self.handler.set(Some(handler));
47 }
48}
49
50impl Debug for WlDataDeviceManager {
51 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
52 f.debug_struct("WlDataDeviceManager")
53 .field("server_obj_id", &self.core.server_obj_id.get())
54 .field("client_id", &self.core.client_id.get())
55 .field("client_obj_id", &self.core.client_obj_id.get())
56 .finish()
57 }
58}
59
60impl WlDataDeviceManager {
61 pub const MSG__CREATE_DATA_SOURCE__SINCE: u32 = 1;
63
64 #[inline]
72 pub fn try_send_create_data_source(
73 &self,
74 id: &Rc<WlDataSource>,
75 ) -> Result<(), ObjectError> {
76 let (
77 arg0,
78 ) = (
79 id,
80 );
81 let arg0_obj = arg0;
82 let arg0 = arg0_obj.core();
83 let core = self.core();
84 let Some(id) = core.server_obj_id.get() else {
85 return Err(ObjectError(ObjectErrorKind::ReceiverNoServerId));
86 };
87 arg0.generate_server_id(arg0_obj.clone())
88 .map_err(|e| ObjectError(ObjectErrorKind::GenerateServerId("id", e)))?;
89 let arg0_id = arg0.server_obj_id.get().unwrap_or(0);
90 #[cfg(feature = "logging")]
91 if self.core.state.log {
92 #[cold]
93 fn log(state: &State, id: u32, arg0: u32) {
94 let (millis, micros) = time_since_epoch();
95 let prefix = &state.log_prefix;
96 let args = format_args!("[{millis:7}.{micros:03}] {prefix}server <= wl_data_device_manager#{}.create_data_source(id: wl_data_source#{})\n", id, arg0);
97 state.log(args);
98 }
99 log(&self.core.state, id, arg0_id);
100 }
101 let Some(endpoint) = &self.core.state.server else {
102 return Ok(());
103 };
104 if !endpoint.flush_queued.replace(true) {
105 self.core.state.add_flushable_endpoint(endpoint, None);
106 }
107 let mut outgoing_ref = endpoint.outgoing.borrow_mut();
108 let outgoing = &mut *outgoing_ref;
109 let mut fmt = outgoing.formatter();
110 fmt.words([
111 id,
112 0,
113 arg0_id,
114 ]);
115 Ok(())
116 }
117
118 #[inline]
126 pub fn send_create_data_source(
127 &self,
128 id: &Rc<WlDataSource>,
129 ) {
130 let res = self.try_send_create_data_source(
131 id,
132 );
133 if let Err(e) = res {
134 log_send("wl_data_device_manager.create_data_source", &e);
135 }
136 }
137
138 #[inline]
142 pub fn new_try_send_create_data_source(
143 &self,
144 ) -> Result<Rc<WlDataSource>, ObjectError> {
145 let id = self.core.create_child();
146 self.try_send_create_data_source(
147 &id,
148 )?;
149 Ok(id)
150 }
151
152 #[inline]
156 pub fn new_send_create_data_source(
157 &self,
158 ) -> Rc<WlDataSource> {
159 let id = self.core.create_child();
160 self.send_create_data_source(
161 &id,
162 );
163 id
164 }
165
166 pub const MSG__GET_DATA_DEVICE__SINCE: u32 = 1;
168
169 #[inline]
178 pub fn try_send_get_data_device(
179 &self,
180 id: &Rc<WlDataDevice>,
181 seat: &Rc<WlSeat>,
182 ) -> Result<(), ObjectError> {
183 let (
184 arg0,
185 arg1,
186 ) = (
187 id,
188 seat,
189 );
190 let arg0_obj = arg0;
191 let arg0 = arg0_obj.core();
192 let arg1 = arg1.core();
193 let core = self.core();
194 let Some(id) = core.server_obj_id.get() else {
195 return Err(ObjectError(ObjectErrorKind::ReceiverNoServerId));
196 };
197 let arg1_id = match arg1.server_obj_id.get() {
198 None => return Err(ObjectError(ObjectErrorKind::ArgNoServerId("seat"))),
199 Some(id) => id,
200 };
201 arg0.generate_server_id(arg0_obj.clone())
202 .map_err(|e| ObjectError(ObjectErrorKind::GenerateServerId("id", e)))?;
203 let arg0_id = arg0.server_obj_id.get().unwrap_or(0);
204 #[cfg(feature = "logging")]
205 if self.core.state.log {
206 #[cold]
207 fn log(state: &State, id: u32, arg0: u32, arg1: u32) {
208 let (millis, micros) = time_since_epoch();
209 let prefix = &state.log_prefix;
210 let args = format_args!("[{millis:7}.{micros:03}] {prefix}server <= wl_data_device_manager#{}.get_data_device(id: wl_data_device#{}, seat: wl_seat#{})\n", id, arg0, arg1);
211 state.log(args);
212 }
213 log(&self.core.state, id, arg0_id, arg1_id);
214 }
215 let Some(endpoint) = &self.core.state.server else {
216 return Ok(());
217 };
218 if !endpoint.flush_queued.replace(true) {
219 self.core.state.add_flushable_endpoint(endpoint, None);
220 }
221 let mut outgoing_ref = endpoint.outgoing.borrow_mut();
222 let outgoing = &mut *outgoing_ref;
223 let mut fmt = outgoing.formatter();
224 fmt.words([
225 id,
226 1,
227 arg0_id,
228 arg1_id,
229 ]);
230 Ok(())
231 }
232
233 #[inline]
242 pub fn send_get_data_device(
243 &self,
244 id: &Rc<WlDataDevice>,
245 seat: &Rc<WlSeat>,
246 ) {
247 let res = self.try_send_get_data_device(
248 id,
249 seat,
250 );
251 if let Err(e) = res {
252 log_send("wl_data_device_manager.get_data_device", &e);
253 }
254 }
255
256 #[inline]
264 pub fn new_try_send_get_data_device(
265 &self,
266 seat: &Rc<WlSeat>,
267 ) -> Result<Rc<WlDataDevice>, ObjectError> {
268 let id = self.core.create_child();
269 self.try_send_get_data_device(
270 &id,
271 seat,
272 )?;
273 Ok(id)
274 }
275
276 #[inline]
284 pub fn new_send_get_data_device(
285 &self,
286 seat: &Rc<WlSeat>,
287 ) -> Rc<WlDataDevice> {
288 let id = self.core.create_child();
289 self.send_get_data_device(
290 &id,
291 seat,
292 );
293 id
294 }
295}
296
297pub trait WlDataDeviceManagerHandler: Any {
299 #[inline]
303 fn delete_id(&mut self, slf: &Rc<WlDataDeviceManager>) {
304 slf.core.delete_id();
305 }
306
307 #[inline]
315 fn handle_create_data_source(
316 &mut self,
317 slf: &Rc<WlDataDeviceManager>,
318 id: &Rc<WlDataSource>,
319 ) {
320 if !slf.core.forward_to_server.get() {
321 return;
322 }
323 let res = slf.try_send_create_data_source(
324 id,
325 );
326 if let Err(e) = res {
327 log_forward("wl_data_device_manager.create_data_source", &e);
328 }
329 }
330
331 #[inline]
343 fn handle_get_data_device(
344 &mut self,
345 slf: &Rc<WlDataDeviceManager>,
346 id: &Rc<WlDataDevice>,
347 seat: &Rc<WlSeat>,
348 ) {
349 if !slf.core.forward_to_server.get() {
350 return;
351 }
352 let res = slf.try_send_get_data_device(
353 id,
354 seat,
355 );
356 if let Err(e) = res {
357 log_forward("wl_data_device_manager.get_data_device", &e);
358 }
359 }
360}
361
362impl ObjectPrivate for WlDataDeviceManager {
363 fn new(state: &Rc<State>, version: u32) -> Rc<Self> {
364 Rc::<Self>::new_cyclic(|slf| Self {
365 core: ObjectCore::new(state, slf.clone(), ObjectInterface::WlDataDeviceManager, version),
366 handler: Default::default(),
367 })
368 }
369
370 fn delete_id(self: Rc<Self>) -> Result<(), (ObjectError, Rc<dyn Object>)> {
371 let Some(mut handler) = self.handler.try_borrow_mut() else {
372 return Err((ObjectError(ObjectErrorKind::HandlerBorrowed), self));
373 };
374 if let Some(handler) = &mut *handler {
375 handler.delete_id(&self);
376 } else {
377 self.core.delete_id();
378 }
379 Ok(())
380 }
381
382 fn handle_request(self: Rc<Self>, client: &Rc<Client>, msg: &[u32], fds: &mut VecDeque<Rc<OwnedFd>>) -> Result<(), ObjectError> {
383 let Some(mut handler) = self.handler.try_borrow_mut() else {
384 return Err(ObjectError(ObjectErrorKind::HandlerBorrowed));
385 };
386 let handler = &mut *handler;
387 match msg[1] & 0xffff {
388 0 => {
389 let [
390 arg0,
391 ] = msg[2..] else {
392 return Err(ObjectError(ObjectErrorKind::WrongMessageSize(msg.len() as u32 * 4, 12)));
393 };
394 #[cfg(feature = "logging")]
395 if self.core.state.log {
396 #[cold]
397 fn log(state: &State, client_id: u64, id: u32, arg0: u32) {
398 let (millis, micros) = time_since_epoch();
399 let prefix = &state.log_prefix;
400 let args = format_args!("[{millis:7}.{micros:03}] {prefix}client#{:<4} -> wl_data_device_manager#{}.create_data_source(id: wl_data_source#{})\n", client_id, id, arg0);
401 state.log(args);
402 }
403 log(&self.core.state, client.endpoint.id, msg[0], arg0);
404 }
405 let arg0_id = arg0;
406 let arg0 = WlDataSource::new(&self.core.state, self.core.version);
407 arg0.core().set_client_id(client, arg0_id, arg0.clone())
408 .map_err(|e| ObjectError(ObjectErrorKind::SetClientId(arg0_id, "id", e)))?;
409 let arg0 = &arg0;
410 if let Some(handler) = handler {
411 (**handler).handle_create_data_source(&self, arg0);
412 } else {
413 DefaultHandler.handle_create_data_source(&self, arg0);
414 }
415 }
416 1 => {
417 let [
418 arg0,
419 arg1,
420 ] = msg[2..] else {
421 return Err(ObjectError(ObjectErrorKind::WrongMessageSize(msg.len() as u32 * 4, 16)));
422 };
423 #[cfg(feature = "logging")]
424 if self.core.state.log {
425 #[cold]
426 fn log(state: &State, client_id: u64, id: u32, arg0: u32, arg1: u32) {
427 let (millis, micros) = time_since_epoch();
428 let prefix = &state.log_prefix;
429 let args = format_args!("[{millis:7}.{micros:03}] {prefix}client#{:<4} -> wl_data_device_manager#{}.get_data_device(id: wl_data_device#{}, seat: wl_seat#{})\n", client_id, id, arg0, arg1);
430 state.log(args);
431 }
432 log(&self.core.state, client.endpoint.id, msg[0], arg0, arg1);
433 }
434 let arg0_id = arg0;
435 let arg0 = WlDataDevice::new(&self.core.state, self.core.version);
436 arg0.core().set_client_id(client, arg0_id, arg0.clone())
437 .map_err(|e| ObjectError(ObjectErrorKind::SetClientId(arg0_id, "id", e)))?;
438 let arg1_id = arg1;
439 let Some(arg1) = client.endpoint.lookup(arg1_id) else {
440 return Err(ObjectError(ObjectErrorKind::NoClientObject(client.endpoint.id, arg1_id)));
441 };
442 let Ok(arg1) = (arg1 as Rc<dyn Any>).downcast::<WlSeat>() else {
443 let o = client.endpoint.lookup(arg1_id).unwrap();
444 return Err(ObjectError(ObjectErrorKind::WrongObjectType("seat", o.core().interface, ObjectInterface::WlSeat)));
445 };
446 let arg0 = &arg0;
447 let arg1 = &arg1;
448 if let Some(handler) = handler {
449 (**handler).handle_get_data_device(&self, arg0, arg1);
450 } else {
451 DefaultHandler.handle_get_data_device(&self, arg0, arg1);
452 }
453 }
454 n => {
455 let _ = client;
456 let _ = msg;
457 let _ = fds;
458 let _ = handler;
459 return Err(ObjectError(ObjectErrorKind::UnknownMessageId(n)));
460 }
461 }
462 Ok(())
463 }
464
465 fn handle_event(self: Rc<Self>, server: &Endpoint, msg: &[u32], fds: &mut VecDeque<Rc<OwnedFd>>) -> Result<(), ObjectError> {
466 let Some(mut handler) = self.handler.try_borrow_mut() else {
467 return Err(ObjectError(ObjectErrorKind::HandlerBorrowed));
468 };
469 let handler = &mut *handler;
470 match msg[1] & 0xffff {
471 n => {
472 let _ = server;
473 let _ = msg;
474 let _ = fds;
475 let _ = handler;
476 return Err(ObjectError(ObjectErrorKind::UnknownMessageId(n)));
477 }
478 }
479 }
480
481 fn get_request_name(&self, id: u32) -> Option<&'static str> {
482 let name = match id {
483 0 => "create_data_source",
484 1 => "get_data_device",
485 _ => return None,
486 };
487 Some(name)
488 }
489
490 fn get_event_name(&self, id: u32) -> Option<&'static str> {
491 let _ = id;
492 None
493 }
494}
495
496impl Object for WlDataDeviceManager {
497 fn core(&self) -> &ObjectCore {
498 &self.core
499 }
500
501 fn unset_handler(&self) {
502 self.handler.set(None);
503 }
504
505 fn get_handler_any_ref(&self) -> Result<HandlerRef<'_, dyn Any>, HandlerAccessError> {
506 let borrowed = self.handler.try_borrow().ok_or(HandlerAccessError::AlreadyBorrowed)?;
507 if borrowed.is_none() {
508 return Err(HandlerAccessError::NoHandler);
509 }
510 Ok(HandlerRef::map(borrowed, |handler| &**handler.as_ref().unwrap() as &dyn Any))
511 }
512
513 fn get_handler_any_mut(&self) -> Result<HandlerMut<'_, dyn Any>, HandlerAccessError> {
514 let borrowed = self.handler.try_borrow_mut().ok_or(HandlerAccessError::AlreadyBorrowed)?;
515 if borrowed.is_none() {
516 return Err(HandlerAccessError::NoHandler);
517 }
518 Ok(HandlerMut::map(borrowed, |handler| &mut **handler.as_mut().unwrap() as &mut dyn Any))
519 }
520}
521
522impl WlDataDeviceManager {
523 pub const ENM__DND_ACTION_NONE__SINCE: u32 = 1;
525 pub const ENM__DND_ACTION_COPY__SINCE: u32 = 1;
527 pub const ENM__DND_ACTION_MOVE__SINCE: u32 = 1;
529 pub const ENM__DND_ACTION_ASK__SINCE: u32 = 1;
531}
532
533#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
559#[derive(Default)]
560pub struct WlDataDeviceManagerDndAction(pub u32);
561
562#[derive(Clone, Debug)]
566pub struct WlDataDeviceManagerDndActionIter(pub u32);
567
568impl WlDataDeviceManagerDndAction {
569 pub const NONE: Self = Self(0);
571
572 pub const COPY: Self = Self(1);
574
575 pub const MOVE: Self = Self(2);
577
578 pub const ASK: Self = Self(4);
580}
581
582impl WlDataDeviceManagerDndAction {
583 #[inline]
584 pub const fn empty() -> Self {
585 Self(0)
586 }
587
588 #[inline]
589 #[must_use]
590 pub const fn is_empty(self) -> bool {
591 self.0 == 0
592 }
593
594 #[inline]
595 #[must_use]
596 pub const fn contains(self, other: Self) -> bool {
597 self.0 & other.0 == other.0
598 }
599
600 #[inline]
601 #[must_use]
602 pub const fn intersects(self, other: Self) -> bool {
603 self.0 & other.0 != 0
604 }
605
606 #[inline]
607 pub const fn insert(&mut self, other: Self) {
608 *self = self.union(other);
609 }
610
611 #[inline]
612 pub const fn remove(&mut self, other: Self) {
613 *self = self.difference(other);
614 }
615
616 #[inline]
617 pub const fn toggle(&mut self, other: Self) {
618 *self = self.symmetric_difference(other);
619 }
620
621 #[inline]
622 pub const fn set(&mut self, other: Self, value: bool) {
623 if value {
624 self.insert(other);
625 } else {
626 self.remove(other);
627 }
628 }
629
630 #[inline]
631 #[must_use]
632 pub const fn intersection(self, other: Self) -> Self {
633 Self(self.0 & other.0)
634 }
635
636 #[inline]
637 #[must_use]
638 pub const fn union(self, other: Self) -> Self {
639 Self(self.0 | other.0)
640 }
641
642 #[inline]
643 #[must_use]
644 pub const fn difference(self, other: Self) -> Self {
645 Self(self.0 & !other.0)
646 }
647
648 #[inline]
649 #[must_use]
650 pub const fn complement(self) -> Self {
651 Self(!self.0)
652 }
653
654 #[inline]
655 #[must_use]
656 pub const fn symmetric_difference(self, other: Self) -> Self {
657 Self(self.0 ^ other.0)
658 }
659
660 #[inline]
661 pub const fn all_known() -> Self {
662 #[allow(clippy::eq_op, clippy::identity_op)]
663 Self(0 | 0 | 1 | 2 | 4)
664 }
665}
666
667impl Iterator for WlDataDeviceManagerDndActionIter {
668 type Item = WlDataDeviceManagerDndAction;
669
670 fn next(&mut self) -> Option<Self::Item> {
671 if self.0 == 0 {
672 return None;
673 }
674 let bit = 1 << self.0.trailing_zeros();
675 self.0 &= !bit;
676 Some(WlDataDeviceManagerDndAction(bit))
677 }
678}
679
680impl IntoIterator for WlDataDeviceManagerDndAction {
681 type Item = WlDataDeviceManagerDndAction;
682 type IntoIter = WlDataDeviceManagerDndActionIter;
683
684 fn into_iter(self) -> Self::IntoIter {
685 WlDataDeviceManagerDndActionIter(self.0)
686 }
687}
688
689impl BitAnd for WlDataDeviceManagerDndAction {
690 type Output = Self;
691
692 fn bitand(self, rhs: Self) -> Self::Output {
693 self.intersection(rhs)
694 }
695}
696
697impl BitAndAssign for WlDataDeviceManagerDndAction {
698 fn bitand_assign(&mut self, rhs: Self) {
699 *self = self.intersection(rhs);
700 }
701}
702
703impl BitOr for WlDataDeviceManagerDndAction {
704 type Output = Self;
705
706 fn bitor(self, rhs: Self) -> Self::Output {
707 self.union(rhs)
708 }
709}
710
711impl BitOrAssign for WlDataDeviceManagerDndAction {
712 fn bitor_assign(&mut self, rhs: Self) {
713 *self = self.union(rhs);
714 }
715}
716
717impl BitXor for WlDataDeviceManagerDndAction {
718 type Output = Self;
719
720 fn bitxor(self, rhs: Self) -> Self::Output {
721 self.symmetric_difference(rhs)
722 }
723}
724
725impl BitXorAssign for WlDataDeviceManagerDndAction {
726 fn bitxor_assign(&mut self, rhs: Self) {
727 *self = self.symmetric_difference(rhs);
728 }
729}
730
731impl Sub for WlDataDeviceManagerDndAction {
732 type Output = Self;
733
734 fn sub(self, rhs: Self) -> Self::Output {
735 self.difference(rhs)
736 }
737}
738
739impl SubAssign for WlDataDeviceManagerDndAction {
740 fn sub_assign(&mut self, rhs: Self) {
741 *self = self.difference(rhs);
742 }
743}
744
745impl Not for WlDataDeviceManagerDndAction {
746 type Output = Self;
747
748 fn not(self) -> Self::Output {
749 self.complement()
750 }
751}
752
753impl Debug for WlDataDeviceManagerDndAction {
754 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
755 let mut v = self.0;
756 let mut first = true;
757 if v & 1 == 1 {
758 v &= !1;
759 if first {
760 first = false;
761 } else {
762 f.write_str(" | ")?;
763 }
764 f.write_str("COPY")?;
765 }
766 if v & 2 == 2 {
767 v &= !2;
768 if first {
769 first = false;
770 } else {
771 f.write_str(" | ")?;
772 }
773 f.write_str("MOVE")?;
774 }
775 if v & 4 == 4 {
776 v &= !4;
777 if first {
778 first = false;
779 } else {
780 f.write_str(" | ")?;
781 }
782 f.write_str("ASK")?;
783 }
784 if v != 0 {
785 if first {
786 first = false;
787 } else {
788 f.write_str(" | ")?;
789 }
790 write!(f, "0x{v:032x}")?;
791 }
792 if first {
793 f.write_str("NONE")?;
794 }
795 Ok(())
796 }
797}