aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-09-25 18:14:38 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-10-02 09:33:08 +0300
commitc353a7dae900382893cde03a84a85add24abfc45 (patch)
treefa5e3f2809ae2cd34f091474a29f48d2de9f00af
parente3068cd483f4250789d22c8c85948894ef982ff9 (diff)
downloadniri-c353a7dae900382893cde03a84a85add24abfc45.tar.gz
niri-c353a7dae900382893cde03a84a85add24abfc45.tar.bz2
niri-c353a7dae900382893cde03a84a85add24abfc45.zip
layout: Extract Layout::monitors{,_mut}()
-rw-r--r--src/layout/mod.rs146
1 files changed, 54 insertions, 92 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index ff13ee23..b084d428 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -1118,10 +1118,8 @@ impl<W: LayoutElement> Layout<W> {
unreachable!()
};
- if let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set {
- for mon in monitors {
- mon.dnd_scroll_gesture_end();
- }
+ for mon in self.monitors_mut() {
+ mon.dnd_scroll_gesture_end();
}
// Unlock the view on the workspaces.
@@ -1459,11 +1457,7 @@ impl<W: LayoutElement> Layout<W> {
}
}
- let MonitorSet::Normal { monitors, .. } = &self.monitor_set else {
- return 0.;
- };
-
- for mon in monitors {
+ for mon in self.monitors() {
for ws in &mon.workspaces {
if ws.has_window(window) {
return ws.scroll_amount_to_activate(window);
@@ -1744,28 +1738,36 @@ impl<W: LayoutElement> Layout<W> {
Some(&monitors[*active_monitor_idx])
}
- pub fn monitor_for_output(&self, output: &Output) -> Option<&Monitor<W>> {
- let MonitorSet::Normal { monitors, .. } = &self.monitor_set else {
- return None;
+ pub fn monitors(&self) -> impl Iterator<Item = &Monitor<W>> + '_ {
+ let monitors = if let MonitorSet::Normal { monitors, .. } = &self.monitor_set {
+ &monitors[..]
+ } else {
+ &[][..]
};
- monitors.iter().find(|mon| &mon.output == output)
+ monitors.iter()
}
- pub fn monitor_for_output_mut(&mut self, output: &Output) -> Option<&mut Monitor<W>> {
- let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set else {
- return None;
+ pub fn monitors_mut(&mut self) -> impl Iterator<Item = &mut Monitor<W>> + '_ {
+ let monitors = if let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set {
+ &mut monitors[..]
+ } else {
+ &mut [][..]
};
- monitors.iter_mut().find(|mon| &mon.output == output)
+ monitors.iter_mut()
}
- pub fn monitor_for_workspace(&self, workspace_name: &str) -> Option<&Monitor<W>> {
- let MonitorSet::Normal { monitors, .. } = &self.monitor_set else {
- return None;
- };
+ pub fn monitor_for_output(&self, output: &Output) -> Option<&Monitor<W>> {
+ self.monitors().find(|mon| &mon.output == output)
+ }
- monitors.iter().find(|monitor| {
+ pub fn monitor_for_output_mut(&mut self, output: &Output) -> Option<&mut Monitor<W>> {
+ self.monitors_mut().find(|mon| &mon.output == output)
+ }
+
+ pub fn monitor_for_workspace(&self, workspace_name: &str) -> Option<&Monitor<W>> {
+ self.monitors().find(|monitor| {
monitor.workspaces.iter().any(|ws| {
ws.name
.as_ref()
@@ -1775,13 +1777,7 @@ impl<W: LayoutElement> Layout<W> {
}
pub fn outputs(&self) -> impl Iterator<Item = &Output> + '_ {
- let monitors = if let MonitorSet::Normal { monitors, .. } = &self.monitor_set {
- &monitors[..]
- } else {
- &[][..]
- };
-
- monitors.iter().map(|mon| &mon.output)
+ self.monitors().map(|mon| &mon.output)
}
pub fn move_left(&mut self) {
@@ -2324,11 +2320,7 @@ impl<W: LayoutElement> Layout<W> {
output: &Output,
pos_within_output: Point<f64, Logical>,
) -> Option<(&W, HitType)> {
- let MonitorSet::Normal { monitors, .. } = &self.monitor_set else {
- return None;
- };
-
- let mon = monitors.iter().find(|mon| &mon.output == output)?;
+ let mon = self.monitor_for_output(output)?;
mon.window_under(pos_within_output)
}
@@ -2337,11 +2329,7 @@ impl<W: LayoutElement> Layout<W> {
output: &Output,
pos_within_output: Point<f64, Logical>,
) -> Option<ResizeEdge> {
- let MonitorSet::Normal { monitors, .. } = &self.monitor_set else {
- return None;
- };
-
- let mon = monitors.iter().find(|mon| &mon.output == output)?;
+ let mon = self.monitor_for_output(output)?;
mon.resize_edges_under(pos_within_output)
}
@@ -2358,11 +2346,7 @@ impl<W: LayoutElement> Layout<W> {
return None;
}
- let MonitorSet::Normal { monitors, .. } = &self.monitor_set else {
- return None;
- };
-
- let mon = monitors.iter().find(|mon| &mon.output == output)?;
+ let mon = self.monitor_for_output(output)?;
if extended_bounds {
mon.workspace_under(pos_within_output).map(|(ws, _)| ws)
} else {
@@ -2855,11 +2839,7 @@ impl<W: LayoutElement> Layout<W> {
return true;
}
- let MonitorSet::Normal { monitors, .. } = &self.monitor_set else {
- return false;
- };
-
- for mon in monitors {
+ for mon in self.monitors() {
if output.is_some_and(|output| mon.output != *output) {
continue;
}
@@ -2932,10 +2912,8 @@ impl<W: LayoutElement> Layout<W> {
fn update_insert_hint(&mut self, output: Option<&Output>) {
let _span = tracy_client::span!("Layout::update_insert_hint");
- if let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set {
- for mon in monitors {
- mon.insert_hint = None;
- }
+ for mon in self.monitors_mut() {
+ mon.insert_hint = None;
}
if !matches!(self.interactive_move, Some(InteractiveMoveState::Moving(_))) {
@@ -3953,11 +3931,7 @@ impl<W: LayoutElement> Layout<W> {
return false;
}
- let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set else {
- return false;
- };
-
- let Some((mon, (ws, ws_geo))) = monitors.iter().find_map(|mon| {
+ let Some((mon, (ws, ws_geo))) = self.monitors().find_map(|mon| {
mon.workspaces_with_render_geo()
.find(|(ws, _)| ws.has_window(&window_id))
.map(|rv| (mon, rv))
@@ -3994,10 +3968,8 @@ impl<W: LayoutElement> Layout<W> {
pointer_ratio_within_window,
});
- if let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set {
- for mon in monitors {
- mon.dnd_scroll_gesture_begin();
- }
+ for mon in self.monitors_mut() {
+ mon.dnd_scroll_gesture_begin();
}
// Lock the view for scrolling interactive move.
@@ -4083,21 +4055,19 @@ impl<W: LayoutElement> Layout<W> {
// FIXME: when and if the layout code knows about monitor positions, this will be
// potentially animatable.
let mut tile_pos = None;
- if let MonitorSet::Normal { monitors, .. } = &self.monitor_set {
- if let Some((mon, (ws, ws_geo))) = monitors.iter().find_map(|mon| {
- mon.workspaces_with_render_geo()
- .find(|(ws, _)| ws.has_window(window))
- .map(|rv| (mon, rv))
- }) {
- if mon.output() == &output {
- let (_, tile_offset, _) = ws
- .tiles_with_render_positions()
- .find(|(tile, _, _)| tile.window().id() == window)
- .unwrap();
+ if let Some((mon, (ws, ws_geo))) = self.monitors().find_map(|mon| {
+ mon.workspaces_with_render_geo()
+ .find(|(ws, _)| ws.has_window(window))
+ .map(|rv| (mon, rv))
+ }) {
+ if mon.output() == &output {
+ let (_, tile_offset, _) = ws
+ .tiles_with_render_positions()
+ .find(|(tile, _, _)| tile.window().id() == window)
+ .unwrap();
- let zoom = mon.overview_zoom();
- tile_pos = Some((ws_geo.loc + tile_offset.upscale(zoom), zoom));
- }
+ let zoom = mon.overview_zoom();
+ tile_pos = Some((ws_geo.loc + tile_offset.upscale(zoom), zoom));
}
}
@@ -4239,10 +4209,8 @@ impl<W: LayoutElement> Layout<W> {
unreachable!()
};
- if let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set {
- for mon in monitors {
- mon.dnd_scroll_gesture_end();
- }
+ for mon in self.monitors_mut() {
+ mon.dnd_scroll_gesture_end();
}
let mut ws_id = None;
@@ -4308,10 +4276,8 @@ impl<W: LayoutElement> Layout<W> {
unreachable!()
};
- if let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set {
- for mon in monitors {
- mon.dnd_scroll_gesture_end();
- }
+ for mon in self.monitors_mut() {
+ mon.dnd_scroll_gesture_end();
}
// Unlock the view on the workspaces.
@@ -4541,10 +4507,8 @@ impl<W: LayoutElement> Layout<W> {
});
if begin_gesture {
- if let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set {
- for mon in monitors {
- mon.dnd_scroll_gesture_begin();
- }
+ for mon in self.monitors_mut() {
+ mon.dnd_scroll_gesture_begin();
}
for ws in self.workspaces_mut() {
@@ -4560,10 +4524,8 @@ impl<W: LayoutElement> Layout<W> {
self.dnd = None;
- if let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set {
- for mon in monitors {
- mon.dnd_scroll_gesture_end();
- }
+ for mon in self.monitors_mut() {
+ mon.dnd_scroll_gesture_end();
}
for ws in self.workspaces_mut() {