diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-21 09:05:41 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-21 09:12:40 +0400 |
| commit | 9ce19ad7de3e2495a3e1f67a1caa89b082be2188 (patch) | |
| tree | d98e4a9fbd30de43f9b59bb018b357a9ed494b7b /src/render_helpers | |
| parent | 751f79dc35cb61e685273fbaa67930c76dae5147 (diff) | |
| download | niri-9ce19ad7de3e2495a3e1f67a1caa89b082be2188.tar.gz niri-9ce19ad7de3e2495a3e1f67a1caa89b082be2188.tar.bz2 niri-9ce19ad7de3e2495a3e1f67a1caa89b082be2188.zip | |
Use niri_render_elements! for the screenshot UI
Diffstat (limited to 'src/render_helpers')
| -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) - } - })+ }; } |
