diff options
Diffstat (limited to 'src/render_helpers/render_elements.rs')
| -rw-r--r-- | src/render_helpers/render_elements.rs | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/src/render_helpers/render_elements.rs b/src/render_helpers/render_elements.rs index 1f100536..8b30e1ac 100644 --- a/src/render_helpers/render_elements.rs +++ b/src/render_helpers/render_elements.rs @@ -2,13 +2,39 @@ // This macro does it for us. #[macro_export] macro_rules! niri_render_elements { + // The two callable variants: with <R> and without <R>. They include From impls because nested + // repetitions ($type and $variant with + and $R with ?) don't work properly. + ($name:ident<R> => { $($variant:ident = $type:ty),+ $(,)? }) => { + $crate::niri_render_elements!(@impl $name () ($name<R>) => { $($variant = $type),+ }); + + $(impl<R: $crate::render_helpers::renderer::NiriRenderer> From<$type> for $name<R> { + fn from(x: $type) -> Self { + Self::$variant(x) + } + })+ + }; + ($name:ident => { $($variant:ident = $type:ty),+ $(,)? }) => { + $crate::niri_render_elements!(@impl $name ($name) () => { $($variant = $type),+ }); + + $(impl From<$type> for $name { + fn from(x: $type) -> Self { + Self::$variant(x) + } + })+ + }; + + // The internal variant that generates most of the code. $name_no_R and $name_R are necessary + // for the impl RenderElement<SomeRenderer> for $name<SomeRenderer>: since $R does not appear + // in this line, we cannot condition based on $R like elsewhere, so we condition on duplicate + // names instead. Like this: $($name_R<SomeRenderer>)? $($name_no_R)? so only one is chosen. + (@impl $name:ident ($($name_no_R:ident)?) ($($name_R:ident<$R:ident>)?) => { $($variant:ident = $type:ty),+ }) => { #[derive(Debug)] - pub enum $name<R: $crate::render_helpers::renderer::NiriRenderer> { + pub enum $name$(<$R: $crate::render_helpers::renderer::NiriRenderer>)? { $($variant($type)),+ } - impl<R: $crate::render_helpers::renderer::NiriRenderer> smithay::backend::renderer::element::Element for $name<R> { + impl$(<$R: $crate::render_helpers::renderer::NiriRenderer>)? smithay::backend::renderer::element::Element for $name$(<$R>)? { fn id(&self) -> &smithay::backend::renderer::element::Id { match self { $($name::$variant(elem) => elem.id()),+ @@ -68,7 +94,9 @@ macro_rules! niri_render_elements { } } - impl smithay::backend::renderer::element::RenderElement<smithay::backend::renderer::gles::GlesRenderer> for $name<smithay::backend::renderer::gles::GlesRenderer> { + impl smithay::backend::renderer::element::RenderElement<smithay::backend::renderer::gles::GlesRenderer> + for $($name_R<smithay::backend::renderer::gles::GlesRenderer>)? $($name_no_R)? + { fn draw( &self, frame: &mut smithay::backend::renderer::gles::GlesFrame<'_>, @@ -91,7 +119,7 @@ macro_rules! niri_render_elements { } impl<'render> smithay::backend::renderer::element::RenderElement<$crate::backend::tty::TtyRenderer<'render>> - for $name<$crate::backend::tty::TtyRenderer<'render>> + for $($name_R<$crate::backend::tty::TtyRenderer<'render>>)? $($name_no_R)? { fn draw( &self, @@ -116,11 +144,5 @@ macro_rules! niri_render_elements { } } } - - $(impl<R: $crate::render_helpers::renderer::NiriRenderer> From<$type> for $name<R> { - fn from(x: $type) -> Self { - Self::$variant(x) - } - })+ }; } |
