gioser

tawasuyu/mirada

Sovereign tiling Wayland compositor + window manager in Rust, on Llimphi.

Rust 50Markdown 30TOML 211282 Definiciones

⎇ main vendor/smithay/examples/compositor.rs Rust · 78 líneas · 2.0 KB Historia Quién tocó qué crudo

chore: refresco desde el monorepo (pin tawasuyu.git v0.2.0) a91da3fea · Sergio ·

1use std::sync::Arc;
2
3use smithay::delegate_compositor;
4use smithay::reexports::wayland_server::Display;
5
6use smithay::wayland::compositor::{CompositorClientState, CompositorHandler, CompositorState};
7
8use wayland_server::backend::{ClientData, ClientId, DisconnectReason};
9use wayland_server::protocol::wl_surface::WlSurface;
10use wayland_server::{Client, ListeningSocket};
11
12struct App {
13    compositor_state: CompositorState,
14}
15
16impl CompositorHandler for App {
17    fn compositor_state(&mut self) -> &mut CompositorState {
18        &mut self.compositor_state
19    }
20
21    fn client_compositor_state<'a>(&self, client: &'a Client) -> &'a CompositorClientState {
22        &client.get_data::<ClientState>().unwrap().compositor_state
23    }
24
25    fn commit(&mut self, surface: &WlSurface) {
26        dbg!("Commit", surface);
27    }
28}
29
30fn main() -> Result<(), Box<dyn std::error::Error>> {
31    let mut display: Display<App> = Display::new()?;
32    let dh = display.handle();
33
34    let compositor_state = CompositorState::new::<App>(&dh);
35
36    let mut state = App { compositor_state };
37
38    let listener = ListeningSocket::bind("wayland-5").unwrap();
39
40    let mut clients = Vec::new();
41
42    loop {
43        if let Some(stream) = listener.accept().unwrap() {
44            println!("Got a client: {:?}", stream);
45
46            let client = display
47                .handle()
48                .insert_client(stream, Arc::new(ClientState::default()))
49                .unwrap();
50            clients.push(client);
51        }
52
53        display.dispatch_clients(&mut state)?;
54        display.flush_clients()?;
55    }
56}
57
58#[derive(Default)]
59struct ClientState {
60    compositor_state: CompositorClientState,
61}
62impl ClientData for ClientState {
63    fn initialized(&self, _client_id: ClientId) {
64        println!("initialized");
65    }
66
67    fn disconnected(&self, _client_id: ClientId, _reason: DisconnectReason) {
68        println!("disconnected");
69    }
70}
71
72impl AsMut<CompositorState> for App {
73    fn as_mut(&mut self) -> &mut CompositorState {
74        &mut self.compositor_state
75    }
76}
77
78delegate_compositor!(App);