You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.6 KiB
65 lines
2.6 KiB
#pragma once |
|
|
|
#include <QObject> |
|
#include <QDBusArgument> |
|
#include <QDBusObjectPath> |
|
#include <QDBusMessage> |
|
#include <QSet> |
|
#include <QTimer> |
|
#include <QVariantMap> |
|
|
|
struct PttPortalShortcut { QString id; QVariantMap properties; }; |
|
using PttPortalShortcuts = QList<PttPortalShortcut>; |
|
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<QString> m_active; |
|
QTimer m_requestTimer; |
|
bool m_configureRequested = false, m_inhibited = false, m_talking = false; |
|
};
|
|
|