好的,所以我有一个自定义的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);
}
答案 0 :(得分:1)
好的,经过太长时间后,我认为GLib中的默认回调签名与此类似:
<ReturnType> callback (YourType *object[, <your arguments> ], gpointer data);
所以在我的问题中我只是忘记了第一个参数,所以我实际上没有读取我的整数,而是读取了我对象的内存指针地址。