chore: refresco desde el monorepo (pin tawasuyu.git v0.2.0)
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);