workspace: Update xwayland render order

This commit is contained in:
Victoria Brekenfeld 2023-01-23 22:56:10 +01:00
parent 4f93222586
commit ae42c5ede9
2 changed files with 37 additions and 23 deletions

View file

@ -171,24 +171,6 @@ where
fps,
);
/*
if let Ok((_, states)) = result.as_ref() {
for xwm in state
.xwayland_state
.values_mut()
.flat_map(|state| state.xwm.as_mut())
{
if let Err(err) = xwm.update_stacking_order_upwards(states.states.keys()) {
slog_scope::warn!(
"Failed to update Xwm ({:?}) stacking order: {}",
xwm.id(),
err
);
}
}
}
*/
result
}
@ -278,7 +260,12 @@ where
elements.extend(
workspace
.render_output::<R>(renderer, output, &state.shell.override_redirect_windows)
.render_output::<R>(
renderer,
output,
&state.shell.override_redirect_windows,
state.xwayland_state.values_mut(),
)
.map_err(|_| OutputNoMode)?
.into_iter()
.map(Into::into),

View file

@ -13,6 +13,7 @@ use crate::{
workspace::WorkspaceHandle,
},
},
xwayland::XWaylandState,
};
use indexmap::IndexSet;
@ -392,11 +393,12 @@ impl Workspace {
self.floating_layer.mapped().any(|m| m == mapped)
}
pub fn render_output<R>(
pub fn render_output<'a, R>(
&self,
renderer: &mut R,
output: &Output,
override_redirect_windows: &[super::OverrideRedirectWindow],
xwm_state: impl Iterator<Item = &'a mut XWaylandState>,
) -> Result<Vec<WorkspaceRenderElement<R>>, OutputNotMapped>
where
R: Renderer + ImportAll + ImportMem + AsGlowRenderer,
@ -458,6 +460,18 @@ impl Workspace {
>(
fullscreen, renderer, (0, 0).into(), output_scale.into()
));
for xwm in xwm_state.flat_map(|state| state.xwm.as_mut()) {
if let Err(err) =
xwm.update_stacking_order_upwards(render_elements.iter().rev().map(|e| e.id()))
{
slog_scope::warn!(
"Failed to update Xwm ({:?}) stacking order: {}",
xwm.id(),
err
);
}
}
} else {
// TODO: Handle modes like
// - keyboard window swapping
@ -559,10 +573,8 @@ impl Workspace {
}
}
render_elements.extend(window_elements.into_iter());
// OR windows below all
render_elements.extend(
window_elements.extend(
override_redirect_windows
.iter()
.filter(|or| {
@ -583,6 +595,21 @@ impl Workspace {
)
}),
);
for xwm in xwm_state.flat_map(|state| state.xwm.as_mut()) {
if let Err(err) =
xwm.update_stacking_order_upwards(window_elements.iter().rev().map(|e| e.id()))
{
slog_scope::warn!(
"Failed to update Xwm ({:?}) stacking order: {}",
xwm.id(),
err
);
}
}
render_elements.extend(window_elements.into_iter());
// bottom and background layer surfaces
{
render_elements.extend(