element: Refactor element acquisition to be push based

This commit is contained in:
Victoria Brekenfeld 2026-03-04 18:57:37 +01:00 committed by Victoria Brekenfeld
parent 178c6593dc
commit e4c0716951
18 changed files with 1096 additions and 1137 deletions

View file

@ -35,7 +35,7 @@ use smithay::{
renderer::{
ImportMem, Renderer,
element::{
AsRenderElements, Kind,
Kind,
memory::{MemoryRenderBuffer, MemoryRenderBufferRenderElement},
},
},
@ -910,21 +910,18 @@ impl<P: Program + Send + 'static> SpaceElement for IcedElement<P> {
}
}
impl<P, R> AsRenderElements<R> for IcedElement<P>
where
P: Program + Send + 'static,
R: Renderer + ImportMem,
R::TextureId: Send + Clone + 'static,
{
type RenderElement = MemoryRenderBufferRenderElement<R>;
fn render_elements<C: From<Self::RenderElement>>(
impl<P: Program + Send + 'static> IcedElement<P> {
pub fn push_render_elements<R>(
&self,
renderer: &mut R,
location: Point<i32, Physical>,
mut scale: Scale<f64>,
alpha: f32,
) -> Vec<C> {
push: &mut dyn FnMut(MemoryRenderBufferRenderElement<R>),
) where
R: Renderer + ImportMem,
R::TextureId: Send + Clone + 'static,
{
let mut internal = self.0.lock().unwrap();
// makes partial borrows easier
let internal_ref = &mut *internal;
@ -1055,11 +1052,10 @@ where
Kind::Unspecified,
) {
Ok(buffer) => {
return vec![C::from(buffer)];
push(buffer);
}
Err(err) => tracing::warn!("What? {:?}", err),
}
}
Vec::new()
}
}

View file

@ -14,7 +14,7 @@ use smithay::{
use tracing::warn;
use crate::{
backend::render::{RendererRef, element::AsGlowRenderer, wayland::SurfaceRenderElement},
backend::render::{RendererRef, element::AsGlowRenderer},
shell::element::CosmicSurface,
state::{State, advertised_node_for_surface},
};
@ -27,7 +27,8 @@ pub fn screenshot_window(state: &mut State, surface: &CosmicSurface) {
R::Error: Send + Sync + 'static,
{
let bbox = bbox_from_surface_tree(&window.wl_surface().unwrap(), (0, 0));
let elements = window.render_elements::<R, SurfaceRenderElement<R>>(
let mut elements = Vec::new();
window.push_render_elements(
renderer,
(-bbox.loc.x, -bbox.loc.y).into(),
Scale::from(1.0),
@ -36,6 +37,8 @@ pub fn screenshot_window(state: &mut State, surface: &CosmicSurface) {
None,
false,
[0; 4],
&mut |elem| elements.push(elem),
None,
);
// TODO: 10-bit