From 6a4842f110abdcdc4eb7f708b4af9c4f09d922c7 Mon Sep 17 00:00:00 2001 From: Matt Rochford Date: Sun, 29 Dec 2024 13:47:03 -0800 Subject: [PATCH] Don't steal focus on mouse events that are within 1 px --- src/apprt/gtk/Surface.zig | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 079cdbd81..c53190ccc 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -1426,15 +1426,23 @@ fn gtkMouseMotion( .y = @floatCast(scaled.y), }; - // Our pos changed, update - self.cursor_pos = pos; + // When the GLArea is resized under the mouse, GTK issues a mouse motion + // event. This has the unfortunate side effect of causing focus to potentially + // change when `focus-follows-mouse` is enabled. To prevent this, we check + // if the cursor is still in the same place as the last event and only grab + // focus if it has moved. + const is_cursor_still = @abs(self.cursor_pos.x - pos.x) < 1 and + @abs(self.cursor_pos.y - pos.y) < 1; // If we don't have focus, and we want it, grab it. const gl_widget = @as(*c.GtkWidget, @ptrCast(self.gl_area)); - if (c.gtk_widget_has_focus(gl_widget) == 0 and self.app.config.@"focus-follows-mouse") { + if (!is_cursor_still and c.gtk_widget_has_focus(gl_widget) == 0 and self.app.config.@"focus-follows-mouse") { self.grabFocus(); } + // Our pos changed, update + self.cursor_pos = pos; + // Get our modifiers const gtk_mods = c.gdk_event_get_modifier_state(event); const mods = gtk_key.translateMods(gtk_mods);