simplelayer/
simplelayer.rs

1use std::fs::File;
2use std::os::fd::AsFd;
3
4use layershellev::keyboard::{KeyCode, PhysicalKey};
5use layershellev::reexport::*;
6use layershellev::*;
7
8fn main() {
9    let ev: WindowState<()> = WindowState::new("Hello")
10        .with_allscreens()
11        .with_size((0, 400))
12        .with_layer(Layer::Top)
13        .with_margin((20, 20, 100, 20))
14        .with_anchor(Anchor::Bottom | Anchor::Left | Anchor::Right)
15        .with_keyboard_interacivity(KeyboardInteractivity::Exclusive)
16        .with_exclusive_zone(-1)
17        .build()
18        .unwrap();
19
20    ev.running(move |event, ev, index| {
21        match event {
22            // NOTE: this will send when init, you can request bind extra object from here
23            LayerShellEvent::InitRequest => ReturnData::RequestBind,
24            LayerShellEvent::BindProvide(globals, qh) => {
25                // NOTE: you can get implied wayland object from here
26                let virtual_keyboard_manager = globals
27                    .bind::<zwp_virtual_keyboard_v1::ZwpVirtualKeyboardManagerV1, _, _>(
28                        qh,
29                        1..=1,
30                        (),
31                    )
32                    .unwrap();
33                println!("{:?}", virtual_keyboard_manager);
34                ReturnData::RequestCompositor
35            }
36            LayerShellEvent::CompositorProvide(compositor, qh) => {
37                // NOTE: you can set input region to limit area which gets input events
38                // surface outside region becomes transparent for input events
39                // To ignore all input events use region with (0,0) size
40                for x in ev.get_unit_iter() {
41                    let region = compositor.create_region(qh, ());
42                    region.add(0, 0, 0, 0);
43                    x.get_wlsurface().set_input_region(Some(&region));
44                }
45                ReturnData::None
46            }
47            LayerShellEvent::XdgInfoChanged(_) => {
48                let index = index.unwrap();
49                let unit = ev.get_unit_with_id(index).unwrap();
50                println!("{:?}", unit.get_xdgoutput_info());
51                ReturnData::None
52            }
53            LayerShellEvent::RequestBuffer(file, shm, qh, init_w, init_h) => {
54                draw(file, (init_w, init_h));
55                let pool = shm.create_pool(file.as_fd(), (init_w * init_h * 4) as i32, qh, ());
56                ReturnData::WlBuffer(pool.create_buffer(
57                    0,
58                    init_w as i32,
59                    init_h as i32,
60                    (init_w * 4) as i32,
61                    wl_shm::Format::Argb8888,
62                    qh,
63                    (),
64                ))
65            }
66            LayerShellEvent::RequestMessages(DispatchMessage::RequestRefresh {
67                width,
68                height,
69                ..
70            }) => {
71                println!("{width}, {height}");
72                ReturnData::None
73            }
74            LayerShellEvent::RequestMessages(DispatchMessage::MouseButton { .. }) => {
75                ReturnData::None
76            }
77            LayerShellEvent::RequestMessages(DispatchMessage::MouseEnter { pointer, .. }) => {
78                ReturnData::RequestSetCursorShape(("crosshair".to_owned(), pointer.clone()))
79            }
80            LayerShellEvent::RequestMessages(DispatchMessage::MouseMotion {
81                time,
82                surface_x,
83                surface_y,
84            }) => {
85                println!("{time}, {surface_x}, {surface_y}");
86                ReturnData::None
87            }
88            LayerShellEvent::RequestMessages(DispatchMessage::KeyboardInput { event, .. }) => {
89                if let PhysicalKey::Code(KeyCode::Escape) = event.physical_key {
90                    ReturnData::RequestExit
91                } else {
92                    ReturnData::None
93                }
94            }
95            _ => ReturnData::None,
96        }
97    })
98    .unwrap();
99}
100
101fn draw(tmp: &mut File, (buf_x, buf_y): (u32, u32)) {
102    use std::{cmp::min, io::Write};
103    let mut buf = std::io::BufWriter::new(tmp);
104    for y in 0..buf_y {
105        for x in 0..buf_x {
106            let a = 0xFF;
107            let r = min(((buf_x - x) * 0xFF) / buf_x, ((buf_y - y) * 0xFF) / buf_y);
108            let g = min((x * 0xFF) / buf_x, ((buf_y - y) * 0xFF) / buf_y);
109            let b = min(((buf_x - x) * 0xFF) / buf_x, (y * 0xFF) / buf_y);
110
111            let color = (a << 24) + (r << 16) + (g << 8) + b;
112            buf.write_all(&color.to_ne_bytes()).unwrap();
113        }
114    }
115    buf.flush().unwrap();
116}