mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-24 02:01:18 +07:00
Hide focus ring for unfocused layout and under interactive move
This commit is contained in:
@@ -262,7 +262,7 @@ impl TestCase for Layout {
|
|||||||
self.layout
|
self.layout
|
||||||
.monitor_for_output(&self.output)
|
.monitor_for_output(&self.output)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.render_elements(renderer, RenderTarget::Output)
|
.render_elements(renderer, RenderTarget::Output, true)
|
||||||
.map(|elem| Box::new(elem) as _)
|
.map(|elem| Box::new(elem) as _)
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -962,6 +962,7 @@ impl<W: LayoutElement> FloatingSpace<W> {
|
|||||||
view_rect: Rectangle<f64, Logical>,
|
view_rect: Rectangle<f64, Logical>,
|
||||||
scale: Scale<f64>,
|
scale: Scale<f64>,
|
||||||
target: RenderTarget,
|
target: RenderTarget,
|
||||||
|
focus_ring: bool,
|
||||||
) -> Vec<FloatingSpaceRenderElement<R>> {
|
) -> Vec<FloatingSpaceRenderElement<R>> {
|
||||||
let mut rv = Vec::new();
|
let mut rv = Vec::new();
|
||||||
|
|
||||||
@@ -976,7 +977,7 @@ impl<W: LayoutElement> FloatingSpace<W> {
|
|||||||
let active = self.active_window_id.clone();
|
let active = self.active_window_id.clone();
|
||||||
for (tile, tile_pos) in self.tiles_with_render_positions() {
|
for (tile, tile_pos) in self.tiles_with_render_positions() {
|
||||||
// For the active tile, draw the focus ring.
|
// 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(
|
rv.extend(
|
||||||
tile.render(renderer, tile_pos, scale, focus_ring, target)
|
tile.render(renderer, tile_pos, scale, focus_ring, target)
|
||||||
|
|||||||
@@ -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 {
|
pub fn interactive_resize_begin(&mut self, window: W::Id, edges: ResizeEdge) -> bool {
|
||||||
match &mut self.monitor_set {
|
match &mut self.monitor_set {
|
||||||
MonitorSet::Normal { monitors, .. } => {
|
MonitorSet::Normal { monitors, .. } => {
|
||||||
|
|||||||
@@ -963,6 +963,7 @@ impl<W: LayoutElement> Monitor<W> {
|
|||||||
&'a self,
|
&'a self,
|
||||||
renderer: &'a mut R,
|
renderer: &'a mut R,
|
||||||
target: RenderTarget,
|
target: RenderTarget,
|
||||||
|
focus_ring: bool,
|
||||||
) -> impl Iterator<Item = MonitorRenderElement<R>> + 'a {
|
) -> impl Iterator<Item = MonitorRenderElement<R>> + 'a {
|
||||||
let _span = tracy_client::span!("Monitor::render_elements");
|
let _span = tracy_client::span!("Monitor::render_elements");
|
||||||
|
|
||||||
@@ -989,7 +990,7 @@ impl<W: LayoutElement> Monitor<W> {
|
|||||||
|
|
||||||
self.workspaces_with_render_positions()
|
self.workspaces_with_render_positions()
|
||||||
.flat_map(move |(ws, offset)| {
|
.flat_map(move |(ws, offset)| {
|
||||||
ws.render_elements(renderer, target)
|
ws.render_elements(renderer, target, focus_ring)
|
||||||
.filter_map(move |elem| {
|
.filter_map(move |elem| {
|
||||||
CropRenderElement::from_element(elem, scale, crop_bounds)
|
CropRenderElement::from_element(elem, scale, crop_bounds)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -2180,6 +2180,7 @@ impl<W: LayoutElement> ScrollingSpace<W> {
|
|||||||
renderer: &mut R,
|
renderer: &mut R,
|
||||||
scale: Scale<f64>,
|
scale: Scale<f64>,
|
||||||
target: RenderTarget,
|
target: RenderTarget,
|
||||||
|
focus_ring: bool,
|
||||||
) -> Vec<ScrollingSpaceRenderElement<R>> {
|
) -> Vec<ScrollingSpaceRenderElement<R>> {
|
||||||
let mut rv = vec![];
|
let mut rv = vec![];
|
||||||
|
|
||||||
@@ -2208,7 +2209,7 @@ impl<W: LayoutElement> ScrollingSpace<W> {
|
|||||||
let mut first = true;
|
let mut first = true;
|
||||||
for (tile, tile_pos) in self.tiles_with_render_positions() {
|
for (tile, tile_pos) in self.tiles_with_render_positions() {
|
||||||
// For the active tile (which comes first), draw the focus ring.
|
// For the active tile (which comes first), draw the focus ring.
|
||||||
let focus_ring = first;
|
let focus_ring = focus_ring && first;
|
||||||
first = false;
|
first = false;
|
||||||
|
|
||||||
rv.extend(
|
rv.extend(
|
||||||
|
|||||||
+13
-4
@@ -1308,16 +1308,25 @@ impl<W: LayoutElement> Workspace<W> {
|
|||||||
&self,
|
&self,
|
||||||
renderer: &mut R,
|
renderer: &mut R,
|
||||||
target: RenderTarget,
|
target: RenderTarget,
|
||||||
|
focus_ring: bool,
|
||||||
) -> impl Iterator<Item = WorkspaceRenderElement<R>> {
|
) -> impl Iterator<Item = WorkspaceRenderElement<R>> {
|
||||||
let scale = Scale::from(self.scale.fractional_scale());
|
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 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 floating = self.is_floating_visible().then(|| {
|
||||||
let view_rect = Rectangle::from_loc_and_size((0., 0.), self.view_size);
|
let view_rect = Rectangle::from_loc_and_size((0., 0.), self.view_size);
|
||||||
let floating = self
|
let floating = self.floating.render_elements(
|
||||||
.floating
|
renderer,
|
||||||
.render_elements(renderer, view_rect, scale, target);
|
view_rect,
|
||||||
|
scale,
|
||||||
|
target,
|
||||||
|
floating_focus_ring,
|
||||||
|
);
|
||||||
floating.into_iter().map(WorkspaceRenderElement::from)
|
floating.into_iter().map(WorkspaceRenderElement::from)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -3246,9 +3246,13 @@ impl Niri {
|
|||||||
elements.push(element.into());
|
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.
|
// Get monitor elements.
|
||||||
let mon = self.layout.monitor_for_output(output).unwrap();
|
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
|
let float_elements: Vec<_> = self
|
||||||
.layout
|
.layout
|
||||||
.render_floating_for_output(renderer, output, target)
|
.render_floating_for_output(renderer, output, target)
|
||||||
|
|||||||
Reference in New Issue
Block a user