diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-12-29 11:04:08 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-12-30 20:12:37 +0300 |
| commit | be05b66ac323845fb65fe87384b5a8aae0e1fd18 (patch) | |
| tree | dec5d8c3ca847e2bb27369b628fa662f32190ba1 | |
| parent | d1998ae3fa28d8c7034f0b3ba188c355fc146e5c (diff) | |
| download | niri-be05b66ac323845fb65fe87384b5a8aae0e1fd18.tar.gz niri-be05b66ac323845fb65fe87384b5a8aae0e1fd18.tar.bz2 niri-be05b66ac323845fb65fe87384b5a8aae0e1fd18.zip | |
Hide focus ring for unfocused layout and under interactive move
| -rw-r--r-- | niri-visual-tests/src/cases/layout.rs | 2 | ||||
| -rw-r--r-- | src/layout/floating.rs | 3 | ||||
| -rw-r--r-- | src/layout/mod.rs | 8 | ||||
| -rw-r--r-- | src/layout/monitor.rs | 3 | ||||
| -rw-r--r-- | src/layout/scrolling.rs | 3 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 17 | ||||
| -rw-r--r-- | src/niri.rs | 6 |
7 files changed, 33 insertions, 9 deletions
diff --git a/niri-visual-tests/src/cases/layout.rs b/niri-visual-tests/src/cases/layout.rs index c9cdd9bf..3fcdb6c5 100644 --- a/niri-visual-tests/src/cases/layout.rs +++ b/niri-visual-tests/src/cases/layout.rs @@ -262,7 +262,7 @@ impl TestCase for Layout { self.layout .monitor_for_output(&self.output) .unwrap() - .render_elements(renderer, RenderTarget::Output) + .render_elements(renderer, RenderTarget::Output, true) .map(|elem| Box::new(elem) as _) .collect() } diff --git a/src/layout/floating.rs b/src/layout/floating.rs index d40d1b17..6192d119 100644 --- a/src/layout/floating.rs +++ b/src/layout/floating.rs @@ -962,6 +962,7 @@ impl<W: LayoutElement> FloatingSpace<W> { view_rect: Rectangle<f64, Logical>, scale: Scale<f64>, target: RenderTarget, + focus_ring: bool, ) -> Vec<FloatingSpaceRenderElement<R>> { let mut rv = Vec::new(); @@ -976,7 +977,7 @@ impl<W: LayoutElement> FloatingSpace<W> { let active = self.active_window_id.clone(); for (tile, tile_pos) in self.tiles_with_render_positions() { // For the active tile, draw the focus ring. - let focus_ring = Some(tile.window().id()) == active.as_ref(); + let focus_ring = focus_ring && Some(tile.window().id()) == active.as_ref(); rv.extend( tile.render(renderer, tile_pos, scale, focus_ring, target) diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 0e068499..433cae43 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -3565,6 +3565,14 @@ impl<W: LayoutElement> Layout<W> { } } + pub fn interactive_move_is_moving_above_output(&self, output: &Output) -> bool { + let Some(InteractiveMoveState::Moving(move_)) = &self.interactive_move else { + return false; + }; + + move_.output == *output + } + pub fn interactive_resize_begin(&mut self, window: W::Id, edges: ResizeEdge) -> bool { match &mut self.monitor_set { MonitorSet::Normal { monitors, .. } => { diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index d61d8a45..13079319 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -963,6 +963,7 @@ impl<W: LayoutElement> Monitor<W> { &'a self, renderer: &'a mut R, target: RenderTarget, + focus_ring: bool, ) -> impl Iterator<Item = MonitorRenderElement<R>> + 'a { let _span = tracy_client::span!("Monitor::render_elements"); @@ -989,7 +990,7 @@ impl<W: LayoutElement> Monitor<W> { self.workspaces_with_render_positions() .flat_map(move |(ws, offset)| { - ws.render_elements(renderer, target) + ws.render_elements(renderer, target, focus_ring) .filter_map(move |elem| { CropRenderElement::from_element(elem, scale, crop_bounds) }) diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index 1a8c8f5f..73e55451 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -2180,6 +2180,7 @@ impl<W: LayoutElement> ScrollingSpace<W> { renderer: &mut R, scale: Scale<f64>, target: RenderTarget, + focus_ring: bool, ) -> Vec<ScrollingSpaceRenderElement<R>> { let mut rv = vec![]; @@ -2208,7 +2209,7 @@ impl<W: LayoutElement> ScrollingSpace<W> { let mut first = true; for (tile, tile_pos) in self.tiles_with_render_positions() { // For the active tile (which comes first), draw the focus ring. - let focus_ring = first; + let focus_ring = focus_ring && first; first = false; rv.extend( diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index aef7203b..991e7e42 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -1308,16 +1308,25 @@ impl<W: LayoutElement> Workspace<W> { &self, renderer: &mut R, target: RenderTarget, + focus_ring: bool, ) -> impl Iterator<Item = WorkspaceRenderElement<R>> { let scale = Scale::from(self.scale.fractional_scale()); - let scrolling = self.scrolling.render_elements(renderer, scale, target); + let scrolling_focus_ring = focus_ring && !self.floating_is_active(); + let scrolling = + self.scrolling + .render_elements(renderer, scale, target, scrolling_focus_ring); let scrolling = scrolling.into_iter().map(WorkspaceRenderElement::from); + let floating_focus_ring = focus_ring && self.floating_is_active(); let floating = self.is_floating_visible().then(|| { let view_rect = Rectangle::from_loc_and_size((0., 0.), self.view_size); - let floating = self - .floating - .render_elements(renderer, view_rect, scale, target); + let floating = self.floating.render_elements( + renderer, + view_rect, + scale, + target, + floating_focus_ring, + ); floating.into_iter().map(WorkspaceRenderElement::from) }); diff --git a/src/niri.rs b/src/niri.rs index e1f84a60..1dfd44a9 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -3246,9 +3246,13 @@ impl Niri { elements.push(element.into()); } + // Don't draw the focus ring on the workspaces while interactively moving above those + // workspaces, since the interactively-moved window already has a focus ring. + let focus_ring = !self.layout.interactive_move_is_moving_above_output(output); + // Get monitor elements. let mon = self.layout.monitor_for_output(output).unwrap(); - let monitor_elements: Vec<_> = mon.render_elements(renderer, target).collect(); + let monitor_elements: Vec<_> = mon.render_elements(renderer, target, focus_ring).collect(); let float_elements: Vec<_> = self .layout .render_floating_for_output(renderer, output, target) |
