diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 73837d11d..87de0e749 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -526,6 +526,7 @@ pub fn init(self: *Surface, app: *App, opts: Options) !void { _ = c.g_signal_connect_data(gesture_click, "pressed", c.G_CALLBACK(>kMouseDown), self, null, c.G_CONNECT_DEFAULT); _ = c.g_signal_connect_data(gesture_click, "released", c.G_CALLBACK(>kMouseUp), self, null, c.G_CONNECT_DEFAULT); _ = c.g_signal_connect_data(ec_motion, "motion", c.G_CALLBACK(>kMouseMotion), self, null, c.G_CONNECT_DEFAULT); + _ = c.g_signal_connect_data(ec_motion, "leave", c.G_CALLBACK(>kMouseLeave), self, null, c.G_CONNECT_DEFAULT); _ = c.g_signal_connect_data(ec_scroll, "scroll", c.G_CALLBACK(>kMouseScroll), self, null, c.G_CONNECT_DEFAULT); _ = c.g_signal_connect_data(im_context, "preedit-start", c.G_CALLBACK(>kInputPreeditStart), self, null, c.G_CONNECT_DEFAULT); _ = c.g_signal_connect_data(im_context, "preedit-changed", c.G_CALLBACK(>kInputPreeditChanged), self, null, c.G_CONNECT_DEFAULT); @@ -1344,6 +1345,22 @@ fn gtkMouseMotion( }; } +fn gtkMouseLeave( + ec: *c.GtkEventControllerMotion, + ud: ?*anyopaque, +) callconv(.C) void { + 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 = translateMods(gtk_mods); + self.core_surface.cursorPosCallback(.{ .x = -1, .y = -1 }, mods) catch |err| { + log.err("error in cursor pos callback err={}", .{err}); + return; + }; +} + fn gtkMouseScroll( _: *c.GtkEventControllerScroll, x: c.gdouble,