#pragma once #include #include #include #include #include #include #include struct PttPortalShortcut { QString id; QVariantMap properties; }; using PttPortalShortcuts = QList; Q_DECLARE_METATYPE(PttPortalShortcut) Q_DECLARE_METATYPE(PttPortalShortcuts) QDBusArgument& operator<<(QDBusArgument& arg, const PttPortalShortcut& shortcut); const QDBusArgument& operator>>(const QDBusArgument& arg, PttPortalShortcut& shortcut); // Wayland PTT: портал владеет сочетаниями и хранит их; приложение владеет сессией. // Один запрос за раз. Подписка на Response устанавливается до вызова метода. class PttPortal : public QObject { Q_OBJECT public: explicit PttPortal(QObject* parent = nullptr, const QString& sessionToken = "utun_vibechat_ptt"); ~PttPortal() override; void initialize(); void configure(const QString& parentWindow); void setInhibited(bool inhibited); QStringList descriptions() const { return m_descriptions; } QString status() const { return m_status; } bool busy() const; signals: void descriptionsChanged(); void statusChanged(); void talkingChanged(bool talking); private slots: void response(uint code, const QVariantMap& results, const QDBusMessage& message); void activated(const QDBusObjectPath& session, const QString& id, qulonglong timestamp, const QVariantMap& options); void deactivated(const QDBusObjectPath& session, const QString& id, qulonglong timestamp, const QVariantMap& options); void shortcutsChanged(const QDBusObjectPath& session, const PttPortalShortcuts& shortcuts); void sessionClosed(); private: enum class State { Idle, Checking, Creating, Listing, Unbound, Binding, Ready, Failed }; void request(const QString& method, const QVariantList& arguments, QVariantMap options); void bind(); void openConfiguration(); void updateDescriptions(const PttPortalShortcuts& shortcuts); void updateTalking(); void setStatus(const QString& text); void fail(const QString& detail); void disconnectRequest(); void closeSession(); static bool isPttId(const QString& id); uint m_epoch = 0; bool m_configureAfterBind = false; State m_state = State::Idle; QString m_sessionToken, m_session, m_request, m_parentWindow, m_status; QStringList m_descriptions = {"", "", ""}; QSet m_active; QTimer m_requestTimer; bool m_configureRequested = false, m_inhibited = false, m_talking = false; };