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
|
|
@ -6,8 +6,7 @@ use crate::{
|
|||
element::AsGlowRenderer,
|
||||
},
|
||||
shell::{
|
||||
CosmicSurface, Direction, FocusResult, MoveResult, OutputNotMapped, OverviewMode,
|
||||
ResizeMode, Trigger,
|
||||
CosmicSurface, Direction, FocusResult, MoveResult, OverviewMode, ResizeMode, Trigger,
|
||||
element::{
|
||||
CosmicMapped, CosmicMappedRenderElement, CosmicStack, CosmicWindow,
|
||||
resize_indicator::ResizeIndicator,
|
||||
|
|
@ -45,12 +44,13 @@ use keyframe::{
|
|||
ease,
|
||||
functions::{EaseInOutCubic, Linear},
|
||||
};
|
||||
use smallvec::SmallVec;
|
||||
use smithay::{
|
||||
backend::{
|
||||
drm::DrmNode,
|
||||
renderer::{
|
||||
element::{
|
||||
AsRenderElements, Id, RenderElement,
|
||||
Id, RenderElement,
|
||||
utils::{
|
||||
ConstrainAlign, ConstrainScaleBehavior, RescaleRenderElement,
|
||||
constrain_render_elements,
|
||||
|
|
@ -3424,8 +3424,8 @@ impl TilingLayout {
|
|||
None,
|
||||
None,
|
||||
self.theme.cosmic(),
|
||||
)
|
||||
.0;
|
||||
&mut |_| {},
|
||||
);
|
||||
|
||||
let mut result = None;
|
||||
let mut lookup = Some(root.clone());
|
||||
|
|
@ -4011,8 +4011,8 @@ impl TilingLayout {
|
|||
indicator_thickness: u8,
|
||||
theme: &cosmic::theme::CosmicTheme,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Result<Vec<CosmicMappedRenderElement<R>>, OutputNotMapped>
|
||||
where
|
||||
push: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
|
|
@ -4052,8 +4052,6 @@ impl TilingLayout {
|
|||
};
|
||||
let draw_groups = overview.0.alpha();
|
||||
|
||||
let mut elements = Vec::default();
|
||||
|
||||
let is_overview = !matches!(overview.0, OverviewMode::None);
|
||||
let is_mouse_tiling = (matches!(overview.0.trigger(), Some(Trigger::Pointer(_))))
|
||||
.then(|| self.last_overview_hover.as_ref().map(|(_, zone)| zone));
|
||||
|
|
@ -4065,7 +4063,7 @@ impl TilingLayout {
|
|||
|
||||
// all gone windows and fade them out
|
||||
let old_geometries = if let Some(reference_tree) = reference_tree.as_ref() {
|
||||
let (geometries, _) = if let Some(transition) = draw_groups {
|
||||
let geometries = if let Some(transition) = draw_groups {
|
||||
Some(geometries_for_groupview(
|
||||
reference_tree,
|
||||
&mut *renderer,
|
||||
|
|
@ -4080,14 +4078,14 @@ impl TilingLayout {
|
|||
swap_desc.clone(),
|
||||
overview.1.as_ref().and_then(|(_, tree)| *tree),
|
||||
theme,
|
||||
&mut |_elem| {},
|
||||
))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
.unzip();
|
||||
};
|
||||
|
||||
// all old windows we want to fade out
|
||||
elements.extend(render_old_tree_windows(
|
||||
render_old_tree_windows(
|
||||
reference_tree,
|
||||
target_tree,
|
||||
renderer,
|
||||
|
|
@ -4098,14 +4096,16 @@ impl TilingLayout {
|
|||
swap_desc.is_some(),
|
||||
theme,
|
||||
scanout_node,
|
||||
));
|
||||
push,
|
||||
);
|
||||
|
||||
geometries
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let (geometries, group_elements) = if let Some(transition) = draw_groups {
|
||||
let mut group_elements = SmallVec::<[_; 4]>::new_const();
|
||||
let geometries = if let Some(transition) = draw_groups {
|
||||
Some(geometries_for_groupview(
|
||||
target_tree,
|
||||
&mut *renderer,
|
||||
|
|
@ -4119,14 +4119,14 @@ impl TilingLayout {
|
|||
swap_desc.clone(),
|
||||
overview.1.as_ref().and_then(|(_, tree)| *tree),
|
||||
theme,
|
||||
&mut |elem| group_elements.push(elem),
|
||||
))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
.unzip();
|
||||
};
|
||||
|
||||
// all alive windows
|
||||
elements.extend(render_new_tree_windows(
|
||||
render_new_tree_windows(
|
||||
target_tree,
|
||||
reference_tree,
|
||||
renderer,
|
||||
|
|
@ -4155,14 +4155,13 @@ impl TilingLayout {
|
|||
&self.backdrop_id,
|
||||
theme,
|
||||
scanout_node,
|
||||
));
|
||||
push,
|
||||
);
|
||||
|
||||
// tiling hints
|
||||
if let Some(group_elements) = group_elements {
|
||||
elements.extend(group_elements);
|
||||
for elem in group_elements.into_iter() {
|
||||
push(elem);
|
||||
}
|
||||
|
||||
Ok(elements)
|
||||
}
|
||||
|
||||
#[profiling::function]
|
||||
|
|
@ -4174,8 +4173,8 @@ impl TilingLayout {
|
|||
overview: (OverviewMode, Option<(SwapIndicator, Option<&Tree<Data>>)>),
|
||||
theme: &cosmic::theme::CosmicTheme,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Result<Vec<CosmicMappedRenderElement<R>>, OutputNotMapped>
|
||||
where
|
||||
push: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
|
|
@ -4207,8 +4206,6 @@ impl TilingLayout {
|
|||
};
|
||||
let draw_groups = overview.0.alpha();
|
||||
|
||||
let mut elements = Vec::default();
|
||||
|
||||
let is_mouse_tiling = (matches!(overview.0.trigger(), Some(Trigger::Pointer(_))))
|
||||
.then(|| self.last_overview_hover.as_ref().map(|(_, zone)| zone));
|
||||
let swap_desc = if let Some(Trigger::KeyboardSwap(_, desc)) = overview.0.trigger() {
|
||||
|
|
@ -4219,7 +4216,7 @@ impl TilingLayout {
|
|||
|
||||
// all gone windows and fade them out
|
||||
let old_geometries = if let Some(reference_tree) = reference_tree.as_ref() {
|
||||
let (geometries, _) = if let Some(transition) = draw_groups {
|
||||
let geometries = if let Some(transition) = draw_groups {
|
||||
Some(geometries_for_groupview(
|
||||
reference_tree,
|
||||
&mut *renderer,
|
||||
|
|
@ -4234,14 +4231,14 @@ impl TilingLayout {
|
|||
swap_desc.clone(),
|
||||
overview.1.as_ref().and_then(|(_, tree)| *tree),
|
||||
theme,
|
||||
&mut |_| {},
|
||||
))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
.unzip();
|
||||
};
|
||||
|
||||
// all old windows we want to fade out
|
||||
elements.extend(render_old_tree_popups(
|
||||
render_old_tree_popups(
|
||||
reference_tree,
|
||||
target_tree,
|
||||
renderer,
|
||||
|
|
@ -4250,14 +4247,15 @@ impl TilingLayout {
|
|||
percentage,
|
||||
swap_desc.is_some(),
|
||||
scanout_node,
|
||||
));
|
||||
push,
|
||||
);
|
||||
|
||||
geometries
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let (geometries, _) = if let Some(transition) = draw_groups {
|
||||
let geometries = if let Some(transition) = draw_groups {
|
||||
Some(geometries_for_groupview(
|
||||
target_tree,
|
||||
&mut *renderer,
|
||||
|
|
@ -4271,14 +4269,14 @@ impl TilingLayout {
|
|||
swap_desc.clone(),
|
||||
overview.1.as_ref().and_then(|(_, tree)| *tree),
|
||||
theme,
|
||||
&mut |_| {},
|
||||
))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
.unzip();
|
||||
};
|
||||
|
||||
// all alive windows
|
||||
elements.extend(render_new_tree_popups(
|
||||
render_new_tree_popups(
|
||||
target_tree,
|
||||
reference_tree,
|
||||
renderer,
|
||||
|
|
@ -4290,9 +4288,8 @@ impl TilingLayout {
|
|||
overview,
|
||||
swap_desc.clone(),
|
||||
scanout_node,
|
||||
));
|
||||
|
||||
Ok(elements)
|
||||
push,
|
||||
);
|
||||
}
|
||||
|
||||
fn gaps(&self) -> (i32, i32) {
|
||||
|
|
@ -4347,10 +4344,8 @@ fn geometries_for_groupview<'a, R>(
|
|||
swap_desc: Option<NodeDesc>,
|
||||
swap_tree: Option<&Tree<Data>>,
|
||||
_theme: &cosmic::theme::CosmicTheme,
|
||||
) -> (
|
||||
HashMap<NodeId, Rectangle<i32, Local>>,
|
||||
Vec<CosmicMappedRenderElement<R>>,
|
||||
)
|
||||
push: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
) -> HashMap<NodeId, Rectangle<i32, Local>>
|
||||
where
|
||||
R: AsGlowRenderer + 'a,
|
||||
R::TextureId: 'static,
|
||||
|
|
@ -4373,11 +4368,18 @@ where
|
|||
// push bogos value, that will get ignored anyway
|
||||
stack.push((Rectangle::from_size((320, 240).into()), 0));
|
||||
}
|
||||
if root.is_some() {
|
||||
|
||||
let has_root = root.is_some();
|
||||
if has_root {
|
||||
stack.push((non_exclusive_zone, 0));
|
||||
}
|
||||
|
||||
let mut elements = Vec::new();
|
||||
let mut push = |elem| {
|
||||
if has_root {
|
||||
push(elem)
|
||||
}
|
||||
};
|
||||
|
||||
let mut geometries: HashMap<NodeId, Rectangle<i32, Local>> = HashMap::new();
|
||||
let alpha = alpha * transition;
|
||||
|
||||
|
|
@ -4532,7 +4534,7 @@ where
|
|||
if let Some(renderer) = renderer.as_mut() {
|
||||
if (render_potential_group || render_active_child) && Some(&node_id) != root
|
||||
{
|
||||
elements.push(
|
||||
push(
|
||||
IndicatorShader::element(
|
||||
*renderer,
|
||||
Key::Group(Arc::downgrade(alive)),
|
||||
|
|
@ -4550,7 +4552,7 @@ where
|
|||
&& pill_indicator.is_some()
|
||||
&& Some(&node_id) != root
|
||||
{
|
||||
elements.push(
|
||||
push(
|
||||
IndicatorShader::element(
|
||||
*renderer,
|
||||
Key::Group(Arc::downgrade(alive)),
|
||||
|
|
@ -4614,7 +4616,7 @@ where
|
|||
};
|
||||
|
||||
if draw_outline {
|
||||
elements.push(
|
||||
push(
|
||||
IndicatorShader::element(
|
||||
*renderer,
|
||||
Key::Group(Arc::downgrade(alive)),
|
||||
|
|
@ -4675,7 +4677,7 @@ where
|
|||
};
|
||||
|
||||
if let Some(renderer) = renderer.as_mut() {
|
||||
elements.push(
|
||||
push(
|
||||
BackdropShader::element(
|
||||
*renderer,
|
||||
backdrop_id.clone(),
|
||||
|
|
@ -4693,7 +4695,7 @@ where
|
|||
|
||||
if matches!(swap_desc, Some(ref desc) if desc.node == node_id) {
|
||||
if let Some(renderer) = renderer.as_mut() {
|
||||
elements.push(
|
||||
push(
|
||||
BackdropShader::element(
|
||||
*renderer,
|
||||
Key::Group(Arc::downgrade(alive)),
|
||||
|
|
@ -4778,7 +4780,7 @@ where
|
|||
.unwrap_or(false)
|
||||
{
|
||||
if let Some(renderer) = renderer.as_mut() {
|
||||
elements.push(
|
||||
push(
|
||||
BackdropShader::element(
|
||||
*renderer,
|
||||
backdrop_id.clone(),
|
||||
|
|
@ -4820,7 +4822,7 @@ where
|
|||
.unwrap_or(false)
|
||||
{
|
||||
if let Some(renderer) = renderer.as_mut() {
|
||||
elements.push(
|
||||
push(
|
||||
BackdropShader::element(
|
||||
*renderer,
|
||||
backdrop_id.clone(),
|
||||
|
|
@ -4851,7 +4853,7 @@ where
|
|||
|
||||
if let Some(renderer) = renderer.as_mut() {
|
||||
if render_potential_group {
|
||||
elements.push(
|
||||
push(
|
||||
IndicatorShader::element(
|
||||
*renderer,
|
||||
Key::Window(Usage::PotentialGroupIndicator, mapped.key()),
|
||||
|
|
@ -4891,7 +4893,7 @@ where
|
|||
geo.loc += (WINDOW_BACKDROP_BORDER, WINDOW_BACKDROP_BORDER).into();
|
||||
geo.size -=
|
||||
(WINDOW_BACKDROP_BORDER * 2, WINDOW_BACKDROP_BORDER * 2).into();
|
||||
elements.push(
|
||||
push(
|
||||
BackdropShader::element(
|
||||
*renderer,
|
||||
Key::Window(Usage::OverviewBackdrop, mapped.key()),
|
||||
|
|
@ -4948,7 +4950,7 @@ where
|
|||
if let Some(renderer) = renderer.as_mut() {
|
||||
geo.loc += (WINDOW_BACKDROP_BORDER, WINDOW_BACKDROP_BORDER).into();
|
||||
geo.size -= (WINDOW_BACKDROP_BORDER * 2, WINDOW_BACKDROP_BORDER * 2).into();
|
||||
elements.push(
|
||||
push(
|
||||
BackdropShader::element(
|
||||
*renderer,
|
||||
id.clone(),
|
||||
|
|
@ -4967,11 +4969,7 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
if root.is_none() {
|
||||
elements.clear();
|
||||
}
|
||||
|
||||
(geometries, elements)
|
||||
geometries
|
||||
}
|
||||
|
||||
fn render_old_tree_popups<R>(
|
||||
|
|
@ -4983,16 +4981,14 @@ fn render_old_tree_popups<R>(
|
|||
percentage: f32,
|
||||
is_swap_mode: bool,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<CosmicMappedRenderElement<R>>
|
||||
where
|
||||
push: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
CosmicWindowRenderElement<R>: RenderElement<R>,
|
||||
CosmicStackRenderElement<R>: RenderElement<R>,
|
||||
{
|
||||
let mut elements = Vec::default();
|
||||
|
||||
render_old_tree(
|
||||
reference_tree,
|
||||
target_tree,
|
||||
|
|
@ -5001,20 +4997,16 @@ where
|
|||
percentage,
|
||||
is_swap_mode,
|
||||
|mapped, elem_geometry, geo, alpha, _| {
|
||||
elements.extend(
|
||||
mapped.popup_render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
scanout_node,
|
||||
),
|
||||
);
|
||||
mapped.push_popup_render_elements(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale) - elem_geometry.loc,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
scanout_node,
|
||||
push,
|
||||
)
|
||||
},
|
||||
);
|
||||
|
||||
elements
|
||||
)
|
||||
}
|
||||
|
||||
fn render_old_tree_windows<R>(
|
||||
|
|
@ -5028,8 +5020,8 @@ fn render_old_tree_windows<R>(
|
|||
is_swap_mode: bool,
|
||||
theme: &cosmic::theme::CosmicTheme,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<CosmicMappedRenderElement<R>>
|
||||
where
|
||||
push: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
|
|
@ -5037,8 +5029,35 @@ where
|
|||
CosmicStackRenderElement<R>: RenderElement<R>,
|
||||
{
|
||||
let window_hint = crate::theme::active_window_hint(theme);
|
||||
let mut elements = Vec::default();
|
||||
let mut shadow_elements = Vec::default();
|
||||
let mut lower_elements = Vec::default();
|
||||
let mut shadow_elements = SmallVec::<[_; 4]>::new_const();
|
||||
|
||||
let window_map =
|
||||
|elem, geo: Rectangle<i32, Local>, elem_geometry: Rectangle<i32, Physical>| match elem {
|
||||
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),
|
||||
};
|
||||
|
||||
render_old_tree(
|
||||
reference_tree,
|
||||
|
|
@ -5048,57 +5067,9 @@ where
|
|||
percentage,
|
||||
is_swap_mode,
|
||||
|mapped, elem_geometry, geo, alpha, is_minimizing| {
|
||||
shadow_elements.extend(mapped.shadow_render_element(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale) - elem_geometry.loc,
|
||||
Some(geo.size.as_logical()),
|
||||
Scale::from(output_scale),
|
||||
1.,
|
||||
alpha,
|
||||
));
|
||||
|
||||
let window_elements = mapped.render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale) - elem_geometry.loc,
|
||||
Some(geo.size.as_logical()),
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
None,
|
||||
scanout_node,
|
||||
);
|
||||
|
||||
elements.extend(window_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),
|
||||
}
|
||||
}));
|
||||
let radius = mapped.corner_radius(geo.size.as_logical(), indicator_thickness);
|
||||
if is_minimizing && indicator_thickness > 0 {
|
||||
elements.push(CosmicMappedRenderElement::FocusIndicator(
|
||||
push(CosmicMappedRenderElement::FocusIndicator(
|
||||
IndicatorShader::focus_element(
|
||||
renderer,
|
||||
Key::Window(Usage::FocusIndicator, mapped.clone().key()),
|
||||
|
|
@ -5111,10 +5082,44 @@ where
|
|||
),
|
||||
));
|
||||
}
|
||||
|
||||
mapped.push_render_elements(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale) - elem_geometry.loc,
|
||||
Some(geo.size.as_logical()),
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
None,
|
||||
scanout_node,
|
||||
&mut |elem| {
|
||||
if let Some(elem) = window_map(elem, geo, elem_geometry) {
|
||||
push(elem);
|
||||
}
|
||||
},
|
||||
&mut |elem| {
|
||||
if let Some(elem) = window_map(elem, geo, elem_geometry) {
|
||||
lower_elements.push(elem);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
shadow_elements.extend(mapped.shadow_render_element(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale) - elem_geometry.loc,
|
||||
Some(geo.size.as_logical()),
|
||||
Scale::from(output_scale),
|
||||
1.,
|
||||
alpha,
|
||||
));
|
||||
},
|
||||
);
|
||||
|
||||
shadow_elements.into_iter().chain(elements).collect()
|
||||
for elem in shadow_elements {
|
||||
push(elem);
|
||||
}
|
||||
for elem in lower_elements {
|
||||
push(elem);
|
||||
}
|
||||
}
|
||||
|
||||
fn render_old_tree(
|
||||
|
|
@ -5210,15 +5215,14 @@ fn render_new_tree_popups<R>(
|
|||
overview: (OverviewMode, Option<(SwapIndicator, Option<&Tree<Data>>)>),
|
||||
swap_desc: Option<NodeDesc>,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<CosmicMappedRenderElement<R>>
|
||||
where
|
||||
push: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
CosmicWindowRenderElement<R>: RenderElement<R>,
|
||||
CosmicStackRenderElement<R>: RenderElement<R>,
|
||||
{
|
||||
let mut popup_elements = Vec::new();
|
||||
let output_scale = output.current_scale().fractional_scale();
|
||||
|
||||
let is_active_output = seat
|
||||
|
|
@ -5241,21 +5245,18 @@ where
|
|||
if let Data::Mapped { mapped, .. } = data {
|
||||
let elem_geometry = mapped.geometry().to_physical_precise_round(output_scale);
|
||||
|
||||
popup_elements.extend(
|
||||
mapped.popup_render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
scanout_node,
|
||||
),
|
||||
mapped.push_popup_render_elements(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
scanout_node,
|
||||
push,
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
popup_elements
|
||||
}
|
||||
|
||||
fn render_new_tree_windows<R>(
|
||||
|
|
@ -5278,8 +5279,8 @@ fn render_new_tree_windows<R>(
|
|||
backdrop_id: &Id,
|
||||
theme: &cosmic::theme::CosmicTheme,
|
||||
scanout_node: Option<DrmNode>,
|
||||
) -> Vec<CosmicMappedRenderElement<R>>
|
||||
where
|
||||
push: &mut dyn FnMut(CosmicMappedRenderElement<R>),
|
||||
) where
|
||||
R: AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
|
|
@ -5319,14 +5320,18 @@ where
|
|||
.map(|seat| &seat.active_output() == output)
|
||||
.unwrap_or(false);
|
||||
|
||||
let mut animating_window_elements = Vec::new();
|
||||
let mut window_elements = Vec::new();
|
||||
let mut animating_window_upper_elements = Vec::new();
|
||||
let mut animating_window_lower_elements = Vec::new();
|
||||
let mut animating_shadow_elements = SmallVec::<[CosmicMappedRenderElement<R>; 4]>::new_const();
|
||||
|
||||
let mut window_upper_elements = Vec::new();
|
||||
let mut window_lower_elements = Vec::new();
|
||||
let mut shadow_elements = SmallVec::<[CosmicMappedRenderElement<R>; 4]>::new_const();
|
||||
|
||||
let mut group_backdrop = None;
|
||||
let mut indicators = Vec::new();
|
||||
let mut resize_elements = None;
|
||||
let mut swap_elements = Vec::new();
|
||||
let mut shadow_elements = Vec::new();
|
||||
let mut indicators = SmallVec::<[CosmicMappedRenderElement<R>; 2]>::new_const();
|
||||
let mut resize_element = None;
|
||||
let mut swap_elements = SmallVec::<[CosmicMappedRenderElement<R>; 4]>::new_const();
|
||||
|
||||
let output_geo = output.geometry();
|
||||
let output_scale = output.current_scale().fractional_scale();
|
||||
|
|
@ -5339,7 +5344,7 @@ where
|
|||
|
||||
// render placeholder, if we are swapping to an empty workspace
|
||||
if target_tree.root_node_id().is_none() && swap_desc.is_some() {
|
||||
window_elements.push(
|
||||
window_upper_elements.push(
|
||||
BackdropShader::element(
|
||||
renderer,
|
||||
backdrop_id.clone(),
|
||||
|
|
@ -5394,22 +5399,19 @@ where
|
|||
let render_loc =
|
||||
(swap_geo.loc.as_logical() - window_geo.loc).to_physical_precise_round(output_scale);
|
||||
|
||||
swap_elements.extend(
|
||||
window
|
||||
.render_elements(
|
||||
renderer,
|
||||
render_loc,
|
||||
output_scale.into(),
|
||||
1.0,
|
||||
None,
|
||||
scanout_node,
|
||||
false,
|
||||
[0; 4],
|
||||
)
|
||||
.into_iter()
|
||||
.map(|window| {
|
||||
CosmicMappedRenderElement::GrabbedWindow(RescaleRenderElement::from_element(
|
||||
window,
|
||||
window.push_render_elements(
|
||||
renderer,
|
||||
render_loc,
|
||||
output_scale.into(),
|
||||
1.0,
|
||||
None,
|
||||
scanout_node,
|
||||
false,
|
||||
[0, 0, 0, 0],
|
||||
&mut |elem| {
|
||||
swap_elements.push(CosmicMappedRenderElement::GrabbedWindow(
|
||||
RescaleRenderElement::from_element(
|
||||
elem.into(),
|
||||
swap_geo
|
||||
.loc
|
||||
.as_logical()
|
||||
|
|
@ -5420,9 +5422,11 @@ where
|
|||
swap_factor(window_geo.size),
|
||||
transition.unwrap_or(1.0),
|
||||
),
|
||||
))
|
||||
}),
|
||||
)
|
||||
),
|
||||
));
|
||||
},
|
||||
None,
|
||||
);
|
||||
}
|
||||
|
||||
// render actual tree nodes
|
||||
|
|
@ -5538,15 +5542,12 @@ where
|
|||
{
|
||||
swap.resize(geo.size.as_logical());
|
||||
swap.output_enter(output, output_geo.as_logical());
|
||||
swap_elements.extend(
|
||||
swap.render_elements::<CosmicWindowRenderElement<R>>(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale),
|
||||
output_scale.into(),
|
||||
alpha * overview.0.alpha().unwrap_or(1.0),
|
||||
)
|
||||
.into_iter()
|
||||
.map(CosmicMappedRenderElement::from),
|
||||
swap.push_render_elements(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale),
|
||||
output_scale.into(),
|
||||
alpha * overview.0.alpha().unwrap_or(1.0),
|
||||
&mut |elem| swap_elements.push(elem.into()),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -5572,17 +5573,14 @@ where
|
|||
}) {
|
||||
resize.force_update();
|
||||
}
|
||||
resize_elements = Some(
|
||||
resize
|
||||
.render_elements::<CosmicWindowRenderElement<R>>(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale),
|
||||
output_scale.into(),
|
||||
alpha * mode.alpha().unwrap_or(1.0),
|
||||
)
|
||||
.into_iter()
|
||||
.map(CosmicMappedRenderElement::from)
|
||||
.collect::<Vec<_>>(),
|
||||
resize.push_render_elements(
|
||||
renderer,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale),
|
||||
output_scale.into(),
|
||||
alpha * mode.alpha().unwrap_or(1.0),
|
||||
&mut |elem| {
|
||||
resize_element = Some(elem.into());
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -5608,52 +5606,6 @@ where
|
|||
scale.x.min(scale.y),
|
||||
alpha,
|
||||
);
|
||||
let mut elements = mapped.render_elements::<R, CosmicMappedRenderElement<R>>(
|
||||
renderer,
|
||||
//original_location,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
max_size,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
None,
|
||||
scanout_node,
|
||||
);
|
||||
|
||||
if swap_desc
|
||||
.as_ref()
|
||||
.filter(|swap_desc| swap_desc.node == node_id)
|
||||
.and_then(|swap_desc| swap_desc.stack_window.as_ref())
|
||||
.zip(focused.as_ref())
|
||||
.map(|(stack_window, focused_id)| {
|
||||
target_tree
|
||||
.get(focused_id)
|
||||
.ok()
|
||||
.map(|focused| match focused.data() {
|
||||
Data::Mapped { mapped, .. } => mapped
|
||||
.stack_ref()
|
||||
.map(|stack| &stack.active() == stack_window)
|
||||
.unwrap_or(false),
|
||||
_ => false,
|
||||
})
|
||||
.unwrap_or(false)
|
||||
})
|
||||
.unwrap_or(false)
|
||||
{
|
||||
let mut active_geo = mapped.active_window_geometry().as_local();
|
||||
active_geo.loc += geo.loc - mapped.geometry().loc.as_local();
|
||||
elements.insert(
|
||||
0,
|
||||
CosmicMappedRenderElement::Overlay(BackdropShader::element(
|
||||
renderer,
|
||||
Key::Window(Usage::Overlay, mapped.key()),
|
||||
active_geo,
|
||||
0.0,
|
||||
0.3,
|
||||
group_color,
|
||||
)),
|
||||
)
|
||||
}
|
||||
|
||||
let (behavior, align) = if is_overview {
|
||||
(ConstrainScaleBehavior::Fit, ConstrainAlign::CENTER)
|
||||
|
|
@ -5663,7 +5615,7 @@ where
|
|||
(ConstrainScaleBehavior::CutOff, ConstrainAlign::TOP_LEFT)
|
||||
};
|
||||
|
||||
let elements = elements.into_iter().flat_map(|element| match element {
|
||||
let map_elem = |element| match element {
|
||||
CosmicMappedRenderElement::Stack(elem) => constrain_render_elements(
|
||||
std::iter::once(elem),
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
|
|
@ -5701,7 +5653,66 @@ where
|
|||
.next()
|
||||
.map(CosmicMappedRenderElement::TiledOverlay),
|
||||
x => Some(x),
|
||||
});
|
||||
};
|
||||
|
||||
let mut upper_elements = SmallVec::<[CosmicMappedRenderElement<R>; 4]>::new_const();
|
||||
let mut lower_elements = SmallVec::<[CosmicMappedRenderElement<R>; 4]>::new_const();
|
||||
mapped.push_render_elements(
|
||||
renderer,
|
||||
//original_location,
|
||||
geo.loc.as_logical().to_physical_precise_round(output_scale)
|
||||
- elem_geometry.loc,
|
||||
max_size,
|
||||
Scale::from(output_scale),
|
||||
alpha,
|
||||
None,
|
||||
scanout_node,
|
||||
&mut |elem| {
|
||||
if let Some(elem) = map_elem(elem) {
|
||||
upper_elements.push(elem)
|
||||
}
|
||||
},
|
||||
&mut |elem| {
|
||||
if let Some(elem) = map_elem(elem) {
|
||||
lower_elements.push(elem)
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
if swap_desc
|
||||
.as_ref()
|
||||
.filter(|swap_desc| swap_desc.node == node_id)
|
||||
.and_then(|swap_desc| swap_desc.stack_window.as_ref())
|
||||
.zip(focused.as_ref())
|
||||
.map(|(stack_window, focused_id)| {
|
||||
target_tree
|
||||
.get(focused_id)
|
||||
.ok()
|
||||
.map(|focused| match focused.data() {
|
||||
Data::Mapped { mapped, .. } => mapped
|
||||
.stack_ref()
|
||||
.map(|stack| &stack.active() == stack_window)
|
||||
.unwrap_or(false),
|
||||
_ => false,
|
||||
})
|
||||
.unwrap_or(false)
|
||||
})
|
||||
.unwrap_or(false)
|
||||
{
|
||||
let mut active_geo = mapped.active_window_geometry().as_local();
|
||||
active_geo.loc += geo.loc - mapped.geometry().loc.as_local();
|
||||
upper_elements.insert(
|
||||
0,
|
||||
CosmicMappedRenderElement::Overlay(BackdropShader::element(
|
||||
renderer,
|
||||
Key::Window(Usage::Overlay, mapped.key()),
|
||||
active_geo,
|
||||
0.0,
|
||||
0.3,
|
||||
group_color,
|
||||
)),
|
||||
)
|
||||
}
|
||||
|
||||
if swap_desc
|
||||
.as_ref()
|
||||
|
|
@ -5714,30 +5725,36 @@ where
|
|||
})
|
||||
.unwrap_or(false)
|
||||
{
|
||||
swap_elements.extend(upper_elements);
|
||||
swap_elements.extend(shadow_element);
|
||||
swap_elements.extend(elements);
|
||||
swap_elements.extend(lower_elements);
|
||||
} else if animating {
|
||||
animating_window_upper_elements.extend(upper_elements);
|
||||
animating_shadow_elements.extend(shadow_element);
|
||||
animating_window_lower_elements.extend(lower_elements);
|
||||
} else {
|
||||
window_upper_elements.extend(upper_elements);
|
||||
shadow_elements.extend(shadow_element);
|
||||
if animating {
|
||||
animating_window_elements.extend(elements);
|
||||
} else {
|
||||
window_elements.extend(elements);
|
||||
}
|
||||
window_lower_elements.extend(lower_elements);
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
resize_elements
|
||||
for elem in resize_element
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.chain(swap_elements)
|
||||
.chain(indicators)
|
||||
.chain(window_elements)
|
||||
.chain(animating_window_elements)
|
||||
.chain(window_upper_elements)
|
||||
.chain(shadow_elements)
|
||||
.chain(window_lower_elements)
|
||||
.chain(animating_window_upper_elements)
|
||||
.chain(animating_shadow_elements)
|
||||
.chain(animating_window_lower_elements)
|
||||
.chain(group_backdrop.into_iter().map(Into::into))
|
||||
.collect()
|
||||
{
|
||||
push(elem);
|
||||
}
|
||||
}
|
||||
|
||||
fn render_new_tree(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue