use smithay_client_toolkit::{
reexports::{
client::{
protocol::{wl_buffer::WlBuffer, wl_shm},
QueueHandle,
},
protocols::wp::single_pixel_buffer::v1::client::wp_single_pixel_buffer_manager_v1::WpSinglePixelBufferManagerV1,
},
registry::SimpleGlobal,
shm::{
slot::{self, SlotPool},
Shm,
},
};
use crate::DimData;
pub enum BufferManager {
SinglePixel(SimpleGlobal<WpSinglePixelBufferManagerV1, 1>),
Shm(Shm, SlotPool),
}
pub enum BufferType {
Wl(WlBuffer),
Shared(slot::Buffer),
}
impl BufferManager {
pub fn get_buffer(&mut self, qh: &QueueHandle<DimData>, alpha: f32) -> BufferType {
match self {
BufferManager::SinglePixel(simple_global) => {
let alpha = (u32::MAX as f32 * alpha) as u32;
BufferType::Wl(
simple_global
.get()
.expect("failed to get buffer")
.create_u32_rgba_buffer(0, 0, 0, alpha, qh, ()),
)
}
BufferManager::Shm(_, pool) => {
let (buffer, canvas) = pool
.create_buffer(1, 1, 4, wl_shm::Format::Argb8888)
.expect("Failed to get buffer from slot pool!");
(0..3).for_each(|i| {
canvas[i] = 0;
});
canvas[3] = (u8::MAX as f32 * alpha) as u8;
BufferType::Shared(buffer)
}
}
}
}