diff --git a/src/backend/render/mod.rs b/src/backend/render/mod.rs index efb27b41..45483ad8 100644 --- a/src/backend/render/mod.rs +++ b/src/backend/render/mod.rs @@ -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::(renderer, output, &state.shell.override_redirect_windows) + .render_output::( + renderer, + output, + &state.shell.override_redirect_windows, + state.xwayland_state.values_mut(), + ) .map_err(|_| OutputNoMode)? .into_iter() .map(Into::into), diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index 81d4c1fa..172b333e 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -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( + pub fn render_output<'a, R>( &self, renderer: &mut R, output: &Output, override_redirect_windows: &[super::OverrideRedirectWindow], + xwm_state: impl Iterator, ) -> Result>, 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(