From 7aec37f5c97a2b38553472d786a95f8a7f4324fb Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Wed, 11 Jun 2025 21:04:49 +0300 Subject: Extract output_left/right/up/down/previous/next_of() --- src/niri.rs | 116 ++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 69 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/src/niri.rs b/src/niri.rs index 3c346553..9498a379 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -3392,82 +3392,121 @@ impl Niri { self.global_space.output_under(pos).next().cloned() } - pub fn output_left(&self) -> Option { - let active = self.layout.active_output()?; - let active_geo = self.global_space.output_geometry(active).unwrap(); + pub fn output_left_of(&self, current: &Output) -> Option { + let current_geo = self.global_space.output_geometry(current)?; let extended_geo = Rectangle::new( - Point::from((i32::MIN / 2, active_geo.loc.y)), - Size::from((i32::MAX, active_geo.size.h)), + Point::from((i32::MIN / 2, current_geo.loc.y)), + Size::from((i32::MAX, current_geo.size.h)), ); self.global_space .outputs() .map(|output| (output, self.global_space.output_geometry(output).unwrap())) - .filter(|(_, geo)| center(*geo).x < center(active_geo).x && geo.overlaps(extended_geo)) - .min_by_key(|(_, geo)| center(active_geo).x - center(*geo).x) + .filter(|(_, geo)| center(*geo).x < center(current_geo).x && geo.overlaps(extended_geo)) + .min_by_key(|(_, geo)| center(current_geo).x - center(*geo).x) .map(|(output, _)| output) .cloned() } - pub fn output_right(&self) -> Option { - let active = self.layout.active_output()?; - let active_geo = self.global_space.output_geometry(active).unwrap(); + pub fn output_right_of(&self, current: &Output) -> Option { + let current_geo = self.global_space.output_geometry(current)?; let extended_geo = Rectangle::new( - Point::from((i32::MIN / 2, active_geo.loc.y)), - Size::from((i32::MAX, active_geo.size.h)), + Point::from((i32::MIN / 2, current_geo.loc.y)), + Size::from((i32::MAX, current_geo.size.h)), ); self.global_space .outputs() .map(|output| (output, self.global_space.output_geometry(output).unwrap())) - .filter(|(_, geo)| center(*geo).x > center(active_geo).x && geo.overlaps(extended_geo)) - .min_by_key(|(_, geo)| center(*geo).x - center(active_geo).x) + .filter(|(_, geo)| center(*geo).x > center(current_geo).x && geo.overlaps(extended_geo)) + .min_by_key(|(_, geo)| center(*geo).x - center(current_geo).x) .map(|(output, _)| output) .cloned() } - pub fn output_up(&self) -> Option { - let active = self.layout.active_output()?; - let active_geo = self.global_space.output_geometry(active).unwrap(); + pub fn output_up_of(&self, current: &Output) -> Option { + let current_geo = self.global_space.output_geometry(current)?; let extended_geo = Rectangle::new( - Point::from((active_geo.loc.x, i32::MIN / 2)), - Size::from((active_geo.size.w, i32::MAX)), + Point::from((current_geo.loc.x, i32::MIN / 2)), + Size::from((current_geo.size.w, i32::MAX)), ); self.global_space .outputs() .map(|output| (output, self.global_space.output_geometry(output).unwrap())) - .filter(|(_, geo)| center(*geo).y < center(active_geo).y && geo.overlaps(extended_geo)) - .min_by_key(|(_, geo)| center(active_geo).y - center(*geo).y) + .filter(|(_, geo)| center(*geo).y < center(current_geo).y && geo.overlaps(extended_geo)) + .min_by_key(|(_, geo)| center(current_geo).y - center(*geo).y) .map(|(output, _)| output) .cloned() } - pub fn output_previous(&self) -> Option { - let active = self.layout.active_output()?; + pub fn output_down_of(&self, current: &Output) -> Option { + let current_geo = self.global_space.output_geometry(current)?; + let extended_geo = Rectangle::new( + Point::from((current_geo.loc.x, i32::MIN / 2)), + Size::from((current_geo.size.w, i32::MAX)), + ); + + self.global_space + .outputs() + .map(|output| (output, self.global_space.output_geometry(output).unwrap())) + .filter(|(_, geo)| center(*geo).y > center(current_geo).y && geo.overlaps(extended_geo)) + .min_by_key(|(_, geo)| center(*geo).y - center(current_geo).y) + .map(|(output, _)| output) + .cloned() + } + pub fn output_previous_of(&self, current: &Output) -> Option { self.sorted_outputs .iter() .rev() - .skip_while(|&output| output != active) + .skip_while(|&output| output != current) .nth(1) .or(self.sorted_outputs.last()) - .filter(|&output| output != active) + .filter(|&output| output != current) .cloned() } - pub fn output_next(&self) -> Option { - let active = self.layout.active_output()?; - + pub fn output_next_of(&self, current: &Output) -> Option { self.sorted_outputs .iter() - .skip_while(|&output| output != active) + .skip_while(|&output| output != current) .nth(1) .or(self.sorted_outputs.first()) - .filter(|&output| output != active) + .filter(|&output| output != current) .cloned() } + pub fn output_left(&self) -> Option { + let active = self.layout.active_output()?; + self.output_left_of(active) + } + + pub fn output_right(&self) -> Option { + let active = self.layout.active_output()?; + self.output_right_of(active) + } + + pub fn output_up(&self) -> Option { + let active = self.layout.active_output()?; + self.output_up_of(active) + } + + pub fn output_down(&self) -> Option { + let active = self.layout.active_output()?; + self.output_down_of(active) + } + + pub fn output_previous(&self) -> Option { + let active = self.layout.active_output()?; + self.output_previous_of(active) + } + + pub fn output_next(&self) -> Option { + let active = self.layout.active_output()?; + self.output_next_of(active) + } + pub fn find_output_and_workspace_index( &self, workspace_reference: WorkspaceReference, @@ -3487,23 +3526,6 @@ impl Niri { Some((target_output.cloned(), target_workspace_index)) } - pub fn output_down(&self) -> Option { - let active = self.layout.active_output()?; - let active_geo = self.global_space.output_geometry(active).unwrap(); - let extended_geo = Rectangle::new( - Point::from((active_geo.loc.x, i32::MIN / 2)), - Size::from((active_geo.size.w, i32::MAX)), - ); - - self.global_space - .outputs() - .map(|output| (output, self.global_space.output_geometry(output).unwrap())) - .filter(|(_, geo)| center(active_geo).y < center(*geo).y && geo.overlaps(extended_geo)) - .min_by_key(|(_, geo)| center(*geo).y - center(active_geo).y) - .map(|(output, _)| output) - .cloned() - } - pub fn output_for_tablet(&self) -> Option<&Output> { let config = self.config.borrow(); let map_to_output = config.input.tablet.map_to_output.as_ref(); -- cgit