From 10adef3092d29d6dcd6944e594dfadcbe927bed0 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Thu, 2 Oct 2025 13:43:33 -0500 Subject: [PATCH 1/2] gtk: fix duplicate signal handlers --- src/apprt/gtk/class/window.zig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apprt/gtk/class/window.zig b/src/apprt/gtk/class/window.zig index c0dd6ab1f..31a4cc6ff 100644 --- a/src/apprt/gtk/class/window.zig +++ b/src/apprt/gtk/class/window.zig @@ -693,6 +693,10 @@ pub const Window = extern struct { self: *Self, tree: *const Surface.Tree, ) void { + // Ensure that all old signal handlers have been removed before adding + // them. Otherwise we get duplicate surface handlers. + self.disconnectSurfaceHandlers(tree); + const priv = self.private(); var it = tree.iterator(); while (it.next()) |entry| { From c8ed3031bcd8853666b5b78170379dffa11c741d Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Thu, 2 Oct 2025 17:18:08 -0500 Subject: [PATCH 2/2] gtk: improve signal handler management Instead of making two separate passes over the surfaces in a split tree to manage signal handlers, do it in one pass. --- src/apprt/gtk/class/window.zig | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/apprt/gtk/class/window.zig b/src/apprt/gtk/class/window.zig index 31a4cc6ff..8efff8729 100644 --- a/src/apprt/gtk/class/window.zig +++ b/src/apprt/gtk/class/window.zig @@ -693,14 +693,23 @@ pub const Window = extern struct { self: *Self, tree: *const Surface.Tree, ) void { - // Ensure that all old signal handlers have been removed before adding - // them. Otherwise we get duplicate surface handlers. - self.disconnectSurfaceHandlers(tree); - const priv = self.private(); var it = tree.iterator(); while (it.next()) |entry| { const surface = entry.view; + // Before adding any new signal handlers, disconnect any that we may + // have added before. Otherwise we may get multiple handlers for the + // same signal. + _ = gobject.signalHandlersDisconnectMatched( + surface.as(gobject.Object), + .{ .data = true }, + 0, + 0, + null, + null, + self, + ); + _ = Surface.signals.@"present-request".connect( surface, *Self,