aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/input.rs5
-rw-r--r--src/niri.rs22
2 files changed, 27 insertions, 0 deletions
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 {