#pragma once #include #include #include #include #include #include "../../core/model.hpp" #include "../../core/reload.hpp" #include "notification.hpp" #include "server.hpp" namespace qs::service::notifications { ///! Desktop Notifications Server. /// An implementation of the [Desktop Notifications Specification] for receiving notifications /// from external applications. /// /// The server does not advertise most capabilities by default. See the individual properties for details. /// /// [Desktop Notifications Specification]: https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html class NotificationServerQml : public QObject , public PostReloadHook { Q_OBJECT; // clang-format off /// If notifications should be re-emitted when quickshell reloads. Defaults to true. /// /// The @@Notification.lastGeneration flag will be /// set on notifications from the prior generation for further filtering/handling. Q_PROPERTY(bool keepOnReload READ keepOnReload WRITE setKeepOnReload NOTIFY keepOnReloadChanged); /// If the notification server should advertise that it can persist notifications in the background /// after going offscreen. Defaults to false. Q_PROPERTY(bool persistenceSupported READ persistenceSupported WRITE setPersistenceSupported NOTIFY persistenceSupportedChanged); /// If notification body text should be advertised as supported by the notification server. /// Defaults to true. /// /// Note that returned notifications are likely to return body text even if this property is false, /// as it is only a hint. Q_PROPERTY(bool bodySupported READ bodySupported WRITE setBodySupported NOTIFY bodySupportedChanged); /// If notification body text should be advertised as supporting markup as described in [the specification] /// Defaults to false. /// /// Note that returned notifications may still contain markup if this property is false, /// as it is only a hint. By default Text objects will try to render markup. To avoid this /// if any is sent, change @@QtQuick.Text.textFormat to `PlainText`. Q_PROPERTY(bool bodyMarkupSupported READ bodyMarkupSupported WRITE setBodyMarkupSupported NOTIFY bodyMarkupSupportedChanged); /// If notification body text should be advertised as supporting hyperlinks as described in [the specification] /// Defaults to false. /// /// Note that returned notifications may still contain hyperlinks if this property is false, as it is only a hint. /// /// [the specification]: https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html#hyperlinks Q_PROPERTY(bool bodyHyperlinksSupported READ bodyHyperlinksSupported WRITE setBodyHyperlinksSupported NOTIFY bodyHyperlinksSupportedChanged); /// If notification body text should be advertised as supporting images as described in [the specification] /// Defaults to false. /// /// Note that returned notifications may still contain images if this property is false, as it is only a hint. /// /// [the specification]: https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html#images Q_PROPERTY(bool bodyImagesSupported READ bodyImagesSupported WRITE setBodyImagesSupported NOTIFY bodyImagesSupportedChanged); /// If notification actions should be advertised as supported by the notification server. Defaults to false. Q_PROPERTY(bool actionsSupported READ actionsSupported WRITE setActionsSupported NOTIFY actionsSupportedChanged); /// If notification actions should be advertised as supporting the display of icons. Defaults to false. Q_PROPERTY(bool actionIconsSupported READ actionIconsSupported WRITE setActionIconsSupported NOTIFY actionIconsSupportedChanged); /// If the notification server should advertise that it supports images. Defaults to false. Q_PROPERTY(bool imageSupported READ imageSupported WRITE setImageSupported NOTIFY imageSupportedChanged); /// All notifications currently tracked by the server. Q_PROPERTY(ObjectModel* trackedNotifications READ trackedNotifications NOTIFY trackedNotificationsChanged); /// Extra hints to expose to notification clients. Q_PROPERTY(QVector extraHints READ extraHints WRITE setExtraHints NOTIFY extraHintsChanged); // clang-format on QML_NAMED_ELEMENT(NotificationServer); public: void onPostReload() override; [[nodiscard]] bool keepOnReload() const; void setKeepOnReload(bool keepOnReload); [[nodiscard]] bool persistenceSupported() const; void setPersistenceSupported(bool persistenceSupported); [[nodiscard]] bool bodySupported() const; void setBodySupported(bool bodySupported); [[nodiscard]] bool bodyMarkupSupported() const; void setBodyMarkupSupported(bool bodyMarkupSupported); [[nodiscard]] bool bodyHyperlinksSupported() const; void setBodyHyperlinksSupported(bool bodyHyperlinksSupported); [[nodiscard]] bool bodyImagesSupported() const; void setBodyImagesSupported(bool bodyImagesSupported); [[nodiscard]] bool actionsSupported() const; void setActionsSupported(bool actionsSupported); [[nodiscard]] bool actionIconsSupported() const; void setActionIconsSupported(bool actionIconsSupported); [[nodiscard]] bool imageSupported() const; void setImageSupported(bool imageSupported); [[nodiscard]] QVector extraHints() const; void setExtraHints(QVector extraHints); [[nodiscard]] ObjectModel* trackedNotifications() const; signals: /// Sent when a notification is received by the server. /// /// If this notification should not be discarded, set its `tracked` property to true. void notification(Notification* notification); void keepOnReloadChanged(); void persistenceSupportedChanged(); void bodySupportedChanged(); void bodyMarkupSupportedChanged(); void bodyHyperlinksSupportedChanged(); void bodyImagesSupportedChanged(); void actionsSupportedChanged(); void actionIconsSupportedChanged(); void imageSupportedChanged(); void extraHintsChanged(); void trackedNotificationsChanged(); private: void updateSupported(); bool live = false; bool mKeepOnReload = true; NotificationServerSupport support; }; } // namespace qs::service::notifications