aboutsummaryrefslogtreecommitdiff
path: root/src/render_helpers/render_elements.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/render_helpers/render_elements.rs')
-rw-r--r--src/render_helpers/render_elements.rs42
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)
- }
- })+
};
}