render_elements

Macro render_elements 

Source
macro_rules! render_elements {
    ($(#[$attr:meta])* $vis:vis $name:ident<=$lt:lifetime, $renderer:ty, $custom:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<=$lt:lifetime, $renderer:ty, $($custom:ident),+> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<=$lt:lifetime, $renderer:ty>; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<=$renderer:ty, $custom:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<=$renderer:ty, $($custom:ident),+> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<=$renderer:ty>; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<$lt:lifetime, $renderer:ident, $custom:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<$lt:lifetime, $renderer:ident, $($custom:ident),+> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<$lt:lifetime, $renderer:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<$renderer:ident, $custom:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<$renderer:ident, $($custom:ident),+> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident<$renderer:ident> $(where $($target:ty: $bound:tt $(+ $additional_bound:tt)*),+)?; $($tail:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis $name:ident; $($tail:tt)*) => { ... };
}
Expand description

Aggregate multiple types implementing RenderElement into a single enum type

use smithay::backend::renderer::element::render_elements;

render_elements! {
    MyRenderElements;
    First=MyRenderElement1,
    Second=MyRenderElement2,
}

If the RenderElement has special requirements on the Renderer you can express them with a syntax similar to HRTBs.

For example the MemoryRenderBufferRenderElement requires the Renderer to implement the ImportMem trait.

use smithay::backend::renderer::{
    element::{memory::MemoryRenderBufferRenderElement, render_elements},
    ImportMem,
};

render_elements! {
    MyRenderElements<R> where R: ImportMem;
    Memory=MemoryRenderBufferRenderElement<R>,
}

In case you want to use a reference or an element with an explicit lifetime the macro additionally takes a lifetime on the defined enum.

use smithay::backend::renderer::{
    element::{memory::MemoryRenderBufferRenderElement, render_elements},
    ImportMem,
};

render_elements! {
    MyRenderElements<'a, R> where R: ImportMem;
    Memory=&'a MemoryRenderBufferRenderElement<R>,
}

Additionally the macro can be used to define generic enums

use smithay::backend::renderer::{
    element::{memory::MemoryRenderBufferRenderElement, render_elements},
    ImportMem,
};

render_elements! {
    MyRenderElements<'a, R, A, B> where R: ImportMem;
    Memory=&'a MemoryRenderBufferRenderElement<R>,
    Owned=A,
    Borrowed=&'a B,
}

If your elements require a specific Renderer instead of being generic over it you can specify the type like in the following example.

use smithay::backend::renderer::element::{render_elements, texture::TextureRenderElement};

render_elements! {
    MyRenderElements<=GlesRenderer>;
    Texture=TextureRenderElement<GlesTexture>,
}