создавать и излучать сигнал GTK - PullRequest
4 голосов
/ 13 октября 2009

Я пытаюсь создать и испустить сигнал GTK:

g_signal_new("child-finished",
    G_TYPE_OBJECT,
    G_SIGNAL_RUN_FIRST,
    0,
    NULL, NULL,
    NULL,           // *** I think this is where I need to change it
    G_TYPE_NONE, 0);
g_signal_connect(G_OBJECT(myWindow), "child-finished", G_CALLBACK(MyCallback), NULL);

Вот мой код, который излучает сигнал:

gtk_signal_emit_by_name(referenceToMyWindow, "child-finished");

А вот мой код, который обрабатывает сигнал:

void MyCallback(GtkWidget *w, GdkEvent *e)
{
    // handler code here
}

Когда я запускаю код, я получаю следующую ошибку:

GLib-GObject-CRITICAL **: g _closure_ invoke: утверждение `closure-> marshal || завершение -> meta_marshal 'не удалось

Я знаю, что это связано с передачей маршаллера в функцию g_signal_new, но я не знаю, что такое маршаллер, я не могу понять документацию и примеры в Интернете мало и далеко друг от друга. Как мне объявить и подключить свой собственный сигнал?

1 Ответ

3 голосов
/ 13 октября 2009

Библиотека GObject предоставляет несколько встроенных маршаллеров , поэтому ваш код, вероятно, должен выглядеть так:

g_signal_new("child-finished",
             G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
             0, NULL, NULL,
             g_cclosure_marshal_VOID__POINTER,
             G_TYPE_NONE, 1, G_TYPE_POINTER);

или, если вы хотите проверить тип:

g_signal_new("child-finished",
             G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
             0, NULL, NULL,
             g_cclosure_marshal_VOID__BOXED,
             G_TYPE_NONE, 1, GDK_TYPE_EVENT);

Параметры обработчика сигнала должны присутствовать (подразумевается сам объект), поэтому обязательно укажите указатель (как в первом примере) или тип в штучной упаковке (как во втором примере) ).

Если нужного вам маршаллера нет в встроенных, вы можете использовать утилиту glib-genmarshal или напрямую написать его самостоятельно (это довольно тривиально, просто посмотрите на вывод glib-genmarshal ).

...