use crate::format::formats;
use crate::format::map_wayland_format_id;
use crate::object::Version;
use crate::utils::copyhashmap::CopyHashMap;
use crate::wire::WlShmId;
use crate::wire::wl_shm::*;
use crate::wl_usr::UsrCon;
use crate::wl_usr::usr_ifs::usr_wl_shm_pool::UsrWlShmPool;
use crate::wl_usr::usr_object::UsrObject;
use std::convert::Infallible;
use std::rc::Rc;
use uapi::OwnedFd;
pub struct UsrWlShm {
id: WlShmId,
con: Rc<UsrCon>,
formats: CopyHashMap<u32, &'static crate::format::Format>,
version: Version,
}
impl UsrWlShm {
#[expect(unused)]
pub fn create_pool(&self, fd: &Rc<OwnedFd>, size: i32) -> Rc<UsrWlShmPool> {
let pool = Rc::new(UsrWlShmPool {
id: self.con.id(),
con: self.con.clone(),
version: self.version,
});
self.con.request(CreatePool {
self_id: self.id,
id: pool.id,
fd: fd.clone(),
size,
});
self.con.add_object(pool.clone());
pool
}
}
impl WlShmEventHandler for UsrWlShm {
type Error = Infallible;
fn format(&self, ev: Format, _slf: &Rc<Self>) -> Result<(), Self::Error> {
let format = map_wayland_format_id(ev.format);
if let Some(format) = formats().get(&format) {
self.formats.set(format.drm, *format);
}
Ok(())
}
}
usr_object_base! {
self = UsrWlShm = WlShm;
version = self.version;
}
impl UsrObject for UsrWlShm {
fn destroy(&self) {
}
}