diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-08-27 09:49:04 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-08-27 10:43:57 +0300 |
| commit | 1e3ab8a8808db07742825678ca38ed992bdf6767 (patch) | |
| tree | ae4fe92245c6fb9b04d70a1d7ced6cbfec1c18e3 | |
| parent | efa2ae2d3ff4d312a541a5afd1ae9e41cf2a4736 (diff) | |
| download | niri-1e3ab8a8808db07742825678ca38ed992bdf6767.tar.gz niri-1e3ab8a8808db07742825678ca38ed992bdf6767.tar.bz2 niri-1e3ab8a8808db07742825678ca38ed992bdf6767.zip | |
config: Extract window_rule
| -rw-r--r-- | niri-config/src/layer_rule.rs | 3 | ||||
| -rw-r--r-- | niri-config/src/lib.rs | 119 | ||||
| -rw-r--r-- | niri-config/src/window_rule.rs | 119 | ||||
| -rw-r--r-- | src/layer/mapped.rs | 3 | ||||
| -rw-r--r-- | src/window/mod.rs | 5 |
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; |
