Fix bars when full screen, reposition popups

This commit is contained in:
Peter Krull 2025-09-20 20:38:25 +02:00 committed by Jeremy Soller
parent e129094bfb
commit fc9fe59ed9
2 changed files with 20 additions and 6 deletions

View file

@ -1517,7 +1517,6 @@ impl Workspace {
let focused = self.focus_stack.get(last_active_seat).last().cloned();
let mut fullscreen_elements = if let Some(fullscreen) = self.fullscreen.as_ref() {
let bbox = fullscreen.surface.bbox();
let fullscreen_geo = self.fullscreen_geometry().unwrap();
let previous_geo = fullscreen
.previous_geometry
@ -1560,9 +1559,18 @@ impl Workspace {
.loc
.as_logical()
.to_physical_precise_round(output_scale);
let scale = Scale {
x: target_geo.size.w as f64 / bbox.size.w as f64,
y: target_geo.size.h as f64 / bbox.size.h as f64,
// Only rescale geometry when animating
let animation_rescale = |elem| if fullscreen.is_animating() {
let fullscreen_geo = fullscreen.surface.0.geometry();
let scale = Scale {
x: target_geo.size.w as f64 / fullscreen_geo.size.w as f64,
y: target_geo.size.h as f64 / fullscreen_geo.size.h as f64,
};
RescaleRenderElement::from_element(elem, render_loc, scale).into()
} else {
Into::<WorkspaceRenderElement<_>>::into(elem)
};
fullscreen
@ -1575,8 +1583,7 @@ impl Workspace {
Some(true),
)
.into_iter()
.map(|elem| RescaleRenderElement::from_element(elem, render_loc, scale))
.map(Into::into)
.map(animation_rescale)
.collect::<Vec<_>>()
} else {
Vec::new()

View file

@ -69,6 +69,13 @@ impl Shell {
} else {
unconstrain_xdg_popup(surface, window_loc, output.geometry());
}
} else if let Some(output) = self.workspaces.spaces().find_map(|w| {
w.fullscreen.as_ref().and_then(|f| {
(f.surface.wl_surface().as_deref() == Some(&parent)).then_some(w.output())
})
}) {
let window_loc = output.geometry().loc;
unconstrain_xdg_popup(surface, window_loc, output.geometry());
} else if let Some((output, layer_surface)) = self.outputs().find_map(|o| {
let map = layer_map_for_output(o);
map.layer_for_surface(&parent, WindowSurfaceType::ALL)