simplelayer/
simplelayer.rs1use 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 LayerShellEvent::InitRequest => ReturnData::RequestBind,
24 LayerShellEvent::BindProvide(globals, qh) => {
25 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 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(®ion));
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}