diff --git a/src/apprt/gtk/ImguiWidget.zig b/src/apprt/gtk/ImguiWidget.zig index d78ed28a7..1f42f0b49 100644 --- a/src/apprt/gtk/ImguiWidget.zig +++ b/src/apprt/gtk/ImguiWidget.zig @@ -386,7 +386,8 @@ fn keyEvent( // Try to process the event as text const event = c.gtk_event_controller_get_current_event(@ptrCast(ec_key)); - _ = c.gtk_im_context_filter_keypress(self.im_context, event); + if (event != null) + _ = c.gtk_im_context_filter_keypress(self.im_context, event); return true; } diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 3ad695909..3d80d9259 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -1341,8 +1341,9 @@ fn gtkMouseDown( y: c.gdouble, ud: ?*anyopaque, ) callconv(.C) void { + const event = c.gtk_event_controller_get_current_event(@ptrCast(gesture)) orelse return; + const self = userdataSelf(ud.?); - const event = c.gtk_event_controller_get_current_event(@ptrCast(gesture)); const gtk_mods = c.gdk_event_get_modifier_state(event); const button = translateMouseButton(c.gtk_gesture_single_get_current_button(@ptrCast(gesture))); @@ -1374,7 +1375,8 @@ fn gtkMouseUp( _: c.gdouble, ud: ?*anyopaque, ) callconv(.C) void { - const event = c.gtk_event_controller_get_current_event(@ptrCast(gesture)); + const event = c.gtk_event_controller_get_current_event(@ptrCast(gesture)) orelse return; + const gtk_mods = c.gdk_event_get_modifier_state(event); const button = translateMouseButton(c.gtk_gesture_single_get_current_button(@ptrCast(gesture))); @@ -1393,6 +1395,8 @@ fn gtkMouseMotion( y: c.gdouble, ud: ?*anyopaque, ) callconv(.C) void { + const event = c.gtk_event_controller_get_current_event(@ptrCast(ec)) orelse return; + const self = userdataSelf(ud.?); const scaled = self.scaledCoordinates(x, y); @@ -1401,13 +1405,6 @@ fn gtkMouseMotion( .y = @floatCast(scaled.y), }; - // GTK can send spurious mouse movement events. Ignore them - // because this can cause actual issues: - // https://github.com/ghostty-org/ghostty/issues/2022 - if (pos.x == self.cursor_pos.x and pos.y == self.cursor_pos.y) { - return; - } - // Our pos changed, update self.cursor_pos = pos; @@ -1418,7 +1415,6 @@ fn gtkMouseMotion( } // Get our modifiers - const event = c.gtk_event_controller_get_current_event(@ptrCast(ec)); const gtk_mods = c.gdk_event_get_modifier_state(event); const mods = gtk_key.translateMods(gtk_mods); @@ -1432,10 +1428,11 @@ fn gtkMouseLeave( ec: *c.GtkEventControllerMotion, ud: ?*anyopaque, ) callconv(.C) void { + const event = c.gtk_event_controller_get_current_event(@ptrCast(ec)) orelse return; + const self = userdataSelf(ud.?); // Get our modifiers - const event = c.gtk_event_controller_get_current_event(@ptrCast(ec)); const gtk_mods = c.gdk_event_get_modifier_state(event); const mods = gtk_key.translateMods(gtk_mods); self.core_surface.cursorPosCallback(.{ .x = -1, .y = -1 }, mods) catch |err| { @@ -1536,11 +1533,12 @@ pub fn keyEvent( keycode: c.guint, gtk_mods: c.GdkModifierType, ) bool { - const keyval_unicode = c.gdk_keyval_to_unicode(keyval); const event = c.gtk_event_controller_get_current_event( @ptrCast(ec_key), ) orelse return false; + const keyval_unicode = c.gdk_keyval_to_unicode(keyval); + // Get the unshifted unicode value of the keyval. This is used // by the Kitty keyboard protocol. const keyval_unicode_unshifted: u21 = gtk_key.keyvalUnicodeUnshifted(