Gtk+ コールバックで C ブロックを使用する方法はありますか? 私はそのようなことを調べていました:
gboolean (^calledBack)(gpointer) = ^gboolean (gpointer data) {
printf("Callback fired!\n");
return FALSE;
};
g_timeout_add(300, calledBack, NULL);
ブロックを直接渡すことはできませんがg_timeout_add
、トランポリンを設定するのは簡単です。ブロックを使用して 2 つのクロージャを作成し、それらを に渡す小さなテスト プログラムを次に示しますg_timeout_add
。
#include <glib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Block.h>
typedef gboolean (^callback_type)();
static gboolean trampoline(gpointer data) {
callback_type callback = data;
gboolean ret = callback();
Block_release(callback);
return ret;
}
void some_gtk_handler(int param)
{
gboolean (^callback)() = ^gboolean () {
printf("Callback fired: %d!\n", param);
return FALSE;
};
g_timeout_add(300, trampoline, Block_copy(callback));
}
int main()
{
GMainLoop *ml = g_main_loop_new(NULL, FALSE);
some_gtk_handler(0);
some_gtk_handler(42);
g_main_loop_run(ml);
return 0;
}
上記のコードはワンショット ハンドラーを指定しているため、トランポリンでブロックを解放できます。複数回実行されるブロックが必要な場合はBlock_release
、トランポリンからへの呼び出しを削除g_timeout_add_full
し、破棄通知コールバックを使用してそれらをスケジュールします。
g_timeout_add_full(G_PRIORITY_DEFAULT, 300, trampoline, Block_copy(callback),
release_callback);
...ここで、release_callback は次のように定義されたユーティリティ関数です。
static void release_callback(gpointer data) {
Block_release(data);
}
ANSI C にはブロック機能がありません。Objective-Cのことですか?後者の場合、Gtk+ は純粋な C フレームワークであるため、答えはノーです。