aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-06-09 13:39:08 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-06-09 13:43:28 +0300
commitc9b1514d63e49b079914a0413eb3500b0d804b99 (patch)
treeb7d9a7ec289116cc01a57ddb1efe04f8462aa984 /src/layout
parent206673702452b4bcab1851fb2b17cdfa0682f6fd (diff)
downloadniri-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.rs25
-rw-r--r--src/layout/workspace.rs3
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());