@@ -590,11 +590,13 @@ namespace DDM {
590590 }
591591
592592 auth->setUser (user);
593+ auth->setSessionType (session.type ());
594+ auth->setSessionFileName (session.fileName ());
593595 if (m_reuseSessionId.isNull ()) {
594596 auth->setSession (session.exec ());
595597 }
596598 auth->insertEnvironment (env);
597- auth->setSingleMode (m_displayServerType == DisplayServerType::SingleCompositerServerType );
599+ auth->setSingleMode (session. isSingleMode () );
598600 auth->start ();
599601 }
600602
@@ -634,22 +636,61 @@ namespace DDM {
634636 else
635637 stateConfig.Last .User .setDefault ();
636638 if (mainConfig.Users .RememberLastSession .get ())
637- stateConfig.Last .Session .set (auth->session ());
639+ stateConfig.Last .Session .set (auth->sessionFileName ());
638640 else
639641 stateConfig.Last .Session .setDefault ();
640642 stateConfig.save ();
641643
642- if (m_displayServerType == DisplayServerType::SingleCompositerServerType ) {
644+ if (auth-> isSingleMode () ) {
643645 auto * server = reinterpret_cast <SingleWaylandDisplayServer*>(m_displayServer);
644646 server->onLoginSucceeded (user);
647+ switchToUser (auth->user ());
645648 } else {
646649 if (m_socket) {
647650 emit loginSucceeded (m_socket, user);
648651 daemonApp->displayManager ()->setLastSession (auth->sessionId ());
649652 }
650- }
653+ if (auth->identifyOnly ())
654+ return ;
651655
652- switchToUser (auth->user ());
656+ // Stop the original suit of displayServer since it has finished its job.
657+ disconnect (m_displayServer, &DisplayServer::stopped, this , &Display::stop);
658+ m_displayServer->stop ();
659+ delete m_displayServer;
660+ m_greeter->stop ();
661+ delete m_greeter;
662+ m_currentAuth->stop ();
663+ m_socketServer->stop ();
664+ delete m_socketServer;
665+
666+ // Start the target displayServer
667+ m_terminalId = m_sessionTerminalId = fetchAvailableVt ();
668+ m_started = false ;
669+
670+ if (auth->sessionType () == Session::X11Session) {
671+ m_displayServer = new XorgDisplayServer (this );
672+ m_displayServerType = X11DisplayServerType;
673+ } else {
674+ m_displayServer = new WaylandDisplayServer (this );
675+ m_displayServerType = WaylandDisplayServerType;
676+ }
677+ connect (m_displayServer, &DisplayServer::started, this , &Display::displayServerStarted);
678+ connect (m_displayServer, &DisplayServer::stopped, this , &Display::stop);
679+
680+ m_socketServer = new SocketServer (this );
681+
682+ // The greeter here is used to start user session.
683+ m_greeter = new Greeter (this );
684+ m_greeter->setDisplayServerCommand (auth->session ());
685+ m_greeter->setUser (user);
686+ m_greeter->setSkipAuth ();
687+
688+ connect (m_greeter, &Greeter::failed, this , &Display::stop);
689+ connect (m_greeter, &Greeter::displayServerFailed, this , &Display::displayServerFailed);
690+ connect (m_greeter, &Greeter::succeed, this , &Display::stop);
691+
692+ m_displayServer->start ();
693+ }
653694 }
654695 m_socket = nullptr ;
655696 }
@@ -711,7 +752,8 @@ namespace DDM {
711752 }
712753 }
713754
714- if (status != Auth::HELPER_AUTH_ERROR && m_displayServerType != DisplayServerType::SingleCompositerServerType)
755+ // Don't restart display when ddm-helper crashed (exit code 9)
756+ if (status != Auth::HELPER_AUTH_ERROR && status != Auth::HelperExitStatus (9 ) && m_displayServerType != DisplayServerType::SingleCompositerServerType)
715757 stop ();
716758 }
717759
@@ -730,7 +772,7 @@ namespace DDM {
730772 void Display::slotSessionStarted (bool success) {
731773 qDebug () << " Session started" << success;
732774 Auth* auth = qobject_cast<Auth*>(sender ());
733- if (m_displayServerType == SingleCompositerServerType ) {
775+ if (auth-> isSingleMode () ) {
734776 switchToUser (auth->user ());
735777 }
736778
0 commit comments