@@ -590,11 +590,12 @@ namespace DDM {
590590 }
591591
592592 auth->setUser (user);
593+ auth->setSessionType (session.type ());
593594 if (m_reuseSessionId.isNull ()) {
594595 auth->setSession (session.exec ());
595596 }
596597 auth->insertEnvironment (env);
597- auth->setSingleMode (m_displayServerType == DisplayServerType::SingleCompositerServerType );
598+ auth->setSingleMode (session. isSingleMode () );
598599 auth->start ();
599600 }
600601
@@ -639,17 +640,51 @@ namespace DDM {
639640 stateConfig.Last .Session .setDefault ();
640641 stateConfig.save ();
641642
642- if (m_displayServerType == DisplayServerType::SingleCompositerServerType ) {
643+ if (auth-> isSingleMode () ) {
643644 auto * server = reinterpret_cast <SingleWaylandDisplayServer*>(m_displayServer);
644645 server->onLoginSucceeded (user);
646+ switchToUser (auth->user ());
645647 } else {
646648 if (m_socket) {
647649 emit loginSucceeded (m_socket, user);
648650 daemonApp->displayManager ()->setLastSession (auth->sessionId ());
649651 }
650- }
651652
652- switchToUser (auth->user ());
653+ disconnect (m_displayServer, &DisplayServer::stopped, this , &Display::stop);
654+ m_displayServer->stop ();
655+ delete m_displayServer;
656+ m_greeter->stop ();
657+ delete m_greeter;
658+ m_currentAuth->stop ();
659+ m_socketServer->stop ();
660+ delete m_socketServer;
661+
662+ m_terminalId = m_sessionTerminalId = fetchAvailableVt ();
663+ m_started = false ;
664+
665+ if (auth->sessionType () == Session::X11Session) {
666+ m_displayServer = new XorgDisplayServer (this );
667+ m_displayServerType = X11DisplayServerType;
668+ } else {
669+ m_displayServer = new WaylandDisplayServer (this );
670+ m_displayServerType = WaylandDisplayServerType;
671+ }
672+ connect (m_displayServer, &DisplayServer::started, this , &Display::displayServerStarted);
673+ connect (m_displayServer, &DisplayServer::stopped, this , &Display::stop);
674+
675+ m_socketServer = new SocketServer (this );
676+
677+ m_greeter = new Greeter (this );
678+ m_greeter->setDisplayServerCommand (auth->session ());
679+ m_greeter->setUser (user);
680+ m_greeter->setSkipAuth ();
681+
682+ connect (m_greeter, &Greeter::failed, this , &Display::stop);
683+ connect (m_greeter, &Greeter::displayServerFailed, this , &Display::displayServerFailed);
684+ connect (m_greeter, &Greeter::succeed, this , &Display::stop);
685+
686+ m_displayServer->start ();
687+ }
653688 }
654689 m_socket = nullptr ;
655690 }
@@ -711,7 +746,8 @@ namespace DDM {
711746 }
712747 }
713748
714- if (status != Auth::HELPER_AUTH_ERROR && m_displayServerType != DisplayServerType::SingleCompositerServerType)
749+ // Don't restart display when ddm-helper crashed (exit code 9)
750+ if (status != Auth::HELPER_AUTH_ERROR && status != Auth::HelperExitStatus (9 ) && m_displayServerType != DisplayServerType::SingleCompositerServerType)
715751 stop ();
716752 }
717753
@@ -730,7 +766,7 @@ namespace DDM {
730766 void Display::slotSessionStarted (bool success) {
731767 qDebug () << " Session started" << success;
732768 Auth* auth = qobject_cast<Auth*>(sender ());
733- if (m_displayServerType == SingleCompositerServerType ) {
769+ if (auth-> isSingleMode () ) {
734770 switchToUser (auth->user ());
735771 }
736772
0 commit comments