0

我需要在单击时运行功能的 libnotify 通知的底部添加按钮。我可以使按钮出现,但单击时它们不会运行这些功能。它根本没有给出任何错误信息。

该程序被调用./notifications "Title" "Body" "pathtoicon"

代码:

#include <libnotify/notify.h>
#include <iostream>

void callback_mute(NotifyNotification* n, char* action, gpointer user_data) {
  std::cout << "Muting Program" << std::endl;
  system("pkexec kernel-notify -am");
}

int main(int argc, char * argv[] ) {
    GError *error = NULL;
    notify_init("Basics");
    NotifyNotification* n = notify_notification_new (argv[1],
                                 argv[2],
                                 argv[3]);

    notify_notification_add_action (n,
      "action_click",
      "Mute",
       NOTIFY_ACTION_CALLBACK(callback_mute),
       NULL,
       NULL);


    notify_notification_set_timeout(n, 10000);
    if (!notify_notification_show(n, 0)) {
        std::cerr << "Notification failed" << std::endl;
        return 1;
    }
    return 0;
}

任何帮助将不胜感激,谢谢!

4

1 回答 1

0

您必须使用GMainLoop, 一个“主事件循环”才能使回调函数起作用。libnotify使用此循环来处理其操作,没有它,它根本不会调用您期望的回调函数,因为没有任何处理它。

基本上在您的main函数中,只需GMainLoop *loop在开头添加 a 然后loop = g_main_loop_new(nullptr, FALSE);对其进行初始化,然后在最后添加g_main_loop_run(loop);. 您的程序应该像以前一样运行,但回调函数现在可以工作了。所以基本上:

int main(int argc, char **argv)
{
  GMainLoop *loop;
  loop = g_main_loop_new(nullptr, FALSE);
  // ... do your stuff
  g_main_loop_run(loop);
  return 0;
}

您可以在以下位置阅读更多相关信息:主事件循环:GLib 参考手册

glib.h无论如何,您不必libnotify包含它。

于 2019-09-18T00:04:19.647 回答