diff --git a/Sources/SwiftGtkGenCore/CodeGen+Signal.swift b/Sources/SwiftGtkGenCore/CodeGen+Signal.swift index 5f4a0a8..b5f6541 100644 --- a/Sources/SwiftGtkGenCore/CodeGen+Signal.swift +++ b/Sources/SwiftGtkGenCore/CodeGen+Signal.swift @@ -27,7 +27,7 @@ extension CodeGenerator { let detailClause = signal.isDetailed ? ", \"\(signal.name)\"" : "" if signal.parameters.isEmpty { - let callbackReturn = inhibit ? " -> gboolean" : "" + let callbackReturn = inhibit ? " -> gboolean" : " -> Void" let handlerCall = inhibit ? "let result = stored(); return result ? 1 : 0" : "stored()" return """ public func connect\(signalName)(_ handler: @escaping () -> \(handlerReturnType)) -> Int { @@ -48,7 +48,7 @@ extension CodeGenerator { let extractionExprs = signal.parameters.enumerated().map { i, p in cSignalParameterExtraction(index: i, type: p.type) }.joined(separator: ", ") - let callbackReturn = inhibit ? " -> gboolean" : "" + let callbackReturn = inhibit ? " -> gboolean" : " -> Void" let handlerCall = inhibit ? "let result = stored(\(extractionExprs)); return result ? 1 : 0" : "stored(\(extractionExprs))" diff --git a/Tests/SwiftGtkGenCoreTests/SignalConnectionTests.swift b/Tests/SwiftGtkGenCoreTests/SignalConnectionTests.swift index 6bb0929..0dcc0b5 100644 --- a/Tests/SwiftGtkGenCoreTests/SignalConnectionTests.swift +++ b/Tests/SwiftGtkGenCoreTests/SignalConnectionTests.swift @@ -20,3 +20,22 @@ func testSignalWithParams() { #expect(connection.contains("_: Int32")) #expect(connection.contains("g_signal_connect_data")) } + +@Test("Non-inhibit signal generates correct @convention(c) with -> Void") +func testNonInhibitSignalConnection() { + let signal = Signal(name: "clicked", parameters: [], returnType: .void) + let code = CodeGenerator.generateSignalConnection(signal: signal, inhibit: false) + #expect(code.contains("-> Void")) + #expect(code.contains("@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void")) +} + +@Test("Parameterized non-inhibit signal generates correct @convention(c)") +func testParameterizedNonInhibitSignalConnection() { + let signal = Signal(name: "size-allocate", parameters: [ + Parameter(name: "width", type: .int32), + Parameter(name: "height", type: .int32), + ], returnType: .void) + let code = CodeGenerator.generateSignalConnection(signal: signal, inhibit: false) + #expect(code.contains("-> Void")) + #expect(code.contains("@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void")) +}