Add a SplitRenderElements type, with useful methods
`(w_elements, p_elements)` tuples are used in a bunch of places. A struct with named fields is generally an improvement just due to the fact the order is non-obvious. But we can also add methods. In particular, `extend_from_workspace_elements` abstracts out some of the more redundant code in `workspace_elements`. It would be nice to avoid allocation everywhere, but iterators would complicate lifetimes, run into issues with needing multiple mutable borrows to things like the `Renderer`, and be awkward in certain functions without generator syntax. In any case, cosmic-comp already relies on allocating vectors here. If this abstraction is commonly useful in compositors, perhaps it could be moved to Smithay.
This commit is contained in:
parent
c506d94ac8
commit
94fecec9cb
9 changed files with 374 additions and 379 deletions
|
|
@ -24,7 +24,7 @@ use smithay::{
|
|||
};
|
||||
|
||||
use crate::{
|
||||
backend::render::{element::AsGlowRenderer, IndicatorShader, Key, Usage},
|
||||
backend::render::{element::AsGlowRenderer, IndicatorShader, Key, SplitRenderElements, Usage},
|
||||
shell::{
|
||||
element::{
|
||||
resize_indicator::ResizeIndicator,
|
||||
|
|
@ -1270,10 +1270,7 @@ impl FloatingLayout {
|
|||
indicator_thickness: u8,
|
||||
alpha: f32,
|
||||
theme: &cosmic::theme::CosmicTheme,
|
||||
) -> (
|
||||
Vec<CosmicMappedRenderElement<R>>,
|
||||
Vec<CosmicMappedRenderElement<R>>,
|
||||
)
|
||||
) -> SplitRenderElements<CosmicMappedRenderElement<R>>
|
||||
where
|
||||
R: Renderer + ImportAll + ImportMem + AsGlowRenderer,
|
||||
<R as Renderer>::TextureId: Send + Clone + 'static,
|
||||
|
|
@ -1288,8 +1285,7 @@ impl FloatingLayout {
|
|||
};
|
||||
let output_scale = output.current_scale().fractional_scale();
|
||||
|
||||
let mut window_elements = Vec::new();
|
||||
let mut popup_elements = Vec::new();
|
||||
let mut elements = SplitRenderElements::default();
|
||||
|
||||
for elem in self
|
||||
.animations
|
||||
|
|
@ -1305,7 +1301,10 @@ impl FloatingLayout {
|
|||
.unwrap_or_else(|| (self.space.element_geometry(elem).unwrap().as_local(), alpha));
|
||||
|
||||
let render_location = geometry.loc - elem.geometry().loc.as_local();
|
||||
let (mut w_elements, p_elements) = elem.split_render_elements(
|
||||
let SplitRenderElements {
|
||||
mut w_elements,
|
||||
p_elements,
|
||||
} = elem.split_render_elements(
|
||||
renderer,
|
||||
render_location
|
||||
.as_logical()
|
||||
|
|
@ -1388,7 +1387,7 @@ impl FloatingLayout {
|
|||
|
||||
resize.resize(resize_geometry.size.as_logical());
|
||||
resize.output_enter(output, Rectangle::default() /* unused */);
|
||||
window_elements.extend(
|
||||
elements.w_elements.extend(
|
||||
resize
|
||||
.render_elements::<CosmicWindowRenderElement<R>>(
|
||||
renderer,
|
||||
|
|
@ -1420,15 +1419,15 @@ impl FloatingLayout {
|
|||
active_window_hint.blue,
|
||||
],
|
||||
);
|
||||
window_elements.push(element.into());
|
||||
elements.w_elements.push(element.into());
|
||||
}
|
||||
}
|
||||
|
||||
window_elements.extend(w_elements);
|
||||
popup_elements.extend(p_elements);
|
||||
elements.w_elements.extend(w_elements);
|
||||
elements.p_elements.extend(p_elements);
|
||||
}
|
||||
|
||||
(window_elements, popup_elements)
|
||||
elements
|
||||
}
|
||||
|
||||
fn gaps(&self) -> (i32, i32) {
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
use crate::{
|
||||
backend::render::{
|
||||
element::AsGlowRenderer, BackdropShader, IndicatorShader, Key, Usage, ACTIVE_GROUP_COLOR,
|
||||
GROUP_COLOR,
|
||||
element::AsGlowRenderer, BackdropShader, IndicatorShader, Key, SplitRenderElements, Usage,
|
||||
ACTIVE_GROUP_COLOR, GROUP_COLOR,
|
||||
},
|
||||
shell::{
|
||||
element::{
|
||||
|
|
@ -3849,13 +3849,7 @@ impl TilingLayout {
|
|||
resize_indicator: Option<(ResizeMode, ResizeIndicator)>,
|
||||
indicator_thickness: u8,
|
||||
theme: &cosmic::theme::CosmicTheme,
|
||||
) -> Result<
|
||||
(
|
||||
Vec<CosmicMappedRenderElement<R>>,
|
||||
Vec<CosmicMappedRenderElement<R>>,
|
||||
),
|
||||
OutputNotMapped,
|
||||
>
|
||||
) -> Result<SplitRenderElements<CosmicMappedRenderElement<R>>, OutputNotMapped>
|
||||
where
|
||||
R: Renderer + ImportAll + ImportMem + AsGlowRenderer,
|
||||
<R as Renderer>::TextureId: Send + Clone + 'static,
|
||||
|
|
@ -3888,8 +3882,7 @@ impl TilingLayout {
|
|||
};
|
||||
let draw_groups = overview.0.alpha();
|
||||
|
||||
let mut window_elements = Vec::new();
|
||||
let mut popup_elements = Vec::new();
|
||||
let mut elements = SplitRenderElements::default();
|
||||
|
||||
let is_overview = !matches!(overview.0, OverviewMode::None);
|
||||
let is_mouse_tiling = (matches!(overview.0.trigger(), Some(Trigger::Pointer(_))))
|
||||
|
|
@ -3924,7 +3917,7 @@ impl TilingLayout {
|
|||
.unzip();
|
||||
|
||||
// all old windows we want to fade out
|
||||
let (w_elements, p_elements) = render_old_tree(
|
||||
elements.extend(render_old_tree(
|
||||
reference_tree,
|
||||
target_tree,
|
||||
renderer,
|
||||
|
|
@ -3934,9 +3927,7 @@ impl TilingLayout {
|
|||
indicator_thickness,
|
||||
swap_desc.is_some(),
|
||||
theme,
|
||||
);
|
||||
window_elements.extend(w_elements);
|
||||
popup_elements.extend(p_elements);
|
||||
));
|
||||
|
||||
geometries
|
||||
} else {
|
||||
|
|
@ -3964,7 +3955,7 @@ impl TilingLayout {
|
|||
.unzip();
|
||||
|
||||
// all alive windows
|
||||
let (w_elements, p_elements) = render_new_tree(
|
||||
elements.extend(render_new_tree(
|
||||
target_tree,
|
||||
reference_tree,
|
||||
renderer,
|
||||
|
|
@ -3992,16 +3983,14 @@ impl TilingLayout {
|
|||
&self.swapping_stack_surface_id,
|
||||
&self.placeholder_id,
|
||||
theme,
|
||||
);
|
||||
window_elements.extend(w_elements);
|
||||
popup_elements.extend(p_elements);
|
||||
));
|
||||
|
||||
// tiling hints
|
||||
if let Some(group_elements) = group_elements {
|
||||
window_elements.extend(group_elements);
|
||||
elements.w_elements.extend(group_elements);
|
||||
}
|
||||
|
||||
Ok((window_elements, popup_elements))
|
||||
Ok(elements)
|
||||
}
|
||||
|
||||
fn gaps(&self) -> (i32, i32) {
|
||||
|
|
@ -4697,10 +4686,7 @@ fn render_old_tree<R>(
|
|||
indicator_thickness: u8,
|
||||
is_swap_mode: bool,
|
||||
theme: &cosmic::theme::CosmicTheme,
|
||||
) -> (
|
||||
Vec<CosmicMappedRenderElement<R>>,
|
||||
Vec<CosmicMappedRenderElement<R>>,
|
||||
)
|
||||
) -> SplitRenderElements<CosmicMappedRenderElement<R>>
|
||||
where
|
||||
R: Renderer + ImportAll + ImportMem + AsGlowRenderer,
|
||||
<R as Renderer>::TextureId: Send + Clone + 'static,
|
||||
|
|
@ -4709,8 +4695,7 @@ where
|
|||
CosmicStackRenderElement<R>: RenderElement<R>,
|
||||
{
|
||||
let window_hint = crate::theme::active_window_hint(theme);
|
||||
let mut window_elements = Vec::new();
|
||||
let mut popup_elements = Vec::new();
|
||||
let mut elements = SplitRenderElements::default();
|
||||
|
||||
if let Some(root) = reference_tree.root_node_id() {
|
||||
let geometries = geometries.unwrap_or_default();
|
||||
|
|
@ -4780,62 +4765,68 @@ where
|
|||
};
|
||||
|
||||
let elem_geometry = mapped.geometry().to_physical_precise_round(output_scale);
|
||||
let (w_elements, p_elements) = mapped
|
||||
.split_render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
);
|
||||
let SplitRenderElements {
|
||||
w_elements,
|
||||
p_elements,
|
||||
} = mapped.split_render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
);
|
||||
|
||||
window_elements.extend(w_elements.into_iter().flat_map(|element| {
|
||||
match element {
|
||||
CosmicMappedRenderElement::Stack(elem) => constrain_render_elements(
|
||||
std::iter::once(elem),
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
geo.as_logical().to_physical_precise_round(output_scale),
|
||||
elem_geometry,
|
||||
ConstrainScaleBehavior::Stretch,
|
||||
ConstrainAlign::CENTER,
|
||||
output_scale,
|
||||
)
|
||||
.next()
|
||||
.map(CosmicMappedRenderElement::TiledStack),
|
||||
CosmicMappedRenderElement::Window(elem) => constrain_render_elements(
|
||||
std::iter::once(elem),
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
geo.as_logical().to_physical_precise_round(output_scale),
|
||||
elem_geometry,
|
||||
ConstrainScaleBehavior::Stretch,
|
||||
ConstrainAlign::CENTER,
|
||||
output_scale,
|
||||
)
|
||||
.next()
|
||||
.map(CosmicMappedRenderElement::TiledWindow),
|
||||
x => Some(x),
|
||||
}
|
||||
}));
|
||||
elements
|
||||
.w_elements
|
||||
.extend(w_elements.into_iter().flat_map(|element| {
|
||||
match element {
|
||||
CosmicMappedRenderElement::Stack(elem) => constrain_render_elements(
|
||||
std::iter::once(elem),
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
geo.as_logical().to_physical_precise_round(output_scale),
|
||||
elem_geometry,
|
||||
ConstrainScaleBehavior::Stretch,
|
||||
ConstrainAlign::CENTER,
|
||||
output_scale,
|
||||
)
|
||||
.next()
|
||||
.map(CosmicMappedRenderElement::TiledStack),
|
||||
CosmicMappedRenderElement::Window(elem) => constrain_render_elements(
|
||||
std::iter::once(elem),
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
geo.as_logical().to_physical_precise_round(output_scale),
|
||||
elem_geometry,
|
||||
ConstrainScaleBehavior::Stretch,
|
||||
ConstrainAlign::CENTER,
|
||||
output_scale,
|
||||
)
|
||||
.next()
|
||||
.map(CosmicMappedRenderElement::TiledWindow),
|
||||
x => Some(x),
|
||||
}
|
||||
}));
|
||||
if minimize_geo.is_some() && indicator_thickness > 0 {
|
||||
window_elements.push(CosmicMappedRenderElement::FocusIndicator(
|
||||
IndicatorShader::focus_element(
|
||||
renderer,
|
||||
Key::Window(Usage::FocusIndicator, mapped.clone().key()),
|
||||
geo,
|
||||
indicator_thickness,
|
||||
output_scale,
|
||||
alpha,
|
||||
[window_hint.red, window_hint.green, window_hint.blue],
|
||||
),
|
||||
));
|
||||
elements
|
||||
.w_elements
|
||||
.push(CosmicMappedRenderElement::FocusIndicator(
|
||||
IndicatorShader::focus_element(
|
||||
renderer,
|
||||
Key::Window(Usage::FocusIndicator, mapped.clone().key()),
|
||||
geo,
|
||||
indicator_thickness,
|
||||
output_scale,
|
||||
alpha,
|
||||
[window_hint.red, window_hint.green, window_hint.blue],
|
||||
),
|
||||
));
|
||||
}
|
||||
popup_elements.extend(p_elements);
|
||||
elements.p_elements.extend(p_elements);
|
||||
});
|
||||
}
|
||||
|
||||
(window_elements, popup_elements)
|
||||
elements
|
||||
}
|
||||
|
||||
fn render_new_tree<R>(
|
||||
|
|
@ -4857,10 +4848,7 @@ fn render_new_tree<R>(
|
|||
swapping_stack_surface_id: &Id,
|
||||
placeholder_id: &Id,
|
||||
theme: &cosmic::theme::CosmicTheme,
|
||||
) -> (
|
||||
Vec<CosmicMappedRenderElement<R>>,
|
||||
Vec<CosmicMappedRenderElement<R>>,
|
||||
)
|
||||
) -> SplitRenderElements<CosmicMappedRenderElement<R>>
|
||||
where
|
||||
R: Renderer + ImportAll + ImportMem + AsGlowRenderer,
|
||||
<R as Renderer>::TextureId: Send + Clone + 'static,
|
||||
|
|
@ -5249,15 +5237,17 @@ where
|
|||
|
||||
if let Data::Mapped { mapped, .. } = data {
|
||||
let elem_geometry = mapped.geometry().to_physical_precise_round(output_scale);
|
||||
let (mut w_elements, p_elements) = mapped
|
||||
.split_render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
//original_location,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
);
|
||||
let SplitRenderElements {
|
||||
mut w_elements,
|
||||
p_elements,
|
||||
} = mapped.split_render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
//original_location,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
);
|
||||
if swap_desc
|
||||
.as_ref()
|
||||
.filter(|swap_desc| swap_desc.node == node_id)
|
||||
|
|
@ -5376,7 +5366,10 @@ where
|
|||
.chain(group_backdrop.into_iter().map(Into::into))
|
||||
.collect();
|
||||
|
||||
(window_elements, popup_elements)
|
||||
SplitRenderElements {
|
||||
w_elements: window_elements,
|
||||
p_elements: popup_elements,
|
||||
}
|
||||
}
|
||||
|
||||
fn scale_to_center<C>(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue