aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-09-20 12:57:41 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-10-02 09:33:08 +0300
commit1fa9dd32ed028c88248644a13421c098fef72894 (patch)
treee6ea60b5b0b7ebc390ecc623b091bbe3dc40fdf0 /src/layout
parent2781d3a74338806f631acda99e9f702b1b59a3e6 (diff)
downloadniri-1fa9dd32ed028c88248644a13421c098fef72894.tar.gz
niri-1fa9dd32ed028c88248644a13421c098fef72894.tar.bz2
niri-1fa9dd32ed028c88248644a13421c098fef72894.zip
config: Split Layout from LayoutPart
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/floating.rs4
-rw-r--r--src/layout/focus_ring.rs4
-rw-r--r--src/layout/insert_hint_element.rs6
-rw-r--r--src/layout/mod.rs24
-rw-r--r--src/layout/scrolling.rs8
-rw-r--r--src/layout/shadow.rs4
-rw-r--r--src/layout/tab_indicator.rs16
-rw-r--r--src/layout/tests.rs33
-rw-r--r--src/layout/tests/fullscreen.rs2
-rw-r--r--src/layout/workspace.rs4
10 files changed, 51 insertions, 54 deletions
diff --git a/src/layout/floating.rs b/src/layout/floating.rs
index 8854ca17..5f5767ad 100644
--- a/src/layout/floating.rs
+++ b/src/layout/floating.rs
@@ -1227,7 +1227,7 @@ impl<W: LayoutElement> FloatingSpace<W> {
let size = match resolve_preset_size(size, working_area_size) {
ResolvedSize::Tile(mut size) => {
if !border.off {
- size -= border.width.0 * 2.;
+ size -= border.width * 2.;
}
size
}
@@ -1365,7 +1365,7 @@ fn compute_toplevel_bounds(
) -> Size<i32, Logical> {
let mut border = 0.;
if !border_config.off {
- border = border_config.width.0 * 2.;
+ border = border_config.width * 2.;
}
Size::from((
diff --git a/src/layout/focus_ring.rs b/src/layout/focus_ring.rs
index 5cb797e0..89fd058b 100644
--- a/src/layout/focus_ring.rs
+++ b/src/layout/focus_ring.rs
@@ -65,7 +65,7 @@ impl FocusRing {
scale: f64,
alpha: f32,
) {
- let width = self.config.width.0;
+ let width = self.config.width;
self.full_size = win_size + Size::from((width, width)).upscale(2.);
let color = if is_urgent {
@@ -261,7 +261,7 @@ impl FocusRing {
}
pub fn width(&self) -> f64 {
- self.config.width.0
+ self.config.width
}
pub fn is_off(&self) -> bool {
diff --git a/src/layout/insert_hint_element.rs b/src/layout/insert_hint_element.rs
index 92f9b480..818aeb7e 100644
--- a/src/layout/insert_hint_element.rs
+++ b/src/layout/insert_hint_element.rs
@@ -1,4 +1,4 @@
-use niri_config::{CornerRadius, FloatOrInt};
+use niri_config::CornerRadius;
use smithay::utils::{Logical, Point, Rectangle, Size};
use super::focus_ring::{FocusRing, FocusRingRenderElement};
@@ -16,7 +16,7 @@ impl InsertHintElement {
Self {
inner: FocusRing::new(niri_config::FocusRing {
off: config.off,
- width: FloatOrInt(0.),
+ width: 0.,
active_color: config.color,
inactive_color: config.color,
urgent_color: config.color,
@@ -30,7 +30,7 @@ impl InsertHintElement {
pub fn update_config(&mut self, config: niri_config::InsertHint) {
self.inner.update_config(niri_config::FocusRing {
off: config.off,
- width: FloatOrInt(0.),
+ width: 0.,
active_color: config.color,
inactive_color: config.color,
urgent_color: config.color,
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index c7d8a6fd..40f1deed 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -40,8 +40,8 @@ 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,
+ CenterFocusedColumn, Config, CornerRadius, PresetSize, Struts, Workspace as WorkspaceConfig,
+ WorkspaceReference,
};
use niri_ipc::{ColumnDisplay, PositionChange, SizeChange, WindowLayout};
use scrolling::{Column, ColumnWidth};
@@ -620,7 +620,7 @@ impl HitType {
impl Options {
fn from_config(config: &Config) -> Self {
- let layout = &config.layout;
+ let layout = config.resolve_layout();
let preset_column_widths = if layout.preset_column_widths.is_empty() {
Options::default().preset_column_widths
@@ -633,16 +633,8 @@ impl Options {
layout.preset_window_heights.clone()
};
- // Missing default_column_width maps to Some(PresetSize::Proportion(0.5)),
- // while present, but empty, maps to None.
- let default_column_width = layout
- .default_column_width
- .as_ref()
- .map(|w| w.0)
- .unwrap_or(Some(PresetSize::Proportion(0.5)));
-
Self {
- gaps: layout.gaps.0,
+ gaps: layout.gaps,
struts: layout.struts,
focus_ring: layout.focus_ring,
border: layout.border,
@@ -654,7 +646,7 @@ impl Options {
empty_workspace_above_first: layout.empty_workspace_above_first,
default_column_display: layout.default_column_display,
preset_column_widths,
- default_column_width,
+ default_column_width: layout.default_column_width,
animations: config.animations.clone(),
gestures: config.gestures,
overview: config.overview,
@@ -669,8 +661,8 @@ impl Options {
let round = |logical: f64| round_logical_in_physical_max1(scale, logical);
self.gaps = round(self.gaps);
- self.focus_ring.width = FloatOrInt(round(self.focus_ring.width.0));
- self.border.width = FloatOrInt(round(self.border.width.0));
+ self.focus_ring.width = round(self.focus_ring.width);
+ self.border.width = round(self.border.width);
self
}
@@ -5252,7 +5244,7 @@ impl<W: LayoutElement> Layout<W> {
let rules = window.rules();
let border = self.options.border.merged_with(&rules.border);
if !border.off {
- fixed += border.width.0 * 2.;
+ fixed += border.width * 2.;
}
ColumnWidth::Fixed(fixed)
diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs
index 5f53ccee..52869024 100644
--- a/src/layout/scrolling.rs
+++ b/src/layout/scrolling.rs
@@ -488,7 +488,7 @@ impl<W: LayoutElement> ScrollingSpace<W> {
let size = match resolve_preset_size(size, &self.options, working_size.w, extra.w) {
ResolvedSize::Tile(mut size) => {
if !border.off {
- size -= border.width.0 * 2.;
+ size -= border.width * 2.;
}
size
}
@@ -502,14 +502,14 @@ impl<W: LayoutElement> ScrollingSpace<W> {
let mut full_height = self.working_area.size.h - self.options.gaps * 2.;
if !border.off {
- full_height -= border.width.0 * 2.;
+ full_height -= border.width * 2.;
}
let height = if let Some(height) = height {
let height = match resolve_preset_size(height, &self.options, working_size.h, extra.h) {
ResolvedSize::Tile(mut size) => {
if !border.off {
- size -= border.width.0 * 2.;
+ size -= border.width * 2.;
}
size
}
@@ -5280,7 +5280,7 @@ fn compute_toplevel_bounds(
) -> Size<i32, Logical> {
let mut border = 0.;
if !border_config.off {
- border = border_config.width.0 * 2.;
+ border = border_config.width * 2.;
}
Size::from((
diff --git a/src/layout/shadow.rs b/src/layout/shadow.rs
index df018b7b..25082e3e 100644
--- a/src/layout/shadow.rs
+++ b/src/layout/shadow.rs
@@ -48,7 +48,7 @@ impl Shadow {
// * We do not divide anything, only add, subtract and multiply by integers.
// * At rendering time, tile positions are rounded to physical pixels.
- let width = self.config.softness.0;
+ let width = self.config.softness;
// Like in CSS box-shadow.
let sigma = width / 2.;
// Adjust width to draw all necessary pixels.
@@ -57,7 +57,7 @@ impl Shadow {
let offset = self.config.offset;
let offset = Point::from((ceil(offset.x.0), ceil(offset.y.0)));
- let spread = self.config.spread.0;
+ let spread = self.config.spread;
let spread = ceil(spread.abs()).copysign(spread);
let offset = offset - Point::from((spread, spread));
diff --git a/src/layout/tab_indicator.rs b/src/layout/tab_indicator.rs
index e35874e8..45405ccc 100644
--- a/src/layout/tab_indicator.rs
+++ b/src/layout/tab_indicator.rs
@@ -83,10 +83,10 @@ impl TabIndicator {
let progress = self.open_anim.as_ref().map_or(1., |a| a.value().max(0.));
- let width = round_max1(self.config.width.0);
- let gap = self.config.gap.0;
+ let width = round_max1(self.config.width);
+ let gap = self.config.gap;
let gap = round_max1(gap.abs()).copysign(gap);
- let gaps_between = round_max1(self.config.gaps_between_tabs.0);
+ let gaps_between = round_max1(self.config.gaps_between_tabs);
let position = self.config.position;
let side = match position {
@@ -104,7 +104,7 @@ impl TabIndicator {
let px_per_tab = (length + gaps_between) / count as f64 - gaps_between;
let px_per_tab = px_per_tab * progress;
- let gaps_between = round(self.config.gaps_between_tabs.0 * progress);
+ let gaps_between = round(self.config.gaps_between_tabs * progress);
let length = count as f64 * (px_per_tab + gaps_between) - gaps_between;
let px_per_tab = floor_logical_in_physical_max1(scale, px_per_tab);
@@ -185,8 +185,8 @@ impl TabIndicator {
self.shader_locs.resize_with(count, Default::default);
let position = self.config.position;
- let radius = self.config.corner_radius.0 as f32;
- let shared_rounded_corners = self.config.gaps_between_tabs.0 == 0.;
+ let radius = self.config.corner_radius as f32;
+ let shared_rounded_corners = self.config.gaps_between_tabs == 0.;
let mut tabs_left = tab_count;
let rects = self.tab_rects(area, count, scale);
@@ -317,8 +317,8 @@ impl TabIndicator {
}
let round = |logical: f64| round_logical_in_physical(scale, logical);
- let width = round(self.config.width.0);
- let gap = round(self.config.gap.0);
+ let width = round(self.config.width);
+ let gap = round(self.config.gap);
// No, I am *not* falling into the rabbit hole of "what if the tab indicator is wide enough
// that it peeks from the other side of the window".
diff --git a/src/layout/tests.rs b/src/layout/tests.rs
index 4afa5364..1c071eb0 100644
--- a/src/layout/tests.rs
+++ b/src/layout/tests.rs
@@ -2067,7 +2067,7 @@ fn large_negative_height_change() {
let mut options = Options::default();
options.border.off = false;
- options.border.width = FloatOrInt(1.);
+ options.border.width = 1.;
check_ops_with_options(options, ops);
}
@@ -2086,7 +2086,7 @@ fn large_max_size() {
let mut options = Options::default();
options.border.off = false;
- options.border.width = FloatOrInt(1.);
+ options.border.width = 1.;
check_ops_with_options(options, ops);
}
@@ -2292,8 +2292,9 @@ fn removing_all_outputs_preserves_empty_named_workspaces() {
#[test]
fn config_change_updates_cached_sizes() {
let mut config = Config::default();
- config.layout.border.off = false;
- config.layout.border.width = FloatOrInt(2.);
+ let border = config.layout.border.get_or_insert_with(Default::default);
+ border.off = false;
+ border.width = Some(FloatOrInt(2.));
let mut layout = Layout::new(Clock::default(), &config);
@@ -2305,7 +2306,11 @@ fn config_change_updates_cached_sizes() {
}
.apply(&mut layout);
- config.layout.border.width = FloatOrInt(4.);
+ config
+ .layout
+ .border
+ .get_or_insert_with(Default::default)
+ .width = Some(FloatOrInt(4.));
layout.update_config(&config);
layout.verify_invariants();
@@ -2314,7 +2319,7 @@ fn config_change_updates_cached_sizes() {
#[test]
fn preset_height_change_removes_preset() {
let mut config = Config::default();
- config.layout.preset_window_heights = vec![PresetSize::Fixed(1), PresetSize::Fixed(2)];
+ config.layout.preset_window_heights = Some(vec![PresetSize::Fixed(1), PresetSize::Fixed(2)]);
let mut layout = Layout::new(Clock::default(), &config);
@@ -2335,7 +2340,7 @@ fn preset_height_change_removes_preset() {
}
// Leave only one.
- config.layout.preset_window_heights = vec![PresetSize::Fixed(1)];
+ config.layout.preset_window_heights = Some(vec![PresetSize::Fixed(1)]);
layout.update_config(&config);
@@ -2424,7 +2429,7 @@ fn fixed_height_takes_max_non_auto_into_account() {
let options = Options {
border: niri_config::Border {
off: false,
- width: niri_config::FloatOrInt(4.),
+ width: 4.,
..Default::default()
},
gaps: 0.,
@@ -3173,7 +3178,7 @@ fn preset_column_width_fixed_correct_with_border() {
preset_column_widths: vec![PresetSize::Fixed(500)],
border: niri_config::Border {
off: false,
- width: FloatOrInt(5.),
+ width: 5.,
..Default::default()
},
..Default::default()
@@ -3408,7 +3413,7 @@ prop_compose! {
) -> niri_config::FocusRing {
niri_config::FocusRing {
off,
- width: FloatOrInt(width),
+ width,
..Default::default()
}
}
@@ -3421,7 +3426,7 @@ prop_compose! {
) -> niri_config::Border {
niri_config::Border {
off,
- width: FloatOrInt(width),
+ width,
..Default::default()
}
}
@@ -3434,7 +3439,7 @@ prop_compose! {
) -> niri_config::Shadow {
niri_config::Shadow {
on,
- softness: FloatOrInt(width),
+ softness: width,
..Default::default()
}
}
@@ -3454,8 +3459,8 @@ prop_compose! {
off,
hide_when_single_tab,
place_within_column,
- width: FloatOrInt(width),
- gap: FloatOrInt(gap),
+ width,
+ gap,
length: TabIndicatorLength { total_proportion: Some(length) },
position,
..Default::default()
diff --git a/src/layout/tests/fullscreen.rs b/src/layout/tests/fullscreen.rs
index 4d9d79ca..904595f5 100644
--- a/src/layout/tests/fullscreen.rs
+++ b/src/layout/tests/fullscreen.rs
@@ -190,7 +190,7 @@ fn unfullscreen_with_large_border() {
let options = Options {
border: niri_config::Border {
off: false,
- width: niri_config::FloatOrInt(10000.),
+ width: 10000.,
..Default::default()
},
..Default::default()
diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs
index d2340949..8c1c36d3 100644
--- a/src/layout/workspace.rs
+++ b/src/layout/workspace.rs
@@ -1859,8 +1859,8 @@ fn compute_workspace_shadow_config(
let norm = view_size.h / 1080.;
let mut config = niri_config::Shadow::from(config);
- config.softness.0 *= norm;
- config.spread.0 *= norm;
+ config.softness *= norm;
+ config.spread *= norm;
config.offset.x.0 *= norm;
config.offset.y.0 *= norm;