Editar: tudo bem, depois de uma quantidade razoável de investigação (que envolveu a execução de valgrind
), finalmente consegui descobrir o que está acontecendo aqui. A assinatura do seu retorno de chamada não está correta.
A assinatura para o método estático deve ser:
void MainWindow::fake_callback(DbusmenuMenuitem *, guint, gpointer data)
{
//...
}
Observe a adição de DbusmenuMenuitem *
e guint
. O primeiro é um ponteiro para o item de menu DBus que emite o sinal e o segundo é um timestamp. Ambos devem estar presentes na assinatura, mesmo que você não os use.
g_signal_connect
é invocado no tempo de execução e não tem como saber quais parâmetros sua função aceita e simplesmente envia os parâmetros na pilha assumindo que as assinaturas correspondem. (Isso difere do que você provavelmente está acostumado em Qt, onde o MOC (Meta Object Compiler) gera informações suficientes para saber quando você está tentando conectar um sinal a um slot com uma assinatura incompatível.)