use smithay::backend::renderer::element::solid::SolidColorRenderElement;
use smithay::backend::renderer::element::surface::WaylandSurfaceRenderElement;
use smithay::backend::renderer::Renderer;
#[thin_delegate::external_trait_def(with_uses = true)]
mod external_trait_def {
use smithay::backend::renderer::element::{Id, Kind, UnderlyingStorage};
use smithay::backend::renderer::utils::CommitCounter;
use smithay::backend::renderer::{ImportAll, ImportMem, Renderer};
use smithay::utils::{Buffer as BufferCoords, Physical, Point, Rectangle, Scale, Transform};
#[thin_delegate::register]
pub trait Element {
fn id(&self) -> &Id;
fn current_commit(&self) -> CommitCounter;
fn location(&self, scale: Scale<f64>) -> Point<i32, Physical> {
self.geometry(scale).loc
}
fn src(&self) -> Rectangle<f64, BufferCoords>;
fn transform(&self) -> Transform {
Transform::Normal
}
fn geometry(&self, scale: Scale<f64>) -> Rectangle<i32, Physical>;
fn damage_since(
&self,
scale: Scale<f64>,
commit: Option<CommitCounter>,
) -> Vec<Rectangle<i32, Physical>> {
if commit != Some(self.current_commit()) {
vec![Rectangle::from_loc_and_size(
(0, 0),
self.geometry(scale).size,
)]
} else {
vec![]
}
}
fn opaque_regions(&self, _scale: Scale<f64>) -> Vec<Rectangle<i32, Physical>> {
vec![]
}
fn alpha(&self) -> f32 {
1.0
}
fn kind(&self) -> Kind {
Kind::default()
}
}
#[thin_delegate::register]
pub trait RenderElement<R: Renderer>: Element {
fn draw(
&self,
frame: &mut <R as Renderer>::Frame<'_>,
src: Rectangle<f64, BufferCoords>,
dst: Rectangle<i32, Physical>,
damage: &[Rectangle<i32, Physical>],
) -> Result<(), R::Error>;
fn underlying_storage(&self, renderer: &mut R) -> Option<UnderlyingStorage> {
let _ = renderer;
None
}
}
}
#[derive(derive_more::From)]
#[thin_delegate::register]
pub enum WindowRenderElement<R>
where
R: Renderer,
{
Window(WaylandSurfaceRenderElement<R>),
Decoration(SolidColorRenderElement),
}
#[thin_delegate::fill_delegate(external_trait_def = external_trait_def)]
impl<R> smithay::backend::renderer::element::Element for WindowRenderElement<R>
where
R: smithay::backend::renderer::Renderer,
<R as smithay::backend::renderer::Renderer>::TextureId: 'static,
R: ImportAll + ImportMem,
{
}
#[thin_delegate::fill_delegate(external_trait_def = external_trait_def)]
impl<R> smithay::backend::renderer::element::RenderElement<R> for WindowRenderElement<R>
where
R: smithay::backend::renderer::Renderer,
<R as smithay::backend::renderer::Renderer>::TextureId: 'static,
R: ImportAll + ImportMem,
{
}
fn main() {}