diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index a67fcb24c..fce6cd9c1 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -1505,7 +1505,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 @@ -1548,9 +1547,20 @@ 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::>::into(elem) + } }; fullscreen @@ -1563,8 +1573,7 @@ impl Workspace { Some(true), ) .into_iter() - .map(|elem| RescaleRenderElement::from_element(elem, render_loc, scale)) - .map(Into::into) + .map(animation_rescale) .collect::>() } else { Vec::new() diff --git a/src/wayland/handlers/xdg_shell/popup.rs b/src/wayland/handlers/xdg_shell/popup.rs index 5f9017d9d..57264b642 100644 --- a/src/wayland/handlers/xdg_shell/popup.rs +++ b/src/wayland/handlers/xdg_shell/popup.rs @@ -67,6 +67,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)