From cffaa54a78683fcccbd99a098d628a55cf9b628a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 3 Feb 2019 18:24:47 +0530 Subject: [PATCH] Forgot to dispatch events on the dbus session bus --- glfw/dbus_glfw.c | 5 +++++ glfw/dbus_glfw.h | 1 + glfw/linux_notify.c | 31 +++++++++++++------------------ glfw/wl_window.c | 1 + glfw/x11_window.c | 1 + 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/glfw/dbus_glfw.c b/glfw/dbus_glfw.c index 9b9f55549..1a529a49f 100644 --- a/glfw/dbus_glfw.c +++ b/glfw/dbus_glfw.c @@ -172,6 +172,11 @@ glfw_dbus_dispatch(DBusConnection *conn) { while(dbus_connection_dispatch(conn) == DBUS_DISPATCH_DATA_REMAINS); } +void +glfw_dbus_session_bus_dispatch() { + if (session_bus) glfw_dbus_dispatch(session_bus); +} + void glfw_dbus_terminate(_GLFWDBUSData *dbus) { if (dbus_data) { diff --git a/glfw/dbus_glfw.h b/glfw/dbus_glfw.h index b758c0dc9..05793ed64 100644 --- a/glfw/dbus_glfw.h +++ b/glfw/dbus_glfw.h @@ -48,6 +48,7 @@ glfw_dbus_call_method_no_reply(DBusConnection *conn, const char *node, const cha GLFWbool glfw_dbus_call_method_with_reply(DBusConnection *conn, const char *node, const char *path, const char *interface, const char *method, int timeout_ms, dbus_pending_callback callback, void *user_data, ...); void glfw_dbus_dispatch(DBusConnection *); +void glfw_dbus_session_bus_dispatch(); GLFWbool glfw_dbus_get_args(DBusMessage *msg, const char *failmsg, ...); int glfw_dbus_match_signal(DBusMessage *msg, const char *interface, ...); DBusConnection* glfw_dbus_session_bus(); diff --git a/glfw/linux_notify.c b/glfw/linux_notify.c index 1ecbf719f..15b71ddd3 100644 --- a/glfw/linux_notify.c +++ b/glfw/linux_notify.c @@ -43,22 +43,18 @@ notification_created(DBusMessage *msg, const char* errmsg, void *data) { static DBusHandlerResult message_handler(DBusConnection *conn, DBusMessage *msg, void *user_data) { (void)(user_data); - switch(glfw_dbus_match_signal(msg, NOTIFICATIONS_IFACE, "ActionInvoked", NULL)) { - case 0: - { - uint32_t notification_id; - const char *action; - if (glfw_dbus_get_args(msg, "Failed to get args from ActionInvoked notification signal", - DBUS_TYPE_UINT32, ¬ification_id, DBUS_TYPE_STRING, &action, DBUS_TYPE_INVALID)) { - if (activated_handler) { - activated_handler(notification_id, action); - } - } - + /* printf("session_bus message_handler invoked interface: %s member: %s\n", dbus_message_get_interface(msg), dbus_message_get_member(msg)); */ + if (dbus_message_is_signal(msg, NOTIFICATIONS_IFACE, "ActionInvoked")) { + uint32_t notification_id; + const char *action; + if (!glfw_dbus_get_args(msg, "Failed to get args from ActionInvoked notification signal", + DBUS_TYPE_UINT32, ¬ification_id, DBUS_TYPE_STRING, &action, DBUS_TYPE_INVALID)) { + if (activated_handler) { + activated_handler(notification_id, action); + return DBUS_HANDLER_RESULT_HANDLED; } - break; - default: - break; + } + } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -69,9 +65,8 @@ glfw_dbus_send_user_notification(const char *app_name, const char* icon, const c static DBusConnection *added_signal_match = NULL; if (!session_bus) return 0; if (added_signal_match != session_bus) { - dbus_bus_add_match(session_bus, "type='signal',interface='org.freedesktop.Notifications'", NULL); - static DBusObjectPathVTable vtable = {.message_function = message_handler}; - dbus_connection_try_register_object_path(session_bus, NOTIFICATIONS_PATH, &vtable, NULL, NULL); + dbus_bus_add_match(session_bus, "type='signal',interface='" NOTIFICATIONS_IFACE "',member='ActionInvoked'", NULL); + dbus_connection_add_filter(session_bus, message_handler, NULL, NULL); added_signal_match = session_bus; } NotificationCreatedData *data = malloc(sizeof(NotificationCreatedData)); diff --git a/glfw/wl_window.c b/glfw/wl_window.c index 8d2613079..cd9132eea 100644 --- a/glfw/wl_window.c +++ b/glfw/wl_window.c @@ -839,6 +839,7 @@ handleEvents(double timeout) wl_display_cancel_read(display); } glfw_ibus_dispatch(&_glfw.wl.xkb.ibus); + glfw_dbus_session_bus_dispatch(); } // Translates a GLFW standard cursor to a theme cursor name diff --git a/glfw/x11_window.c b/glfw/x11_window.c index 8258fc608..e83c963b5 100644 --- a/glfw/x11_window.c +++ b/glfw/x11_window.c @@ -62,6 +62,7 @@ handleEvents(double timeout) { int display_read_ok = pollForEvents(&_glfw.x11.eventLoopData, timeout); if (display_read_ok) _glfwDispatchX11Events(); glfw_ibus_dispatch(&_glfw.x11.xkb.ibus); + glfw_dbus_session_bus_dispatch(); } static GLFWbool