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, 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 result
} }
@ -278,7 +260,12 @@ where
elements.extend( elements.extend(
workspace 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)? .map_err(|_| OutputNoMode)?
.into_iter() .into_iter()
.map(Into::into), .map(Into::into),

View file

@ -13,6 +13,7 @@ use crate::{
workspace::WorkspaceHandle, workspace::WorkspaceHandle,
}, },
}, },
xwayland::XWaylandState,
}; };
use indexmap::IndexSet; use indexmap::IndexSet;
@ -392,11 +393,12 @@ impl Workspace {
self.floating_layer.mapped().any(|m| m == mapped) self.floating_layer.mapped().any(|m| m == mapped)
} }
pub fn render_output<R>( pub fn render_output<'a, R>(
&self, &self,
renderer: &mut R, renderer: &mut R,
output: &Output, output: &Output,
override_redirect_windows: &[super::OverrideRedirectWindow], override_redirect_windows: &[super::OverrideRedirectWindow],
xwm_state: impl Iterator<Item = &'a mut XWaylandState>,
) -> Result<Vec<WorkspaceRenderElement<R>>, OutputNotMapped> ) -> Result<Vec<WorkspaceRenderElement<R>>, OutputNotMapped>
where where
R: Renderer + ImportAll + ImportMem + AsGlowRenderer, R: Renderer + ImportAll + ImportMem + AsGlowRenderer,
@ -458,6 +460,18 @@ impl Workspace {
>( >(
fullscreen, renderer, (0, 0).into(), output_scale.into() 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 { } else {
// TODO: Handle modes like // TODO: Handle modes like
// - keyboard window swapping // - keyboard window swapping
@ -559,10 +573,8 @@ impl Workspace {
} }
} }
render_elements.extend(window_elements.into_iter());
// OR windows below all // OR windows below all
render_elements.extend( window_elements.extend(
override_redirect_windows override_redirect_windows
.iter() .iter()
.filter(|or| { .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 // bottom and background layer surfaces
{ {
render_elements.extend( render_elements.extend(