diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-09-20 12:57:40 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-10-02 09:33:08 +0300 |
| commit | 2781d3a74338806f631acda99e9f702b1b59a3e6 (patch) | |
| tree | b7066f8476fe2ba0b18b961c0360001070ec54cb | |
| parent | e739ce8171705dd0b87c317cc0f4509b7f16f6df (diff) | |
| download | niri-2781d3a74338806f631acda99e9f702b1b59a3e6.tar.gz niri-2781d3a74338806f631acda99e9f702b1b59a3e6.tar.bz2 niri-2781d3a74338806f631acda99e9f702b1b59a3e6.zip | |
config: Replace resolve_against with MergeWith
| -rw-r--r-- | niri-config/src/appearance.rs | 122 | ||||
| -rw-r--r-- | niri-config/src/macros.rs | 24 | ||||
| -rw-r--r-- | src/layer/mapped.rs | 5 | ||||
| -rw-r--r-- | src/layout/floating.rs | 7 | ||||
| -rw-r--r-- | src/layout/mod.rs | 3 | ||||
| -rw-r--r-- | src/layout/scrolling.rs | 7 | ||||
| -rw-r--r-- | src/layout/tile.rs | 29 |
7 files changed, 97 insertions, 100 deletions
diff --git a/niri-config/src/appearance.rs b/niri-config/src/appearance.rs index 5785d5c7..dfe4ebbb 100644 --- a/niri-config/src/appearance.rs +++ b/niri-config/src/appearance.rs @@ -322,6 +322,32 @@ impl From<FocusRing> for Border { } } +impl MergeWith<BorderRule> for Border { + fn merge_with(&mut self, part: &BorderRule) { + self.off |= part.off; + if part.on { + self.off = false; + } + + merge_clone!((self, part), width); + + merge_color_gradient!( + (self, part), + (active_color, active_gradient), + (inactive_color, inactive_gradient), + (urgent_color, urgent_gradient), + ); + } +} + +impl MergeWith<BorderRule> for FocusRing { + fn merge_with(&mut self, part: &BorderRule) { + let mut x = Border::from(*self); + x.merge_with(part); + *self = FocusRing::from(x); + } +} + #[derive(knuffel::Decode, Debug, Clone, Copy, PartialEq)] pub struct Shadow { #[knuffel(child)] @@ -357,6 +383,21 @@ impl Default for Shadow { } } +impl MergeWith<ShadowRule> for Shadow { + fn merge_with(&mut self, part: &ShadowRule) { + self.on |= part.on; + if part.off { + self.on = false; + } + + merge_clone!((self, part), softness, spread); + + merge_clone!((self, part), offset, draw_behind_window, color); + + merge_clone_opt!((self, part), inactive_color); + } +} + #[derive(knuffel::Decode, Debug, Clone, Copy, PartialEq)] pub struct ShadowOffset { #[knuffel(property, default)] @@ -579,42 +620,6 @@ impl MergeWith<Self> for BorderRule { } } -impl BorderRule { - pub fn resolve_against(&self, mut config: Border) -> Border { - config.off |= self.off; - if self.on { - config.off = false; - } - - if let Some(x) = self.width { - config.width = x; - } - if let Some(x) = self.active_color { - config.active_color = x; - config.active_gradient = None; - } - if let Some(x) = self.inactive_color { - config.inactive_color = x; - config.inactive_gradient = None; - } - if let Some(x) = self.urgent_color { - config.urgent_color = x; - config.urgent_gradient = None; - } - if let Some(x) = self.active_gradient { - config.active_gradient = Some(x); - } - if let Some(x) = self.inactive_gradient { - config.inactive_gradient = Some(x); - } - if let Some(x) = self.urgent_gradient { - config.urgent_gradient = Some(x); - } - - config - } -} - impl MergeWith<Self> for ShadowRule { fn merge_with(&mut self, part: &Self) { merge_on_off!((self, part)); @@ -631,36 +636,6 @@ impl MergeWith<Self> for ShadowRule { } } -impl ShadowRule { - pub fn resolve_against(&self, mut config: Shadow) -> Shadow { - config.on |= self.on; - if self.off { - config.on = false; - } - - if let Some(x) = self.offset { - config.offset = x; - } - if let Some(x) = self.softness { - config.softness = x; - } - if let Some(x) = self.spread { - config.spread = x; - } - if let Some(x) = self.draw_behind_window { - config.draw_behind_window = x; - } - if let Some(x) = self.color { - config.color = x; - } - if let Some(x) = self.inactive_color { - config.inactive_color = Some(x); - } - - config - } -} - impl MergeWith<Self> for TabIndicatorRule { fn merge_with(&mut self, part: &Self) { merge_color_gradient_opt!( @@ -1063,17 +1038,14 @@ mod tests { resolved.merge_with(&rule); } - let config = Border { + let mut border = Border { off: config == "off", ..Default::default() }; - if resolved.resolve_against(config).off { - "off" - } else { - "on" - } - .to_owned() + border.merge_with(&resolved); + + if border.off { "off" } else { "on" }.to_owned() } assert_snapshot!(is_on("off", &[]), @"off"); @@ -1128,7 +1100,7 @@ mod tests { border_rule.merge_with(&rule.border); } - let border = border_rule.resolve_against(config.layout.border); + let border = config.layout.border.merged_with(&border_rule); // Gradient should be None because it's overwritten. assert_debug_snapshot!( @@ -1201,7 +1173,7 @@ mod tests { tab_indicator_rule.merge_with(&rule.tab_indicator); } - let border = border_rule.resolve_against(config.layout.border); + let border = config.layout.border.merged_with(&border_rule); // Gradient should be None because it's overwritten. assert_debug_snapshot!( diff --git a/niri-config/src/macros.rs b/niri-config/src/macros.rs index 380111e2..dccb5db5 100644 --- a/niri-config/src/macros.rs +++ b/niri-config/src/macros.rs @@ -1,3 +1,13 @@ +macro_rules! merge_clone { + (($self:expr, $part:expr), $($field:ident),+ $(,)*) => { + $( + if let Some(x) = &$part.$field { + $self.$field.clone_from(x); + } + )+ + }; +} + macro_rules! merge_clone_opt { (($self:expr, $part:expr), $($field:ident),+ $(,)*) => { $( @@ -8,6 +18,20 @@ macro_rules! merge_clone_opt { }; } +macro_rules! merge_color_gradient { + (($self:expr, $part:expr), $(($color:ident, $gradient:ident)),+ $(,)*) => { + $( + if let Some(x) = $part.$color { + $self.$color = x; + $self.$gradient = None; + } + if let Some(x) = $part.$gradient { + $self.$gradient = Some(x); + } + )+ + }; +} + macro_rules! merge_color_gradient_opt { (($self:expr, $part:expr), $(($color:ident, $gradient:ident)),+ $(,)*) => { $( diff --git a/src/layer/mapped.rs b/src/layer/mapped.rs index b12906b2..658a0c15 100644 --- a/src/layer/mapped.rs +++ b/src/layer/mapped.rs @@ -1,3 +1,4 @@ +use niri_config::utils::MergeWith as _; use niri_config::{Config, LayerRule}; use smithay::backend::renderer::element::surface::{ render_elements_from_surface_tree, WaylandSurfaceRenderElement, @@ -61,7 +62,7 @@ impl MappedLayer { let mut shadow_config = config.layout.shadow; // Shadows for layer surfaces need to be explicitly enabled. shadow_config.on = false; - let shadow_config = rules.shadow.resolve_against(shadow_config); + shadow_config.merge_with(&rules.shadow); Self { surface, @@ -78,7 +79,7 @@ impl MappedLayer { let mut shadow_config = config.layout.shadow; // Shadows for layer surfaces need to be explicitly enabled. shadow_config.on = false; - let shadow_config = self.rules.shadow.resolve_against(shadow_config); + shadow_config.merge_with(&self.rules.shadow); self.shadow.update_config(shadow_config); } diff --git a/src/layout/floating.rs b/src/layout/floating.rs index 4a5251ca..8854ca17 100644 --- a/src/layout/floating.rs +++ b/src/layout/floating.rs @@ -2,6 +2,7 @@ use std::cmp::max; use std::iter::zip; use std::rc::Rc; +use niri_config::utils::MergeWith as _; use niri_config::{PresetSize, RelativeTo}; use niri_ipc::{PositionChange, SizeChange, WindowLayout}; use smithay::backend::renderer::gles::GlesRenderer; @@ -339,7 +340,7 @@ impl<W: LayoutElement> FloatingSpace<W> { } pub fn new_window_toplevel_bounds(&self, rules: &ResolvedWindowRules) -> Size<i32, Logical> { - let border_config = rules.border.resolve_against(self.options.border); + let border_config = self.options.border.merged_with(&rules.border); compute_toplevel_bounds(border_config, self.working_area.size) } @@ -1155,7 +1156,7 @@ impl<W: LayoutElement> FloatingSpace<W> { .map(|resize| resize.data); win.set_interactive_resize(resize_data); - let border_config = win.rules().border.resolve_against(self.options.border); + let border_config = self.options.border.merged_with(&win.rules().border); let bounds = compute_toplevel_bounds(border_config, self.working_area.size); win.set_bounds(bounds); @@ -1219,7 +1220,7 @@ impl<W: LayoutElement> FloatingSpace<W> { height: Option<PresetSize>, rules: &ResolvedWindowRules, ) -> Size<i32, Logical> { - let border = rules.border.resolve_against(self.options.border); + let border = self.options.border.merged_with(&rules.border); let resolve = |size: Option<PresetSize>, working_area_size: f64| { if let Some(size) = size { diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 370640b9..c7d8a6fd 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -38,6 +38,7 @@ use std::rc::Rc; use std::time::Duration; use monitor::{InsertHint, InsertPosition, InsertWorkspace, MonitorAddWindowTarget}; +use niri_config::utils::MergeWith as _; use niri_config::{ CenterFocusedColumn, Config, CornerRadius, FloatOrInt, PresetSize, Struts, Workspace as WorkspaceConfig, WorkspaceReference, @@ -5249,7 +5250,7 @@ impl<W: LayoutElement> Layout<W> { // Add border width since ColumnWidth includes borders. let rules = window.rules(); - let border = rules.border.resolve_against(self.options.border); + let border = self.options.border.merged_with(&rules.border); if !border.off { fixed += border.width.0 * 2.; } diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index 2030bb36..5f53ccee 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -3,6 +3,7 @@ use std::iter::{self, zip}; use std::rc::Rc; use std::time::Duration; +use niri_config::utils::MergeWith as _; use niri_config::{CenterFocusedColumn, PresetSize, Struts}; use niri_ipc::{ColumnDisplay, SizeChange, WindowLayout}; use ordered_float::NotNan; @@ -443,7 +444,7 @@ impl<W: LayoutElement> ScrollingSpace<W> { } pub fn new_window_toplevel_bounds(&self, rules: &ResolvedWindowRules) -> Size<i32, Logical> { - let border_config = rules.border.resolve_against(self.options.border); + let border_config = self.options.border.merged_with(&rules.border); let display_mode = rules .default_column_display @@ -469,7 +470,7 @@ impl<W: LayoutElement> ScrollingSpace<W> { height: Option<PresetSize>, rules: &ResolvedWindowRules, ) -> Size<i32, Logical> { - let border = rules.border.resolve_against(self.options.border); + let border = self.options.border.merged_with(&rules.border); let display_mode = rules .default_column_display @@ -3547,7 +3548,7 @@ impl<W: LayoutElement> ScrollingSpace<W> { win.set_interactive_resize(col_resize_data); - let border_config = win.rules().border.resolve_against(self.options.border); + let border_config = self.options.border.merged_with(&win.rules().border); let bounds = compute_toplevel_bounds( border_config, self.working_area.size, diff --git a/src/layout/tile.rs b/src/layout/tile.rs index 89c9f93d..a560bd55 100644 --- a/src/layout/tile.rs +++ b/src/layout/tile.rs @@ -1,6 +1,7 @@ use core::f64; use std::rc::Rc; +use niri_config::utils::MergeWith as _; use niri_config::{Color, CornerRadius, GradientInterpolation}; use niri_ipc::WindowLayout; use smithay::backend::renderer::element::{Element, Kind}; @@ -174,15 +175,15 @@ impl<W: LayoutElement> Tile<W> { options: Rc<Options>, ) -> Self { let rules = window.rules(); - let border_config = rules.border.resolve_against(options.border); - let focus_ring_config = rules.focus_ring.resolve_against(options.focus_ring.into()); - let shadow_config = rules.shadow.resolve_against(options.shadow); + let border_config = options.border.merged_with(&rules.border); + let focus_ring_config = options.focus_ring.merged_with(&rules.focus_ring); + let shadow_config = options.shadow.merged_with(&rules.shadow); let is_fullscreen = window.is_fullscreen(); Self { window, border: FocusRing::new(border_config.into()), - focus_ring: FocusRing::new(focus_ring_config.into()), + focus_ring: FocusRing::new(focus_ring_config), shadow: Shadow::new(shadow_config), is_fullscreen, fullscreen_backdrop: SolidColorBuffer::new((0., 0.), [0., 0., 0., 1.]), @@ -226,15 +227,13 @@ impl<W: LayoutElement> Tile<W> { let rules = self.window.rules(); - let border_config = rules.border.resolve_against(self.options.border); + let border_config = self.options.border.merged_with(&rules.border); self.border.update_config(border_config.into()); - let focus_ring_config = rules - .focus_ring - .resolve_against(self.options.focus_ring.into()); - self.focus_ring.update_config(focus_ring_config.into()); + let focus_ring_config = self.options.focus_ring.merged_with(&rules.focus_ring); + self.focus_ring.update_config(focus_ring_config); - let shadow_config = rules.shadow.resolve_against(self.options.shadow); + let shadow_config = self.options.shadow.merged_with(&rules.shadow); self.shadow.update_config(shadow_config); } @@ -333,14 +332,12 @@ impl<W: LayoutElement> Tile<W> { } let rules = self.window.rules(); - let border_config = rules.border.resolve_against(self.options.border); + let border_config = self.options.border.merged_with(&rules.border); self.border.update_config(border_config.into()); - let focus_ring_config = rules - .focus_ring - .resolve_against(self.options.focus_ring.into()); - self.focus_ring.update_config(focus_ring_config.into()); + let focus_ring_config = self.options.focus_ring.merged_with(&rules.focus_ring); + self.focus_ring.update_config(focus_ring_config); - let shadow_config = rules.shadow.resolve_against(self.options.shadow); + let shadow_config = self.options.shadow.merged_with(&rules.shadow); self.shadow.update_config(shadow_config); let window_size = self.window_size(); |
