aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/mod.rs23
-rw-r--r--src/layout/workspace.rs12
2 files changed, 33 insertions, 2 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index 39fa2837..abcf9d43 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -80,6 +80,19 @@ pub struct InteractiveResizeData {
pub edges: ResizeEdge,
}
+#[derive(Debug, Clone, Copy)]
+pub enum ConfigureIntent {
+ /// A configure is not needed (no changes to server pending state).
+ NotNeeded,
+ /// A configure is throttled (due to resizing too fast for example).
+ Throttled,
+ /// Can send the configure if it isn't throttled externally (only size changed).
+ CanSend,
+ /// Should send the configure regardless of external throttling (something other than size
+ /// changed).
+ ShouldSend,
+}
+
pub trait LayoutElement {
/// Type that can be used as a unique ID of this element.
type Id: PartialEq + std::fmt::Debug;
@@ -154,6 +167,7 @@ pub trait LayoutElement {
fn set_active_in_column(&mut self, active: bool);
fn set_bounds(&self, bounds: Size<i32, Logical>);
+ fn configure_intent(&self) -> ConfigureIntent;
fn send_pending_configure(&mut self);
/// Whether the element is currently fullscreen.
@@ -220,6 +234,9 @@ pub struct Options {
/// Initial width for new columns.
pub default_width: Option<ColumnWidth>,
pub animations: niri_config::Animations,
+
+ // Debug flags.
+ pub disable_resize_throttling: bool,
}
impl Default for Options {
@@ -237,6 +254,7 @@ impl Default for Options {
],
default_width: None,
animations: Default::default(),
+ disable_resize_throttling: false,
}
}
}
@@ -273,6 +291,7 @@ impl Options {
preset_widths,
default_width,
animations: config.animations.clone(),
+ disable_resize_throttling: config.debug.disable_resize_throttling,
}
}
@@ -2654,6 +2673,10 @@ mod tests {
fn set_bounds(&self, _bounds: Size<i32, Logical>) {}
+ fn configure_intent(&self) -> ConfigureIntent {
+ ConfigureIntent::CanSend
+ }
+
fn send_pending_configure(&mut self) {}
fn set_active_in_column(&mut self, _active: bool) {}
diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs
index 85ba7b46..8f0ae6e3 100644
--- a/src/layout/workspace.rs
+++ b/src/layout/workspace.rs
@@ -15,7 +15,7 @@ use smithay::utils::{Logical, Point, Rectangle, Scale, Serial, Size, Transform};
use super::closing_window::{ClosingWindow, ClosingWindowRenderElement};
use super::tile::{Tile, TileRenderElement};
-use super::{InteractiveResizeData, LayoutElement, Options};
+use super::{ConfigureIntent, InteractiveResizeData, LayoutElement, Options};
use crate::animation::Animation;
use crate::input::swipe_tracker::SwipeTracker;
use crate::niri_render_elements;
@@ -2759,7 +2759,15 @@ impl<W: LayoutElement> Workspace<W> {
);
win.set_bounds(bounds);
- win.send_pending_configure();
+ let intent = win.configure_intent();
+
+ if matches!(
+ intent,
+ ConfigureIntent::CanSend | ConfigureIntent::ShouldSend
+ ) {
+ win.send_pending_configure();
+ }
+
win.refresh();
}
}