Hide focus ring for unfocused layout and under interactive move

This commit is contained in:
Ivan Molodetskikh
2024-12-29 11:04:08 +03:00
parent d1998ae3fa
commit be05b66ac3
7 changed files with 33 additions and 9 deletions
+1 -1
View File
@@ -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()
}
+2 -1
View File
@@ -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)
+8
View File
@@ -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, .. } => {
+2 -1
View File
@@ -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)
})
+2 -1
View File
@@ -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(
+13 -4
View File
@@ -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)
});
+5 -1
View File
@@ -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)