如何使用带有Gtk回调的C块?

时间:2013-10-04 20:58:23

标签: c gtk glib

有没有办法在Gtk +回调中使用C块?我正在研究这样的事情:

gboolean (^calledBack)(gpointer) = ^gboolean (gpointer data) {
    printf("Callback fired!\n");    
    return FALSE;
};

g_timeout_add(300, calledBack, NULL);

2 个答案:

答案 0 :(得分:2)

即使您无法直接将阻止传递给g_timeout_add,也很容易设置蹦床来为您完成。这是一个小型测试程序,它使用块创建两个闭包并将它们传递给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);
}

答案 1 :(得分:0)

ANSI C没有任何阻止功能。你的意思是Objective-C?在后一种情况下,答案是否定的,因为Gtk +是纯C框架。