element: Refactor element acquisition to be push based
This commit is contained in:
parent
178c6593dc
commit
e4c0716951
18 changed files with 1096 additions and 1137 deletions
|
|
@ -598,42 +598,38 @@ impl CosmicMapped {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn popup_render_elements<R, C>(
|
||||
pub fn push_popup_render_elements<R>(
|
||||
&self,
|
||||
renderer: &mut R,
|
||||
location: smithay::utils::Point<i32, smithay::utils::Physical>,
|
||||
scale: smithay::utils::Scale<f64>,
|
||||
alpha: f32,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<C>
|
||||
where
|
||||
push: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
C: From<CosmicMappedRenderElement<R>>,
|
||||
{
|
||||
match &self.element {
|
||||
CosmicMappedInternal::Stack(s) => s
|
||||
.popup_render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
location,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_node,
|
||||
),
|
||||
CosmicMappedInternal::Window(w) => w
|
||||
.popup_render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
location,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_node,
|
||||
),
|
||||
CosmicMappedInternal::Stack(s) => s.push_popup_render_elements(
|
||||
renderer,
|
||||
location,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_node,
|
||||
&mut |elem| push(elem.into()),
|
||||
),
|
||||
CosmicMappedInternal::Window(w) => w.push_popup_render_elements(
|
||||
renderer,
|
||||
location,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_node,
|
||||
&mut |elem| push(elem.into()),
|
||||
),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
.into_iter()
|
||||
.map(C::from)
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn shadow_render_element<R, C>(
|
||||
|
|
@ -680,7 +676,7 @@ impl CosmicMapped {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn render_elements<R, C>(
|
||||
pub fn push_render_elements<R>(
|
||||
&self,
|
||||
renderer: &mut R,
|
||||
location: smithay::utils::Point<i32, smithay::utils::Physical>,
|
||||
|
|
@ -689,15 +685,15 @@ impl CosmicMapped {
|
|||
alpha: f32,
|
||||
scanout_override: Option<bool>,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<C>
|
||||
where
|
||||
push_above: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
push_below: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
C: From<CosmicMappedRenderElement<R>>,
|
||||
{
|
||||
#[cfg(feature = "debug")]
|
||||
let mut elements = if let Some(debug) = self.debug.lock().unwrap().as_mut() {
|
||||
if let Some(debug) = self.debug.lock().unwrap().as_mut() {
|
||||
let window = self.active_window();
|
||||
let window_geo = window.geometry();
|
||||
let (min_size, max_size, size) = (
|
||||
|
|
@ -858,21 +854,15 @@ impl CosmicMapped {
|
|||
scale.x,
|
||||
0.8,
|
||||
) {
|
||||
Ok(element) => vec![CosmicMappedRenderElement::from(element)],
|
||||
Ok(element) => push_above(element.into()),
|
||||
Err(err) => {
|
||||
debug!(?err, "Error rendering debug overlay.");
|
||||
Vec::new()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
#[cfg(not(feature = "debug"))]
|
||||
let mut elements = Vec::new();
|
||||
|
||||
#[cfg_attr(not(feature = "debug"), allow(unused_mut))]
|
||||
elements.extend(match &self.element {
|
||||
CosmicMappedInternal::Stack(s) => s.render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
match &self.element {
|
||||
CosmicMappedInternal::Stack(s) => s.push_render_elements(
|
||||
renderer,
|
||||
location,
|
||||
max_size,
|
||||
|
|
@ -880,21 +870,22 @@ impl CosmicMapped {
|
|||
alpha,
|
||||
scanout_override,
|
||||
scanout_node,
|
||||
&mut |elem| push_above(elem.into()),
|
||||
&mut |elem| push_below(elem.into()),
|
||||
),
|
||||
CosmicMappedInternal::Window(w) => w.push_render_elements(
|
||||
renderer,
|
||||
location,
|
||||
max_size,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_override,
|
||||
scanout_node,
|
||||
&mut |elem| push_above(elem.into()),
|
||||
&mut |elem| push_below(elem.into()),
|
||||
),
|
||||
CosmicMappedInternal::Window(w) => w
|
||||
.render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
location,
|
||||
max_size,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_override,
|
||||
scanout_node,
|
||||
),
|
||||
_ => unreachable!(),
|
||||
});
|
||||
|
||||
elements.into_iter().map(C::from).collect()
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn update_theme(&self, theme: cosmic::Theme) {
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@ use smithay::{
|
|||
renderer::{
|
||||
ImportAll, ImportMem, Renderer,
|
||||
element::{
|
||||
AsRenderElements, Element, Id as RendererId, Kind, RenderElement,
|
||||
UnderlyingStorage, memory::MemoryRenderBufferRenderElement,
|
||||
Element, Id as RendererId, Kind, RenderElement, UnderlyingStorage,
|
||||
memory::MemoryRenderBufferRenderElement,
|
||||
},
|
||||
gles::element::PixelShaderElement,
|
||||
glow::GlowRenderer,
|
||||
|
|
@ -645,35 +645,31 @@ impl CosmicStack {
|
|||
self.0.loop_handle()
|
||||
}
|
||||
|
||||
pub fn popup_render_elements<R, C>(
|
||||
pub fn push_popup_render_elements<R>(
|
||||
&self,
|
||||
renderer: &mut R,
|
||||
location: Point<i32, Physical>,
|
||||
scale: Scale<f64>,
|
||||
alpha: f32,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<C>
|
||||
where
|
||||
push: &mut dyn FnMut(CosmicStackRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
C: From<CosmicStackRenderElement<R>>,
|
||||
{
|
||||
let window_loc = location + Point::from((0, (TAB_HEIGHT as f64 * scale.y) as i32));
|
||||
self.0.with_program(|p| {
|
||||
let windows = p.windows.lock().unwrap();
|
||||
let active = p.active.load(Ordering::SeqCst);
|
||||
|
||||
windows[active]
|
||||
.popup_render_elements::<R, CosmicStackRenderElement<R>>(
|
||||
renderer,
|
||||
window_loc,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_node,
|
||||
)
|
||||
.into_iter()
|
||||
.map(C::from)
|
||||
.collect()
|
||||
windows[active].push_popup_render_elements(
|
||||
renderer,
|
||||
window_loc,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_node,
|
||||
&mut |elem| push(elem.into()),
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
@ -744,7 +740,7 @@ impl CosmicStack {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn render_elements<R, C>(
|
||||
pub fn push_render_elements<R>(
|
||||
&self,
|
||||
renderer: &mut R,
|
||||
location: Point<i32, Physical>,
|
||||
|
|
@ -753,17 +749,17 @@ impl CosmicStack {
|
|||
alpha: f32,
|
||||
scanout_override: Option<bool>,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<C>
|
||||
where
|
||||
push_above: &mut dyn FnMut(CosmicStackRenderElement<R>),
|
||||
push_below: &mut dyn FnMut(CosmicStackRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
C: From<CosmicStackRenderElement<R>>,
|
||||
{
|
||||
if !self
|
||||
.0
|
||||
.with_program(|p| p.override_alive.load(Ordering::Acquire))
|
||||
{
|
||||
return Vec::new();
|
||||
return;
|
||||
}
|
||||
|
||||
let geometry = self
|
||||
|
|
@ -773,11 +769,12 @@ impl CosmicStack {
|
|||
let stack_loc = location + geometry.loc;
|
||||
let window_loc = location + Point::from((0, (TAB_HEIGHT as f64 * scale.y) as i32));
|
||||
|
||||
let mut elements = AsRenderElements::<R>::render_elements::<CosmicStackRenderElement<R>>(
|
||||
&self.0, renderer, stack_loc, scale, alpha,
|
||||
);
|
||||
self.0
|
||||
.push_render_elements(renderer, stack_loc, scale, alpha, &mut |elem| {
|
||||
push_above(elem.into())
|
||||
});
|
||||
|
||||
elements.extend(self.0.with_program(|p| {
|
||||
self.0.with_program(|p| {
|
||||
let windows = p.windows.lock().unwrap();
|
||||
let active = p.active.load(Ordering::SeqCst);
|
||||
let theme = p.theme.lock().unwrap();
|
||||
|
|
@ -804,9 +801,9 @@ impl CosmicStack {
|
|||
let window_key =
|
||||
CosmicMappedKey(CosmicMappedKeyInner::Stack(Arc::downgrade(&self.0.0)));
|
||||
|
||||
let border = (!maximized).then(|| {
|
||||
if !maximized {
|
||||
let (r, g, b, a) = theme.cosmic().bg_divider().into_components();
|
||||
CosmicStackRenderElement::Border(IndicatorShader::element(
|
||||
push_above(CosmicStackRenderElement::Border(IndicatorShader::element(
|
||||
renderer,
|
||||
Key::Window(Usage::Border, window_key.clone()),
|
||||
geo.to_i32_round().as_local(),
|
||||
|
|
@ -815,24 +812,23 @@ impl CosmicStack {
|
|||
a * alpha,
|
||||
scale.x,
|
||||
[r, g, b],
|
||||
))
|
||||
});
|
||||
)));
|
||||
};
|
||||
|
||||
border.into_iter().chain(
|
||||
windows[active].render_elements::<R, CosmicStackRenderElement<R>>(
|
||||
renderer,
|
||||
window_loc,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_override,
|
||||
scanout_node,
|
||||
radii.is_some(),
|
||||
radii.unwrap_or([0; 4]),
|
||||
),
|
||||
)
|
||||
}));
|
||||
|
||||
elements.into_iter().map(C::from).collect()
|
||||
let radii = radii.map(|[a, _, c, _]| [a, 0, c, 0]);
|
||||
windows[active].push_render_elements(
|
||||
renderer,
|
||||
window_loc,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_override,
|
||||
scanout_node,
|
||||
radii.is_some(),
|
||||
radii.unwrap_or([0; 4]),
|
||||
&mut |elem| push_above(elem.into()),
|
||||
Some(&mut |elem| push_below(elem.into())),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
pub(crate) fn set_theme(&self, theme: cosmic::Theme) {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
use crate::{
|
||||
backend::render::{
|
||||
element::AsGlowRenderer,
|
||||
wayland::{SurfaceRenderElement, render_elements_from_surface_tree},
|
||||
wayland::{SurfaceRenderElement, push_render_elements_from_surface_tree},
|
||||
},
|
||||
shell::focus::target::PointerFocusTarget,
|
||||
wayland::{
|
||||
|
|
@ -859,48 +859,47 @@ impl CosmicSurface {
|
|||
self.0.user_data()
|
||||
}
|
||||
|
||||
pub fn popup_render_elements<R, C>(
|
||||
pub fn push_popup_render_elements<R>(
|
||||
&self,
|
||||
renderer: &mut R,
|
||||
location: Point<i32, Physical>,
|
||||
scale: Scale<f64>,
|
||||
alpha: f32,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<C>
|
||||
where
|
||||
push: &mut dyn FnMut(SurfaceRenderElement<R>),
|
||||
) where
|
||||
R: Renderer + ImportAll + AsGlowRenderer,
|
||||
R::TextureId: Clone + 'static,
|
||||
C: From<SurfaceRenderElement<R>>,
|
||||
{
|
||||
match self.0.underlying_surface() {
|
||||
WindowSurface::Wayland(toplevel) => {
|
||||
let surface = toplevel.wl_surface();
|
||||
PopupManager::popups_for_surface(surface)
|
||||
.flat_map(move |(popup, popup_offset)| {
|
||||
let offset = (self.0.geometry().loc + popup_offset - popup.geometry().loc)
|
||||
.to_physical_precise_round(scale);
|
||||
let mut geometry = popup.geometry().to_f64();
|
||||
geometry.loc += location.to_f64().to_logical(scale) + popup_offset.to_f64();
|
||||
for (popup, popup_offset) in PopupManager::popups_for_surface(surface) {
|
||||
let offset = (self.0.geometry().loc + popup_offset - popup.geometry().loc)
|
||||
.to_physical_precise_round(scale);
|
||||
let mut geometry = popup.geometry().to_f64();
|
||||
geometry.loc += location.to_f64().to_logical(scale) + popup_offset.to_f64();
|
||||
|
||||
render_elements_from_surface_tree(
|
||||
renderer,
|
||||
popup.wl_surface(),
|
||||
location + offset,
|
||||
geometry,
|
||||
scale,
|
||||
alpha,
|
||||
false,
|
||||
[0; 4],
|
||||
scanout_kind_eval(None, scanout_node),
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
push_render_elements_from_surface_tree(
|
||||
renderer,
|
||||
popup.wl_surface(),
|
||||
location + offset,
|
||||
geometry,
|
||||
scale,
|
||||
alpha,
|
||||
false,
|
||||
[0; 4],
|
||||
scanout_kind_eval(None, scanout_node),
|
||||
push,
|
||||
None,
|
||||
)
|
||||
}
|
||||
}
|
||||
WindowSurface::X11(_) => Vec::new(),
|
||||
WindowSurface::X11(_) => {}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn render_elements<R, C>(
|
||||
pub fn push_render_elements<R>(
|
||||
&self,
|
||||
renderer: &mut R,
|
||||
location: Point<i32, Physical>,
|
||||
|
|
@ -910,11 +909,11 @@ impl CosmicSurface {
|
|||
scanout_node: Option<DrmNode>,
|
||||
should_clip: bool,
|
||||
radii: [u8; 4],
|
||||
) -> Vec<C>
|
||||
where
|
||||
push_above: &mut dyn FnMut(SurfaceRenderElement<R>),
|
||||
push_below: Option<&mut dyn FnMut(SurfaceRenderElement<R>)>,
|
||||
) where
|
||||
R: Renderer + ImportAll + AsGlowRenderer,
|
||||
R::TextureId: Clone + 'static,
|
||||
C: From<SurfaceRenderElement<R>>,
|
||||
{
|
||||
let mut geometry = self.0.geometry().to_f64();
|
||||
geometry.loc += location.to_f64().to_logical(scale);
|
||||
|
|
@ -923,7 +922,7 @@ impl CosmicSurface {
|
|||
WindowSurface::Wayland(toplevel) => {
|
||||
let surface = toplevel.wl_surface();
|
||||
|
||||
render_elements_from_surface_tree(
|
||||
push_render_elements_from_surface_tree(
|
||||
renderer,
|
||||
surface,
|
||||
location,
|
||||
|
|
@ -933,14 +932,16 @@ impl CosmicSurface {
|
|||
should_clip,
|
||||
radii,
|
||||
scanout_kind_eval(scanout_override, scanout_node),
|
||||
push_above,
|
||||
push_below,
|
||||
)
|
||||
}
|
||||
WindowSurface::X11(surface) => {
|
||||
let Some(surface) = surface.wl_surface() else {
|
||||
return Vec::new();
|
||||
return;
|
||||
};
|
||||
|
||||
render_elements_from_surface_tree(
|
||||
push_render_elements_from_surface_tree(
|
||||
renderer,
|
||||
&surface,
|
||||
location,
|
||||
|
|
@ -950,6 +951,8 @@ impl CosmicSurface {
|
|||
should_clip,
|
||||
radii,
|
||||
scanout_kind_eval(scanout_override, scanout_node),
|
||||
push_above,
|
||||
push_below,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@ use smithay::{
|
|||
renderer::{
|
||||
ImportAll, ImportMem, Renderer,
|
||||
element::{
|
||||
AsRenderElements, Element, Id as RendererId, Kind, RenderElement,
|
||||
UnderlyingStorage, memory::MemoryRenderBufferRenderElement,
|
||||
Element, Id as RendererId, Kind, RenderElement, UnderlyingStorage,
|
||||
memory::MemoryRenderBufferRenderElement,
|
||||
},
|
||||
gles::element::PixelShaderElement,
|
||||
glow::GlowRenderer,
|
||||
|
|
@ -348,18 +348,17 @@ impl CosmicWindow {
|
|||
self.0.loop_handle()
|
||||
}
|
||||
|
||||
pub fn popup_render_elements<R, C>(
|
||||
pub fn push_popup_render_elements<R>(
|
||||
&self,
|
||||
renderer: &mut R,
|
||||
location: Point<i32, Physical>,
|
||||
scale: Scale<f64>,
|
||||
alpha: f32,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<C>
|
||||
where
|
||||
R: Renderer + ImportAll + ImportMem + AsGlowRenderer,
|
||||
push: &mut dyn FnMut(CosmicWindowRenderElement<R>),
|
||||
) where
|
||||
R: Renderer + AsGlowRenderer + ImportAll + ImportMem,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
C: From<CosmicWindowRenderElement<R>>,
|
||||
{
|
||||
let has_ssd = self.0.with_program(|p| p.has_ssd(false));
|
||||
|
||||
|
|
@ -370,17 +369,14 @@ impl CosmicWindow {
|
|||
};
|
||||
|
||||
self.0.with_program(|p| {
|
||||
p.window
|
||||
.popup_render_elements::<R, CosmicWindowRenderElement<R>>(
|
||||
renderer,
|
||||
window_loc,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_node,
|
||||
)
|
||||
.into_iter()
|
||||
.map(C::from)
|
||||
.collect()
|
||||
p.window.push_popup_render_elements(
|
||||
renderer,
|
||||
window_loc,
|
||||
scale,
|
||||
alpha,
|
||||
scanout_node,
|
||||
&mut |elem| push(elem.into()),
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
@ -464,7 +460,7 @@ impl CosmicWindow {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn render_elements<R, C>(
|
||||
pub fn push_render_elements<R>(
|
||||
&self,
|
||||
renderer: &mut R,
|
||||
location: Point<i32, Physical>,
|
||||
|
|
@ -473,11 +469,11 @@ impl CosmicWindow {
|
|||
alpha: f32,
|
||||
scanout_override: Option<bool>,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<C>
|
||||
where
|
||||
push_above: &mut dyn FnMut(CosmicWindowRenderElement<R>),
|
||||
push_below: &mut dyn FnMut(CosmicWindowRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
C: From<CosmicWindowRenderElement<R>>,
|
||||
{
|
||||
let (has_ssd, is_tiled, is_maximized, mut radii, appearance) = self.0.with_program(|p| {
|
||||
(
|
||||
|
|
@ -514,8 +510,6 @@ impl CosmicWindow {
|
|||
location
|
||||
};
|
||||
|
||||
let mut elements = Vec::new();
|
||||
|
||||
let (mut geo, bg_divider) = self.0.with_program(|p| {
|
||||
(
|
||||
SpaceElement::geometry(&p.window).to_f64(),
|
||||
|
|
@ -545,15 +539,15 @@ impl CosmicWindow {
|
|||
scale.x,
|
||||
[r, g, b],
|
||||
));
|
||||
elements.push(elem);
|
||||
push_above(elem);
|
||||
}
|
||||
|
||||
if has_ssd {
|
||||
radii[1] = 0;
|
||||
radii[3] = 0;
|
||||
}
|
||||
elements.extend(self.0.with_program(|p| {
|
||||
p.window.render_elements::<R, CosmicWindowRenderElement<R>>(
|
||||
self.0.with_program(|p| {
|
||||
if has_ssd {
|
||||
radii[1] = 0;
|
||||
radii[3] = 0;
|
||||
}
|
||||
p.window.push_render_elements(
|
||||
renderer,
|
||||
window_loc,
|
||||
scale,
|
||||
|
|
@ -562,8 +556,10 @@ impl CosmicWindow {
|
|||
scanout_node,
|
||||
clip,
|
||||
radii,
|
||||
&mut |elem| push_above(elem.into()),
|
||||
Some(&mut |elem| push_below(elem.into())),
|
||||
)
|
||||
}));
|
||||
});
|
||||
|
||||
if has_ssd {
|
||||
let ssd_loc = location
|
||||
|
|
@ -571,12 +567,11 @@ impl CosmicWindow {
|
|||
.0
|
||||
.with_program(|p| p.window.geometry().loc)
|
||||
.to_physical_precise_round(scale);
|
||||
elements.extend(AsRenderElements::<R>::render_elements::<
|
||||
CosmicWindowRenderElement<R>,
|
||||
>(&self.0, renderer, ssd_loc, scale, alpha))
|
||||
self.0
|
||||
.push_render_elements(renderer, ssd_loc, scale, alpha, &mut |elem| {
|
||||
push_above(elem.into())
|
||||
});
|
||||
}
|
||||
|
||||
elements.into_iter().map(C::from).collect()
|
||||
}
|
||||
|
||||
pub(crate) fn set_theme(&self, theme: cosmic::Theme) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue