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_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 LayerEvent::InitRequest => ReturnData::RequestBind,
25 LayerEvent::BindProvide(globals, qh) => {
26 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 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(®ion));
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}