aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-09-20 12:57:40 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-10-02 09:33:08 +0300
commit2781d3a74338806f631acda99e9f702b1b59a3e6 (patch)
treeb7066f8476fe2ba0b18b961c0360001070ec54cb
parente739ce8171705dd0b87c317cc0f4509b7f16f6df (diff)
downloadniri-2781d3a74338806f631acda99e9f702b1b59a3e6.tar.gz
niri-2781d3a74338806f631acda99e9f702b1b59a3e6.tar.bz2
niri-2781d3a74338806f631acda99e9f702b1b59a3e6.zip
config: Replace resolve_against with MergeWith
-rw-r--r--niri-config/src/appearance.rs122
-rw-r--r--niri-config/src/macros.rs24
-rw-r--r--src/layer/mapped.rs5
-rw-r--r--src/layout/floating.rs7
-rw-r--r--src/layout/mod.rs3
-rw-r--r--src/layout/scrolling.rs7
-rw-r--r--src/layout/tile.rs29
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();