diff --git a/debian/changelog b/debian/changelog index 692bc22..a79b2ea 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +ddm (0.1.8) unstable; urgency=medium + + * limit treeland restart to 3 + + -- Dingyuan Zhang Fri, 13 Dec 2024 10:44:00 +0800 + ddm (0.1.7) unstable; urgency=medium * fix black screen when user activate session diff --git a/src/daemon/Display.cpp b/src/daemon/Display.cpp index d21cf25..c116bc2 100644 --- a/src/daemon/Display.cpp +++ b/src/daemon/Display.cpp @@ -169,6 +169,11 @@ namespace DDM { stop(); }); connect(m_greeter, &Greeter::displayServerFailed, this, &Display::displayServerFailed); + connect(m_greeter, &Greeter::greeterStarted, this, [this] { + if (m_currentAuth) { + switchToUser(m_currentAuth->user()); + } + }); } Display::~Display() { @@ -588,6 +593,7 @@ namespace DDM { Q_ASSERT(auth && auth->identifyOnly() == identifyOnly); + m_currentAuth = auth; m_greeter->setUserActivated(success); if (success) { @@ -663,6 +669,10 @@ namespace DDM { // error happens (in this case we want to show the message from the // greeter + if (m_currentAuth == auth) { + m_currentAuth = nullptr; + } + m_auths.removeOne(auth); auth->deleteLater(); diff --git a/src/daemon/Display.h b/src/daemon/Display.h index 4ec2849..e44e7ce 100644 --- a/src/daemon/Display.h +++ b/src/daemon/Display.h @@ -109,6 +109,7 @@ namespace DDM { QString m_reuseSessionId; QVector m_auths; + Auth* m_currentAuth { nullptr }; DisplayServer *m_displayServer { nullptr }; Seat *m_seat { nullptr }; SocketServer *m_socketServer { nullptr }; diff --git a/src/daemon/Greeter.cpp b/src/daemon/Greeter.cpp index 568a5e4..c832b4f 100644 --- a/src/daemon/Greeter.cpp +++ b/src/daemon/Greeter.cpp @@ -32,6 +32,7 @@ #include "WaylandDisplayServer.h" #include "PowerManager.h" +#include #include #include #include @@ -40,9 +41,15 @@ namespace DDM { Greeter::Greeter(Display *parent) : QObject(parent) , m_display(parent) + , m_tryTimer(new QTimer(this)) { m_metadata = new ThemeMetadata(QString()); m_themeConfig = new ThemeConfig(QString()); + + connect(m_tryTimer, &QTimer::timeout, this, &Greeter::greeterStarted); + + m_tryTimer->setSingleShot(true); + m_tryTimer->setInterval(500); } Greeter::~Greeter() { @@ -243,6 +250,8 @@ namespace DDM { m_auth->setSession(cmd.join(QLatin1Char(' '))); m_auth->setSingleMode(m_singleMode); m_auth->start(); + + m_tryTimer->start(); } // return success @@ -322,7 +331,8 @@ namespace DDM { } void Greeter::onHelperFinished(Auth::HelperExitStatus status) { - if (m_singleMode) { + if (m_singleMode && m_currentRetry <= m_maxRetry) { + m_currentRetry += 1; qDebug() << "Restart treeland"; QString displayServerCmd = m_displayServerCmd; if (!m_userActivated) { @@ -330,6 +340,12 @@ namespace DDM { } m_auth->setDisplayServerCommand(displayServerCmd); m_auth->start(); + + if (m_tryTimer->isActive()) { + m_tryTimer->stop(); + } + + m_tryTimer->start(); return; } diff --git a/src/daemon/Greeter.h b/src/daemon/Greeter.h index 1db6a96..ed4e3a6 100644 --- a/src/daemon/Greeter.h +++ b/src/daemon/Greeter.h @@ -25,6 +25,7 @@ #include "Auth.h" class QProcess; +class QTimer; namespace DDM { class Display; @@ -66,11 +67,13 @@ namespace DDM { void ttyFailed(); void failed(); void displayServerFailed(); + void greeterStarted(); private: bool m_started { false }; bool m_singleMode { false }; bool m_userActivated { false }; + int m_currentRetry { 0 }; int m_maxRetry{ 3 }; Display * const m_display { nullptr }; @@ -82,6 +85,7 @@ namespace DDM { Auth *m_auth { nullptr }; QProcess *m_process { nullptr }; + QTimer *m_tryTimer { nullptr }; static void insertEnvironmentList(QStringList names, QProcessEnvironment sourceEnv, QProcessEnvironment &targetEnv); };