From 9f07d156170c98207796f3da8f273d1734e9a943 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Wed, 26 Mar 2025 15:49:22 -0700 Subject: [PATCH] subsurface_widget: Fix use of `place_above` `place_above` moves the subsurface within the stack of subsurfaces, so calling it for all previous surfaces is wrong. We also need to use the `z` from `view_subsurfaces` if this is called before `attach_and_commit`, or an old value will be used. --- .../platform_specific/wayland/subsurface_widget.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/winit/src/platform_specific/wayland/subsurface_widget.rs b/winit/src/platform_specific/wayland/subsurface_widget.rs index 7c9b919b..969330a2 100644 --- a/winit/src/platform_specific/wayland/subsurface_widget.rs +++ b/winit/src/platform_specific/wayland/subsurface_widget.rs @@ -512,12 +512,14 @@ impl SubsurfaceState { let mut sorted_subsurfaces: Vec<_> = view_subsurfaces .iter() .zip(subsurfaces.iter_mut()) - .map(|(_, instance)| { + .map(|(subsurface_info, instance)| { ( instance.parent.clone(), instance.wl_subsurface.clone(), instance.wl_surface.clone(), - instance.z, + // Use from `view_subsurfaces`; not updated in `subsurfaces` + // until `attach_and_commit` + subsurface_info.z, ) }) .chain(self.new_iced_subsurfaces.clone().into_iter().map( @@ -544,10 +546,10 @@ impl SubsurfaceState { let prev = &sorted_subsurfaces[0..i]; let subsurface = &sorted_subsurfaces[i]; for prev in prev.iter().rev() { - if prev.0 != subsurface.0 { - continue; + if prev.0 == subsurface.0 { + subsurface.1.place_above(&prev.2); + break; } - subsurface.1.place_above(&prev.2); } } }