Glib - Какой самый простой способ выполнить GCallback напрямую? - PullRequest
0 голосов
/ 11 февраля 2020

То, что я сейчас делаю:

/* FIXME: Actually I just want to call that callback ... no idea how that can be done without using a signal */
/* So I just used some random unused signal for it */
gulong handler_id = g_signal_connect_swapped (window, "direction-changed", (GCallback) mycallback, window);
g_signal_emit_by_name (window,"direction-changed");
g_signal_handler_disconnect (window, handler_id);

Работает хорошо, но безобразно.

Я знаю, что каким-то образом можно вызвать мой обратный вызов, используя каким-то образом g_closure_invoke() , хотя до сих пор я не заставил это работать.

Если это имеет значение, обратный вызов будет заполнен функцией, которая выглядит так:

static void myCallbackMethod (GtkWindow *window);

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

A GCallback - это просто указатель на функцию определенного типа. Вы можете вызвать функцию напрямую, как и любой другой вызов C.

mycallback (window);
0 голосов
/ 18 февраля 2020

Ответ от Филиппа Сналла мне помог, но он неполон. (Создает ошибку компилятора)

Как и в обычном C, требуется привести обратный вызов к конкретному методу, прежде чем его можно будет использовать. В моем случае (callback returs void, единственный аргумент типа GtkWindow *) хорошо работает следующий вызов:

((void (*)(GtkWindow*))mycallback)(window);
...