boolean FcitxNotificationItemEnable(FcitxNotificationItem* notificationitem, FcitxNotificationItemAvailableCallback callback, void* data) { if (!callback || notificationitem->callback) return false; if (notificationitem->serviceName) { FcitxLog(ERROR, "This should not happen, please report bug."); return false; } notificationitem->callback = callback; notificationitem->data = data; asprintf(¬ificationitem->serviceName, "org.kde.StatusNotifierItem-%u-%d", getpid(), ++notificationitem->index); /* once we have name, request it first */ DBusError err; dbus_error_init(&err); dbus_bus_request_name(notificationitem->conn, notificationitem->serviceName, DBUS_NAME_FLAG_DO_NOT_QUEUE, &err); if (dbus_error_is_set(&err)) { FcitxLog(WARNING, "NotificationItem Name Error (%s)", err.message); } dbus_error_free(&err); if (notificationitem->available) { if (notificationitem->callback) { FcitxNotificationItemRegister(notificationitem); } } return true; }
void FcitxNotificationItemSetAvailable(FcitxNotificationItem* notificationitem, boolean available) { if (notificationitem->available != available) { notificationitem->available = available; if (available) { if (notificationitem->callback) { FcitxNotificationItemRegister(notificationitem); } } else { if (notificationitem->callback) { if (notificationitem->callback) { notificationitem->callback(notificationitem->data, false); } } } } }