diff options
Diffstat (limited to 'src')
| -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 |
6 files changed, 32 insertions, 8 deletions
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) |
