diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-06-09 13:39:08 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-06-09 13:43:28 +0300 |
| commit | c9b1514d63e49b079914a0413eb3500b0d804b99 (patch) | |
| tree | b7d9a7ec289116cc01a57ddb1efe04f8462aa984 /src/layout | |
| parent | 206673702452b4bcab1851fb2b17cdfa0682f6fd (diff) | |
| download | niri-c9b1514d63e49b079914a0413eb3500b0d804b99.tar.gz niri-c9b1514d63e49b079914a0413eb3500b0d804b99.tar.bz2 niri-c9b1514d63e49b079914a0413eb3500b0d804b99.zip | |
layout/scrolling: Store parent_area in ScrollingSpace
Diffstat (limited to 'src/layout')
| -rw-r--r-- | src/layout/scrolling.rs | 25 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 3 |
2 files changed, 21 insertions, 7 deletions
diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index 63569064..37e6a571 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -75,6 +75,12 @@ pub struct ScrollingSpace<W: LayoutElement> { /// Takes into account layer-shell exclusive zones and niri struts. working_area: Rectangle<f64, Logical>, + /// Working area for this space excluding struts. + /// + /// Used for popup unconstraining. Popups can go over struts, but they shouldn't go over + /// the layer-shell top layer (which renders on top of popups). + parent_area: Rectangle<f64, Logical>, + /// Scale of the output the space is on (and rounds its sizes to). scale: f64, @@ -251,12 +257,12 @@ pub enum ScrollDirection { impl<W: LayoutElement> ScrollingSpace<W> { pub fn new( view_size: Size<f64, Logical>, - working_area: Rectangle<f64, Logical>, + parent_area: Rectangle<f64, Logical>, scale: f64, clock: Clock, options: Rc<Options>, ) -> Self { - let working_area = compute_working_area(working_area, scale, options.struts); + let working_area = compute_working_area(parent_area, scale, options.struts); Self { columns: Vec::new(), @@ -269,6 +275,7 @@ impl<W: LayoutElement> ScrollingSpace<W> { closing_windows: Vec::new(), view_size, working_area, + parent_area, scale, clock, options, @@ -278,11 +285,11 @@ impl<W: LayoutElement> ScrollingSpace<W> { pub fn update_config( &mut self, view_size: Size<f64, Logical>, - working_area: Rectangle<f64, Logical>, + parent_area: Rectangle<f64, Logical>, scale: f64, options: Rc<Options>, ) { - let working_area = compute_working_area(working_area, scale, options.struts); + let working_area = compute_working_area(parent_area, scale, options.struts); for (column, data) in zip(&mut self.columns, &mut self.data) { column.update_config(view_size, working_area, scale, options.clone()); @@ -291,6 +298,7 @@ impl<W: LayoutElement> ScrollingSpace<W> { self.view_size = view_size; self.working_area = working_area; + self.parent_area = parent_area; self.scale = scale; self.options = options; @@ -3535,6 +3543,11 @@ impl<W: LayoutElement> ScrollingSpace<W> { } #[cfg(test)] + pub fn parent_area(&self) -> Rectangle<f64, Logical> { + self.parent_area + } + + #[cfg(test)] pub fn clock(&self) -> &Clock { &self.clock } @@ -3555,7 +3568,7 @@ impl<W: LayoutElement> ScrollingSpace<W> { } #[cfg(test)] - pub fn verify_invariants(&self, working_area: Rectangle<f64, Logical>) { + pub fn verify_invariants(&self) { assert!(self.view_size.w > 0.); assert!(self.view_size.h > 0.); assert!(self.scale > 0.); @@ -3563,7 +3576,7 @@ impl<W: LayoutElement> ScrollingSpace<W> { assert_eq!(self.columns.len(), self.data.len()); assert_eq!( self.working_area, - compute_working_area(working_area, self.scale, self.options.struts) + compute_working_area(self.parent_area, self.scale, self.options.struts) ); if !self.columns.is_empty() { diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 2f631f2f..3f5a07c5 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -1784,9 +1784,10 @@ impl<W: LayoutElement> Workspace<W> { assert!(scale.is_finite()); assert_eq!(self.view_size, self.scrolling.view_size()); + assert_eq!(self.working_area, self.scrolling.parent_area()); assert_eq!(&self.clock, self.scrolling.clock()); assert!(Rc::ptr_eq(&self.options, self.scrolling.options())); - self.scrolling.verify_invariants(self.working_area); + self.scrolling.verify_invariants(); assert_eq!(self.view_size, self.floating.view_size()); assert_eq!(self.working_area, self.floating.working_area()); |
