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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#![warn(missing_debug_implementations)]
#![forbid(improper_ctypes, unsafe_op_in_unsafe_fn)]
use wayland_backend::{
protocol::{Interface, Message},
server::{InvalidId, ObjectId},
};
mod client;
mod dispatch;
mod display;
mod global;
pub mod socket;
pub use client::Client;
pub use dispatch::{DataInit, DelegateDispatch, Dispatch, New, ResourceData};
pub use display::{Display, DisplayHandle};
pub use global::{DelegateGlobalDispatch, GlobalDispatch};
pub mod backend {
pub use wayland_backend::protocol;
pub use wayland_backend::server::{
Backend, ClientData, ClientId, Credentials, DisconnectReason, GlobalHandler, GlobalId,
Handle, InitError, InvalidId, ObjectData, ObjectId, WeakHandle,
};
pub use wayland_backend::smallvec;
}
pub use wayland_backend::protocol::WEnum;
pub mod protocol {
use self::__interfaces::*;
use crate as wayland_server;
pub mod __interfaces {
wayland_scanner::generate_interfaces!("wayland.xml");
}
wayland_scanner::generate_server_code!("wayland.xml");
}
pub trait Resource: Sized {
type Event;
type Request;
fn interface() -> &'static Interface;
fn id(&self) -> ObjectId;
fn version(&self) -> u32;
fn data<U: 'static>(&self) -> Option<&U>;
fn object_data(&self) -> Option<&std::sync::Arc<dyn std::any::Any + Send + Sync>>;
fn handle(&self) -> &backend::WeakHandle;
fn from_id(dh: &DisplayHandle, id: ObjectId) -> Result<Self, InvalidId>;
fn send_event(&self, evt: Self::Event) -> Result<(), InvalidId>;
fn parse_request(
dh: &DisplayHandle,
msg: Message<ObjectId>,
) -> Result<(Self, Self::Request), DispatchError>;
fn write_event(
&self,
dh: &DisplayHandle,
req: Self::Event,
) -> Result<Message<ObjectId>, InvalidId>;
#[inline]
fn post_error(&self, dh: &DisplayHandle, code: impl Into<u32>, error: impl Into<String>) {
dh.post_error(self, code.into(), error.into())
}
#[doc(hidden)]
fn __set_object_data(
&mut self,
odata: std::sync::Arc<dyn std::any::Any + Send + Sync + 'static>,
);
}
#[derive(thiserror::Error, Debug)]
pub enum DispatchError {
#[error("Bad message for interface {interface} : {msg:?}")]
BadMessage { msg: Message<ObjectId>, interface: &'static str },
#[error("Unexpected interface {interface} for message {msg:?}")]
NoHandler { msg: Message<ObjectId>, interface: &'static str },
}