我使用安装了MSYS2的最新GTK +,每当我尝试使用时
g_application_send_notification()
它总是导致以下结果
断言:
(Notification Project.exe:27780): GLib-GObject-CRITICAL **: g_object_new:
assertion 'G_TYPE_IS_OBJECT (object_type)' failed
为什么我认为这是一个错误 - 因为我在地雷旁边尝试了很多代码示例 (无论如何,它们都非常像地雷),让它工作的人 (包括Lars Uebernickel的通知),这一切都是一样的 哀叹。 断言,然后崩溃。现在我真的不知道这意味着什么 可能在gtk内部,但我真的希望你们中的一些人可能有 一个线索或经验。
生成此断言的代码示例:
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gtk/gtk.h>
#define ICON_PATH "/path/trash_16x16.gif"
int main (int argc, char *argv[])
{
GApplication *app;
app = g_application_new ("org.one", G_APPLICATION_FLAGS_NONE);
if(!app)
{
g_print ("Error app\n");
}
else
{
if(g_application_register (app, NULL, NULL))
{
GNotification *notification;
GFile *file;
GIcon *icon;
notification = g_notification_new ("one");
g_notification_set_body (notification, "Hello world");
file = g_file_new_for_path (ICON_PATH);
icon = g_file_icon_new (file);
g_notification_set_icon (notification, G_ICON (icon));
g_application_send_notification (app, NULL, notification);
g_object_unref (icon);
g_object_unref (file);
g_object_unref (notification);
g_object_unref (app);
g_print ("yes\n");
}
else
{
g_print ("no\n");
}
}
return 0;
}
我能做些什么来绕过这个问题,或者甚至可以解决它?
答案 0 :(得分:0)
没有通知后端在W32上工作,已确认。贡献者曾经想要创建这样的,但是所需的API(W32 toast通知)仅限COM,而MinGW-w64还没有必要的标题。
具体看一下glib gio源代码和GNotificationBackend接口,我们可以看到它很简单。
现在,您可以在GTK中完成...或者我们可以以正确的方式(TM)执行此操作并为其实现D-Bus服务器。通知服务器的好处是,即使应用程序终止,通知也可以保留。此外,GTK已经有后端与通知服务器通信,所以你只需要在W32上启用这些后端(一目了然,代码不会使用任何不能在W32上工作的东西)已经)。此外,这样服务器将透明地使用Shell_NotifyIcon
(在Windows 7及更早版本上)或Toast通知(在Windows 8及更高版本上;如果您有机会实现这些)。
如果要保持跨平台性,另一个选择是在DLL中创建Shell_NotifyIcon
实现,如果检测到窗口,则使用Shell_NotifyIcon
,如果不是,请使用GNotification。