// We need to implement RenderElement manually due to AsGlesFrame requirement. // This macro does it for us. #[macro_export] macro_rules! niri_render_elements { ($name:ident => { $($variant:ident = $type:ty),+ $(,)? }) => { #[derive(Debug)] pub enum $name { $($variant($type)),+ } impl smithay::backend::renderer::element::Element for $name { fn id(&self) -> &smithay::backend::renderer::element::Id { match self { $($name::$variant(elem) => elem.id()),+ } } fn current_commit(&self) -> smithay::backend::renderer::utils::CommitCounter { match self { $($name::$variant(elem) => elem.current_commit()),+ } } fn geometry(&self, scale: smithay::utils::Scale) -> Rectangle { match self { $($name::$variant(elem) => elem.geometry(scale)),+ } } fn transform(&self) -> smithay::utils::Transform { match self { $($name::$variant(elem) => elem.transform()),+ } } fn src(&self) -> smithay::utils::Rectangle { match self { $($name::$variant(elem) => elem.src()),+ } } fn damage_since( &self, scale: smithay::utils::Scale, commit: Option, ) -> Vec> { match self { $($name::$variant(elem) => elem.damage_since(scale, commit)),+ } } fn opaque_regions(&self, scale: smithay::utils::Scale) -> Vec> { match self { $($name::$variant(elem) => elem.opaque_regions(scale)),+ } } fn alpha(&self) -> f32 { match self { $($name::$variant(elem) => elem.alpha()),+ } } fn kind(&self) -> smithay::backend::renderer::element::Kind { match self { $($name::$variant(elem) => elem.kind()),+ } } } impl smithay::backend::renderer::element::RenderElement for $name { fn draw( &self, frame: &mut smithay::backend::renderer::gles::GlesFrame<'_>, src: smithay::utils::Rectangle, dst: smithay::utils::Rectangle, damage: &[smithay::utils::Rectangle], ) -> Result<(), smithay::backend::renderer::gles::GlesError> { match self { $($name::$variant(elem) => { smithay::backend::renderer::element::RenderElement::::draw(elem, frame, src, dst, damage) })+ } } fn underlying_storage(&self, renderer: &mut smithay::backend::renderer::gles::GlesRenderer) -> Option { match self { $($name::$variant(elem) => elem.underlying_storage(renderer)),+ } } } impl<'render, 'alloc> smithay::backend::renderer::element::RenderElement<$crate::backend::tty::TtyRenderer<'render, 'alloc>> for $name<$crate::backend::tty::TtyRenderer<'render, 'alloc>> { fn draw( &self, frame: &mut $crate::backend::tty::TtyFrame<'render, 'alloc, '_>, src: smithay::utils::Rectangle, dst: smithay::utils::Rectangle, damage: &[smithay::utils::Rectangle], ) -> Result<(), $crate::backend::tty::TtyRendererError<'render, 'alloc>> { match self { $($name::$variant(elem) => { smithay::backend::renderer::element::RenderElement::<$crate::backend::tty::TtyRenderer<'render, 'alloc>>::draw(elem, frame, src, dst, damage) })+ } } fn underlying_storage( &self, renderer: &mut $crate::backend::tty::TtyRenderer<'render, 'alloc>, ) -> Option { match self { $($name::$variant(elem) => elem.underlying_storage(renderer)),+ } } } $(impl From<$type> for $name { fn from(x: $type) -> Self { Self::$variant(x) } })+ }; }