我正在尝试基于XCB创建wm。我对我的基本对象使用gaapplication。我尝试创建一个新的GSignal,并基于某些XCB事件发出它。程序编译得很好,但当我运行它并发生事件时,我会得到一个错误:
GLib GObject警告**:09:45:01.395:../GLib/GObject/gsignal.c:3492:信号名称“指针移动”对“gaapplication”类型的实例“0x5597bbb9e890”无效。
下面是我如何创建信号:

  g_signal_new ("pointer-motion",
                G_TYPE_FROM_CLASS (class),
                G_SIGNAL_DETAILED |
                G_SIGNAL_ACTION |
                G_SIGNAL_RUN_FIRST,
                0,
                NULL,
                NULL,
                NULL,
                G_TYPE_NONE,
                1,
                G_TYPE_POINTER);

下面是我的发射方式:
g_signal_emit_by_name (fairy,
                       "pointer-motion",
                       motion_notify_event);

这是完整的来源:
https://pastebin.com/TMtQFwAb
有人能告诉我我做错了什么吗。

最佳答案

信号代码看起来不错。错误消息“signal is invalid for instance of type gaapplication”暗示的问题是,您从未实际实例化对象:

fairy_wm_new (const gchar *id, GApplicationFlags flags)
{
  return g_object_new (G_TYPE_APPLICATION,"application-id",id,"flags",flags,NULL);
}

这将返回指向一个gaapplication的指针,而不是一个FairyWM。改为使用FAIRY_TYPE_WM

08-19 18:35