tawasuyu

tawasuyu/mirada

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

Rust 50Markdown 30TOML 211282 Definiciones

⎇ main vendor/smithay/examples/seat.rs Rust · 108 líneas · 3.1 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::input::{keyboard::FilterResult, Seat, SeatHandler, SeatState};
4use smithay::reexports::wayland_server::{
5    backend::{ClientData, ClientId, DisconnectReason},
6    protocol::wl_surface::WlSurface,
7    Display, ListeningSocket,
8};
9use smithay::wayland::compositor::{CompositorClientState, CompositorHandler, CompositorState};
10use smithay::{delegate_compositor, delegate_seat};
11
12struct App {
13    compositor_state: CompositorState,
14    seat_state: SeatState<Self>,
15    seat: Seat<Self>,
16}
17
18impl SeatHandler for App {
19    type KeyboardFocus = WlSurface;
20    type PointerFocus = WlSurface;
21    type TouchFocus = WlSurface;
22
23    fn seat_state(&mut self) -> &mut SeatState<Self> {
24        &mut self.seat_state
25    }
26
27    fn focus_changed(&mut self, _seat: &Seat<Self>, _focused: Option<&WlSurface>) {}
28    fn cursor_image(&mut self, _seat: &Seat<Self>, _image: smithay::input::pointer::CursorImageStatus) {}
29}
30
31fn main() -> Result<(), Box<dyn std::error::Error>> {
32    let mut display: Display<App> = Display::new()?;
33    let dh = display.handle();
34
35    let compositor_state = CompositorState::new::<App>(&dh);
36    let mut seat_state = SeatState::new();
37    let seat = seat_state.new_wl_seat(&dh, "Example");
38
39    let mut state = App {
40        compositor_state,
41        seat_state,
42        seat,
43    };
44
45    let keyboard = state.seat.add_keyboard(Default::default(), 25, 600)?;
46
47    let listener = ListeningSocket::bind("wayland-5").unwrap();
48
49    let mut clients = Vec::new();
50
51    loop {
52        if let Some(stream) = listener.accept().unwrap() {
53            println!("Got a client: {:?}", stream);
54
55            let client = display
56                .handle()
57                .insert_client(stream, Arc::new(ClientState(CompositorClientState::default())))
58                .unwrap();
59            clients.push(client);
60        }
61
62        keyboard.input(
63            &mut state,
64            smithay::backend::input::Keycode::from(9u32),
65            smithay::backend::input::KeyState::Pressed,
66            0.into(),
67            0,
68            |_, _, _| {
69                if false {
70                    FilterResult::Intercept(0)
71                } else {
72                    FilterResult::Forward
73                }
74            },
75        );
76
77        keyboard.set_focus(&mut state, Option::<WlSurface>::None, 0.into());
78
79        display.dispatch_clients(&mut state)?;
80        display.flush_clients()?;
81    }
82}
83
84struct ClientState(CompositorClientState);
85impl ClientData for ClientState {
86    fn initialized(&self, _client_id: ClientId) {
87        println!("initialized");
88    }
89
90    fn disconnected(&self, _client_id: ClientId, _reason: DisconnectReason) {
91        println!("disconnected");
92    }
93}
94
95impl CompositorHandler for App {
96    fn compositor_state(&mut self) -> &mut CompositorState {
97        &mut self.compositor_state
98    }
99
100    fn client_compositor_state<'a>(&self, client: &'a wayland_server::Client) -> &'a CompositorClientState {
101        &client.get_data::<ClientState>().unwrap().0
102    }
103
104    fn commit(&mut self, _surface: &WlSurface) {}
105}
106
107delegate_compositor!(App);
108delegate_seat!(App);