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