#pragma once #include #include #include #include #include #include #include ///! State of the Greetd connection. /// See @@Greetd.state. class GreetdState: public QObject { Q_OBJECT; QML_ELEMENT; QML_SINGLETON; public: enum Enum : quint8 { Inactive = 0, Authenticating = 1, ReadyToLaunch = 2, Launching = 3, Launched = 4, }; Q_ENUM(Enum); Q_INVOKABLE static QString toString(GreetdState::Enum value); }; class GreetdConnection: public QObject { Q_OBJECT; public: void createSession(QString user); void cancelSession(); void respond(QString response); void launch(const QList& command, const QList& environment, bool exit); [[nodiscard]] bool isAvailable() const; [[nodiscard]] GreetdState::Enum state() const; [[nodiscard]] QString user() const; static GreetdConnection* instance(); signals: void authMessage(QString message, bool error, bool responseRequired, bool echoResponse); void authFailure(QString message); void readyToLaunch(); void launched(); void error(QString error); void stateChanged(); void userChanged(); private slots: void onSocketConnected(); void onSocketError(QLocalSocket::LocalSocketError error); void onSocketReady(); private: explicit GreetdConnection(); void sendRequest(const QJsonObject& json); void setActive(bool active); void setInactive(); bool mAvailable = false; GreetdState::Enum mState = GreetdState::Inactive; bool mTargetActive = false; bool mExitAfterLaunch = false; QString mMessage; bool mResponseRequired = false; QString mUser; QLocalSocket socket; };