首页 > 解决方案 > (GLib) 如何创建和发出 GSignals?

问题描述

我正在尝试基于 XCB 创建一个 wm。我使用 GApplication 作为我的基础对象。我尝试创建一个新的 GSignal 并根据某些 xcb 事件发出它。程序编译得很好,但是当我运行它并且事件发生时我收到错误:GLib-GObject-WARNING **: 09:45:01.395: ../glib/gobject/gsignal.c:3492: 信号名称 'pointer-motion' 无效,例如 'GApplication' 类型的 '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 。有人可以指出我做错了什么。

标签: cgtkgtk3glib

解决方案


信号代码看起来不错。错误消息“信号对于 GApplication 类型的实例无效”暗示的问题是您从未实际实例化您的对象:

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

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


推荐阅读