mutsumi 0.3.0

wl-proxy based GTK MPV embedder
use std::{cell::RefCell, os::fd::OwnedFd, rc::Rc};

use wl_proxy::protocols::{
    drm::wl_drm::{WlDrm, WlDrmHandler},
    wayland::wl_buffer::WlBuffer,
};

use super::{SharedState, dmabuf::register_implicit_dmabuf};

pub struct DrmHandler {
    pub state: Rc<RefCell<SharedState>>,
}

impl WlDrmHandler for DrmHandler {
    fn handle_create_buffer(
        &mut self,
        _slf: &Rc<WlDrm>,
        _id: &Rc<WlBuffer>,
        _name: u32,
        _width: i32,
        _height: i32,
        _stride: u32,
        _format: u32,
    ) {
        tracing::warn!(
            "wl-proxy-mpv: wl_drm GEM-name buffers are unsupported; PRIME capability is required"
        );
    }

    fn handle_create_planar_buffer(
        &mut self,
        _slf: &Rc<WlDrm>,
        _id: &Rc<WlBuffer>,
        _name: u32,
        _width: i32,
        _height: i32,
        _format: u32,
        _offset0: i32,
        _stride0: i32,
        _offset1: i32,
        _stride1: i32,
        _offset2: i32,
        _stride2: i32,
    ) {
        tracing::warn!(
            "wl-proxy-mpv: wl_drm GEM-name planar buffers are unsupported; PRIME capability is required"
        );
    }

    fn handle_create_prime_buffer(
        &mut self,
        _slf: &Rc<WlDrm>,
        id: &Rc<WlBuffer>,
        fd: &Rc<OwnedFd>,
        width: i32,
        height: i32,
        format: u32,
        offset0: i32,
        stride0: i32,
        offset1: i32,
        stride1: i32,
        offset2: i32,
        stride2: i32,
    ) {
        register_implicit_dmabuf(
            &self.state,
            id,
            fd,
            width,
            height,
            format,
            &[(offset0, stride0), (offset1, stride1), (offset2, stride2)],
        );
    }
}