From df9d721f7462a7edaacb9de4530580a68ab6e8ab Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Mon, 18 Mar 2024 18:17:04 +0400 Subject: Implement focus-follows-mouse --- src/input.rs | 5 +++++ src/niri.rs | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) (limited to 'src') diff --git a/src/input.rs b/src/input.rs index c7a0e264..1d99f550 100644 --- a/src/input.rs +++ b/src/input.rs @@ -903,6 +903,8 @@ impl State { } } + self.niri.handle_focus_follows_mouse(&under); + // Activate a new confinement if necessary. self.niri.maybe_activate_pointer_constraint(new_pos, &under); @@ -967,6 +969,9 @@ impl State { } let under = self.niri.surface_under_and_global_space(pos); + + self.niri.handle_focus_follows_mouse(&under); + self.niri.maybe_activate_pointer_constraint(pos, &under); self.niri.pointer_focus.clone_from(&under); diff --git a/src/niri.rs b/src/niri.rs index ef369e35..f63f05a3 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -3305,6 +3305,28 @@ impl Niri { warn!("error spawning a thread to send MonitorsChanged: {err:?}"); } } + + pub fn handle_focus_follows_mouse(&mut self, new_focus: &PointerFocus) { + if !self.config.borrow().input.focus_follows_mouse { + return; + } + + if self.seat.get_pointer().unwrap().is_grabbed() { + return; + } + + if let Some(output) = &new_focus.output { + if self.pointer_focus.output.as_ref() != Some(output) { + self.layout.focus_output(output); + } + } + + if let Some(window) = &new_focus.window { + if self.pointer_focus.window.as_ref() != Some(window) { + self.layout.activate_window(window); + } + } + } } pub struct ClientState { -- cgit