mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 15:56:13 +03:00
Don't steal focus on mouse events that are within 1 px (#3997)
Fixes #3229 Gets the desired behavior for #3229, I'm unsure if there is a nicer way to omit the mouse motion events from the event controller when the glarea is resized due to the splitting behavior. Thresholding to 1px is required because just checking for equality results in the focus still being stolen sometimes. This is kinda of a hack so a nicer solution would be much appreciated!
This commit is contained in:
@ -1426,15 +1426,23 @@ fn gtkMouseMotion(
|
|||||||
.y = @floatCast(scaled.y),
|
.y = @floatCast(scaled.y),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Our pos changed, update
|
// When the GLArea is resized under the mouse, GTK issues a mouse motion
|
||||||
self.cursor_pos = pos;
|
// 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.
|
// If we don't have focus, and we want it, grab it.
|
||||||
const gl_widget = @as(*c.GtkWidget, @ptrCast(self.gl_area));
|
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();
|
self.grabFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Our pos changed, update
|
||||||
|
self.cursor_pos = pos;
|
||||||
|
|
||||||
// Get our modifiers
|
// Get our modifiers
|
||||||
const gtk_mods = c.gdk_event_get_modifier_state(event);
|
const gtk_mods = c.gdk_event_get_modifier_state(event);
|
||||||
const mods = gtk_key.translateMods(gtk_mods);
|
const mods = gtk_key.translateMods(gtk_mods);
|
||||||
|
Reference in New Issue
Block a user