emitcabi.go: Add projection of private signals

This commit is contained in:
Rick Calixte 2025-05-24 15:17:28 -04:00
parent 0e6905c39e
commit 2019f402a0
No known key found for this signature in database

View File

@ -889,6 +889,10 @@ extern "C" {
}
}
for _, m := range c.PrivateSignals {
ret.WriteString(fmt.Sprintf("%s %s(%s* self, intptr_t slot);\n", m.ReturnType.RenderTypeCabi(), cabiConnectName(c, m), className))
}
// delete
if c.CanDelete {
ret.WriteString(fmt.Sprintf("void %s(%s* self);\n", cabiDeleteName(c), className))
@ -970,7 +974,9 @@ extern "C" {
`)
for _, c := range src.Classes {
for _, m := range c.Methods {
methodsAndPrivateSignals := append(c.Methods, c.PrivateSignals...)
for _, m := range methodsAndPrivateSignals {
if m.IsSignal {
callback := "void " + cabiCallbackName(c, m) + "(intptr_t"
@ -1446,6 +1452,32 @@ extern "C" {
}
}
for _, m := range c.PrivateSignals {
exactSignal := `&` + c.ClassName + `::` + m.CppCallTarget()
paramArgs := []string{"slot"}
paramArgDefs := []string{"intptr_t cb"}
var signalCode string
for i, p := range m.Parameters {
signalCode += emitAssignCppToCabi(fmt.Sprintf("\t\t%s sigval%d = ", p.RenderTypeCabi(), i+1), p, p.cParameterName())
paramArgs = append(paramArgs, fmt.Sprintf("sigval%d", i+1))
paramArgDefs = append(paramArgDefs, p.RenderTypeCabi()+" "+p.cParameterName())
}
signalCode += "\t\t" + cabiCallbackName(c, m) + "(" + strings.Join(paramArgs, `, `) + ");\n"
ret.WriteString(
`void ` + cabiConnectName(c, m) + `(` + methodPrefixName + `* self, intptr_t slot) {` + "\n" +
"\t" + cppClassName + `::connect(self, ` + exactSignal + `, self, [=](` + emitParametersCpp(m) + `) {` + "\n" +
signalCode +
"\t});\n" +
"}\n" +
"\n",
)
}
// Delete
// If we subclassed, our class destructor is always virtual. Therefore
// we can delete from the self ptr without any dynamic_cast<>