aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-08-27 09:49:04 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-08-27 10:43:57 +0300
commit1e3ab8a8808db07742825678ca38ed992bdf6767 (patch)
treeae4fe92245c6fb9b04d70a1d7ced6cbfec1c18e3
parentefa2ae2d3ff4d312a541a5afd1ae9e41cf2a4736 (diff)
downloadniri-1e3ab8a8808db07742825678ca38ed992bdf6767.tar.gz
niri-1e3ab8a8808db07742825678ca38ed992bdf6767.tar.bz2
niri-1e3ab8a8808db07742825678ca38ed992bdf6767.zip
config: Extract window_rule
-rw-r--r--niri-config/src/layer_rule.rs3
-rw-r--r--niri-config/src/lib.rs119
-rw-r--r--niri-config/src/window_rule.rs119
-rw-r--r--src/layer/mapped.rs3
-rw-r--r--src/window/mod.rs5
5 files changed, 129 insertions, 120 deletions
diff --git a/niri-config/src/layer_rule.rs b/niri-config/src/layer_rule.rs
index 2dee645c..08dad40b 100644
--- a/niri-config/src/layer_rule.rs
+++ b/niri-config/src/layer_rule.rs
@@ -1,4 +1,5 @@
-use crate::{BlockOutFrom, CornerRadius, RegexEq, ShadowRule};
+use crate::utils::RegexEq;
+use crate::{BlockOutFrom, CornerRadius, ShadowRule};
#[derive(knuffel::Decode, Debug, Default, Clone, PartialEq)]
pub struct LayerRule {
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs
index 2199d2fb..f0b89a4a 100644
--- a/niri-config/src/lib.rs
+++ b/niri-config/src/lib.rs
@@ -13,7 +13,6 @@ use std::time::Duration;
use bitflags::bitflags;
use knuffel::errors::DecodeError;
use knuffel::Decode as _;
-use layer_rule::LayerRule;
use miette::{miette, Context, IntoDiagnostic};
use niri_ipc::{
ColumnDisplay, ConfiguredMode, LayoutSwitchTarget, PositionChange, SizeChange, Transform,
@@ -29,9 +28,11 @@ pub const DEFAULT_BACKGROUND_COLOR: Color = Color::from_array_unpremul([0.25, 0.
pub const DEFAULT_BACKDROP_COLOR: Color = Color::from_array_unpremul([0.15, 0.15, 0.15, 1.]);
pub mod layer_rule;
+pub mod utils;
+pub mod window_rule;
-mod utils;
-pub use utils::RegexEq;
+pub use crate::layer_rule::LayerRule;
+pub use crate::window_rule::{FloatingPosition, RelativeTo, WindowRule};
#[derive(knuffel::Decode, Debug, PartialEq)]
pub struct Config {
@@ -1458,95 +1459,6 @@ pub struct Workspace {
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WorkspaceName(pub String);
-#[derive(knuffel::Decode, Debug, Default, Clone, PartialEq)]
-pub struct WindowRule {
- #[knuffel(children(name = "match"))]
- pub matches: Vec<Match>,
- #[knuffel(children(name = "exclude"))]
- pub excludes: Vec<Match>,
-
- // Rules applied at initial configure.
- #[knuffel(child)]
- pub default_column_width: Option<DefaultPresetSize>,
- #[knuffel(child)]
- pub default_window_height: Option<DefaultPresetSize>,
- #[knuffel(child, unwrap(argument))]
- pub open_on_output: Option<String>,
- #[knuffel(child, unwrap(argument))]
- pub open_on_workspace: Option<String>,
- #[knuffel(child, unwrap(argument))]
- pub open_maximized: Option<bool>,
- #[knuffel(child, unwrap(argument))]
- pub open_fullscreen: Option<bool>,
- #[knuffel(child, unwrap(argument))]
- pub open_floating: Option<bool>,
- #[knuffel(child, unwrap(argument))]
- pub open_focused: Option<bool>,
-
- // Rules applied dynamically.
- #[knuffel(child, unwrap(argument))]
- pub min_width: Option<u16>,
- #[knuffel(child, unwrap(argument))]
- pub min_height: Option<u16>,
- #[knuffel(child, unwrap(argument))]
- pub max_width: Option<u16>,
- #[knuffel(child, unwrap(argument))]
- pub max_height: Option<u16>,
-
- #[knuffel(child, default)]
- pub focus_ring: BorderRule,
- #[knuffel(child, default)]
- pub border: BorderRule,
- #[knuffel(child, default)]
- pub shadow: ShadowRule,
- #[knuffel(child, default)]
- pub tab_indicator: TabIndicatorRule,
- #[knuffel(child, unwrap(argument))]
- pub draw_border_with_background: Option<bool>,
- #[knuffel(child, unwrap(argument))]
- pub opacity: Option<f32>,
- #[knuffel(child)]
- pub geometry_corner_radius: Option<CornerRadius>,
- #[knuffel(child, unwrap(argument))]
- pub clip_to_geometry: Option<bool>,
- #[knuffel(child, unwrap(argument))]
- pub baba_is_float: Option<bool>,
- #[knuffel(child, unwrap(argument))]
- pub block_out_from: Option<BlockOutFrom>,
- #[knuffel(child, unwrap(argument))]
- pub variable_refresh_rate: Option<bool>,
- #[knuffel(child, unwrap(argument, str))]
- pub default_column_display: Option<ColumnDisplay>,
- #[knuffel(child)]
- pub default_floating_position: Option<FloatingPosition>,
- #[knuffel(child, unwrap(argument))]
- pub scroll_factor: Option<FloatOrInt<0, 100>>,
- #[knuffel(child, unwrap(argument))]
- pub tiled_state: Option<bool>,
-}
-
-#[derive(knuffel::Decode, Debug, Default, Clone, PartialEq)]
-pub struct Match {
- #[knuffel(property, str)]
- pub app_id: Option<RegexEq>,
- #[knuffel(property, str)]
- pub title: Option<RegexEq>,
- #[knuffel(property)]
- pub is_active: Option<bool>,
- #[knuffel(property)]
- pub is_focused: Option<bool>,
- #[knuffel(property)]
- pub is_active_in_column: Option<bool>,
- #[knuffel(property)]
- pub is_floating: Option<bool>,
- #[knuffel(property)]
- pub is_window_cast_target: Option<bool>,
- #[knuffel(property)]
- pub is_urgent: Option<bool>,
- #[knuffel(property)]
- pub at_startup: Option<bool>,
-}
-
#[derive(Debug, Default, Clone, Copy, PartialEq)]
pub struct CornerRadius {
pub top_left: f32,
@@ -1641,29 +1553,6 @@ pub struct TabIndicatorRule {
pub urgent_gradient: Option<Gradient>,
}
-#[derive(knuffel::Decode, Debug, Clone, Copy, PartialEq)]
-pub struct FloatingPosition {
- #[knuffel(property)]
- pub x: FloatOrInt<-65535, 65535>,
- #[knuffel(property)]
- pub y: FloatOrInt<-65535, 65535>,
- #[knuffel(property, default)]
- pub relative_to: RelativeTo,
-}
-
-#[derive(knuffel::DecodeScalar, Debug, Default, Clone, Copy, PartialEq, Eq)]
-pub enum RelativeTo {
- #[default]
- TopLeft,
- TopRight,
- BottomLeft,
- BottomRight,
- Top,
- Bottom,
- Left,
- Right,
-}
-
#[derive(Debug, Default, PartialEq)]
pub struct Binds(pub Vec<Bind>);
diff --git a/niri-config/src/window_rule.rs b/niri-config/src/window_rule.rs
new file mode 100644
index 00000000..fbde29da
--- /dev/null
+++ b/niri-config/src/window_rule.rs
@@ -0,0 +1,119 @@
+use niri_ipc::ColumnDisplay;
+
+use crate::utils::RegexEq;
+use crate::{
+ BlockOutFrom, BorderRule, CornerRadius, DefaultPresetSize, FloatOrInt, ShadowRule,
+ TabIndicatorRule,
+};
+
+#[derive(knuffel::Decode, Debug, Default, Clone, PartialEq)]
+pub struct WindowRule {
+ #[knuffel(children(name = "match"))]
+ pub matches: Vec<Match>,
+ #[knuffel(children(name = "exclude"))]
+ pub excludes: Vec<Match>,
+
+ // Rules applied at initial configure.
+ #[knuffel(child)]
+ pub default_column_width: Option<DefaultPresetSize>,
+ #[knuffel(child)]
+ pub default_window_height: Option<DefaultPresetSize>,
+ #[knuffel(child, unwrap(argument))]
+ pub open_on_output: Option<String>,
+ #[knuffel(child, unwrap(argument))]
+ pub open_on_workspace: Option<String>,
+ #[knuffel(child, unwrap(argument))]
+ pub open_maximized: Option<bool>,
+ #[knuffel(child, unwrap(argument))]
+ pub open_fullscreen: Option<bool>,
+ #[knuffel(child, unwrap(argument))]
+ pub open_floating: Option<bool>,
+ #[knuffel(child, unwrap(argument))]
+ pub open_focused: Option<bool>,
+
+ // Rules applied dynamically.
+ #[knuffel(child, unwrap(argument))]
+ pub min_width: Option<u16>,
+ #[knuffel(child, unwrap(argument))]
+ pub min_height: Option<u16>,
+ #[knuffel(child, unwrap(argument))]
+ pub max_width: Option<u16>,
+ #[knuffel(child, unwrap(argument))]
+ pub max_height: Option<u16>,
+
+ #[knuffel(child, default)]
+ pub focus_ring: BorderRule,
+ #[knuffel(child, default)]
+ pub border: BorderRule,
+ #[knuffel(child, default)]
+ pub shadow: ShadowRule,
+ #[knuffel(child, default)]
+ pub tab_indicator: TabIndicatorRule,
+ #[knuffel(child, unwrap(argument))]
+ pub draw_border_with_background: Option<bool>,
+ #[knuffel(child, unwrap(argument))]
+ pub opacity: Option<f32>,
+ #[knuffel(child)]
+ pub geometry_corner_radius: Option<CornerRadius>,
+ #[knuffel(child, unwrap(argument))]
+ pub clip_to_geometry: Option<bool>,
+ #[knuffel(child, unwrap(argument))]
+ pub baba_is_float: Option<bool>,
+ #[knuffel(child, unwrap(argument))]
+ pub block_out_from: Option<BlockOutFrom>,
+ #[knuffel(child, unwrap(argument))]
+ pub variable_refresh_rate: Option<bool>,
+ #[knuffel(child, unwrap(argument, str))]
+ pub default_column_display: Option<ColumnDisplay>,
+ #[knuffel(child)]
+ pub default_floating_position: Option<FloatingPosition>,
+ #[knuffel(child, unwrap(argument))]
+ pub scroll_factor: Option<FloatOrInt<0, 100>>,
+ #[knuffel(child, unwrap(argument))]
+ pub tiled_state: Option<bool>,
+}
+
+#[derive(knuffel::Decode, Debug, Default, Clone, PartialEq)]
+pub struct Match {
+ #[knuffel(property, str)]
+ pub app_id: Option<RegexEq>,
+ #[knuffel(property, str)]
+ pub title: Option<RegexEq>,
+ #[knuffel(property)]
+ pub is_active: Option<bool>,
+ #[knuffel(property)]
+ pub is_focused: Option<bool>,
+ #[knuffel(property)]
+ pub is_active_in_column: Option<bool>,
+ #[knuffel(property)]
+ pub is_floating: Option<bool>,
+ #[knuffel(property)]
+ pub is_window_cast_target: Option<bool>,
+ #[knuffel(property)]
+ pub is_urgent: Option<bool>,
+ #[knuffel(property)]
+ pub at_startup: Option<bool>,
+}
+
+#[derive(knuffel::Decode, Debug, Clone, Copy, PartialEq)]
+pub struct FloatingPosition {
+ #[knuffel(property)]
+ pub x: FloatOrInt<-65535, 65535>,
+ #[knuffel(property)]
+ pub y: FloatOrInt<-65535, 65535>,
+ #[knuffel(property, default)]
+ pub relative_to: RelativeTo,
+}
+
+#[derive(knuffel::DecodeScalar, Debug, Default, Clone, Copy, PartialEq, Eq)]
+pub enum RelativeTo {
+ #[default]
+ TopLeft,
+ TopRight,
+ BottomLeft,
+ BottomRight,
+ Top,
+ Bottom,
+ Left,
+ Right,
+}
diff --git a/src/layer/mapped.rs b/src/layer/mapped.rs
index 8262bf64..b12906b2 100644
--- a/src/layer/mapped.rs
+++ b/src/layer/mapped.rs
@@ -1,5 +1,4 @@
-use niri_config::layer_rule::LayerRule;
-use niri_config::Config;
+use niri_config::{Config, LayerRule};
use smithay::backend::renderer::element::surface::{
render_elements_from_surface_tree, WaylandSurfaceRenderElement,
};
diff --git a/src/window/mod.rs b/src/window/mod.rs
index e0893b79..b07b80d8 100644
--- a/src/window/mod.rs
+++ b/src/window/mod.rs
@@ -1,8 +1,9 @@
use std::cmp::{max, min};
+use niri_config::window_rule::{Match, WindowRule};
use niri_config::{
- BlockOutFrom, BorderRule, CornerRadius, FloatingPosition, Match, PresetSize, ShadowRule,
- TabIndicatorRule, WindowRule,
+ BlockOutFrom, BorderRule, CornerRadius, FloatingPosition, PresetSize, ShadowRule,
+ TabIndicatorRule,
};
use niri_ipc::ColumnDisplay;
use smithay::reexports::wayland_protocols::xdg::shell::server::xdg_toplevel;