GObject如何将参数传递给信号

时间:2017-02-18 13:33:04

标签: c signals parameter-passing glib gobject

好的,所以我有一个自定义的GObject来处理输入事件,通知连接的处理程序我在class_init_function中取消了一个信号:

static void sample_input_manager_class_init (SampleInputManagerClass *klass)
{
  sample_input_manager_signals[KEY_EVENT] = g_signal_new(
    "key-event",
    G_TYPE_FROM_CLASS(klass),
    G_SIGNAL_RUN_LAST,
    0,
    NULL,
    NULL,
    NULL,
    G_TYPE_NONE,
    1,
    G_TYPE_INT /* Keycode */
  );
}

可能有用(在源文件的顶部):

enum SAMPLE_INPUT_MANAGER_SIGNALS
{
  KEY_EVENT = 0,

  N_SIGNALS
};

static guint ssample_input_manager_signals[N_SIGNALS] = { 0 };

现在,我想通过以下调用触发信号:

int key = 42;
g_signal_emit(manager, sample_input_manager_signals[KEY_EVENT], 0, key);

(其中manager是一个有效的实例,key是一个整数来表示字符)但是,在我的注册回调(g_signal_connect)中,我得到了完全随机的值,如-2073417152(对于任何输入整数,在运行期间保持不变)

我错过了什么来让它发挥作用吗?

编辑#1:

信号处理程序连接:

SampleInputHandler *input = sample_input_handler_new();
g_signal_connect(input, "key-event", G_CALLBACK(test_cb), NULL);

回调:

void testcb(int key, gpointer data)
{
  printf("(%d)",key);
}

1 个答案:

答案 0 :(得分:1)

好的,经过太长时间后,我认为GLib中的默认回调签名与此类似:

<ReturnType> callback (YourType *object[, <your arguments> ], gpointer data);

所以在我的问题中我只是忘记了第一个参数,所以我实际上没有读取我的整数,而是读取了我对象的内存指针地址。