1use {
4 crate::{
5 endpoint::Endpoint, handler::HandlerHolder, object::Object,
6 protocols::wayland::wl_display::WlDisplay, state::State,
7 },
8 std::{cell::Cell, rc::Rc},
9};
10
11#[cfg(test)]
12mod tests;
13
14pub struct Client {
22 pub(crate) state: Rc<State>,
23 pub(crate) endpoint: Rc<Endpoint>,
24 pub(crate) display: Rc<WlDisplay>,
25 pub(crate) destroyed: Cell<bool>,
26 pub(crate) handler: HandlerHolder<dyn ClientHandler>,
27}
28
29pub trait ClientHandler: 'static {
31 fn disconnected(self: Box<Self>) {
35 }
37}
38
39impl Client {
40 pub fn set_handler(&self, handler: impl ClientHandler) {
42 self.set_boxed_handler(Box::new(handler));
43 }
44
45 pub fn set_boxed_handler(&self, handler: Box<dyn ClientHandler>) {
47 if self.destroyed.get() {
48 return;
49 }
50 self.handler.set(Some(handler));
51 }
52
53 pub fn unset_handler(&self) {
55 self.handler.set(None);
56 }
57
58 pub fn objects(&self, objects: &mut Vec<Rc<dyn Object>>) {
63 objects.extend(self.endpoint.objects.borrow().values().cloned());
64 }
65
66 pub fn display(&self) -> &Rc<WlDisplay> {
68 &self.display
69 }
70
71 pub fn disconnect(&self) {
75 if self.destroyed.replace(true) {
76 return;
77 }
78 let proxies = &mut *self.state.object_stash.borrow();
79 for (_, object) in self.endpoint.objects.borrow_mut().drain() {
80 let core = object.core();
81 core.client.take();
82 core.client_id.take();
83 core.client_obj_id.take();
84 proxies.push(object);
85 }
86 self.handler.set(None);
87 self.state.remove_endpoint(&self.endpoint);
88 }
89}