@@ -122,8 +122,9 @@ namespace DDM {
122122 // Create display server
123123 switch (m_displayServerType) {
124124 case X11DisplayServerType:
125- m_terminalId = VirtualTerminal::setUpNewVt ();
126- m_displayServer = new XorgDisplayServer (this );
125+ m_terminalId = m_sessionTerminalId = fetchAvailableVt ();
126+ m_displayServer = new SingleWaylandDisplayServer (m_socketServer, this );
127+ m_greeter->setSingleMode ();
127128 break ;
128129 case X11UserDisplayServerType:
129130 m_terminalId = fetchAvailableVt ();
@@ -590,11 +591,12 @@ namespace DDM {
590591 }
591592
592593 auth->setUser (user);
594+ auth->setSessionType (session.type ());
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
@@ -639,17 +641,51 @@ namespace DDM {
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- }
651653
652- switchToUser (auth->user ());
654+ disconnect (m_displayServer, &DisplayServer::stopped, this , &Display::stop);
655+ m_displayServer->stop ();
656+ delete m_displayServer;
657+ m_greeter->stop ();
658+ delete m_greeter;
659+ m_currentAuth->stop ();
660+ m_socketServer->stop ();
661+ delete m_socketServer;
662+
663+ m_terminalId = m_sessionTerminalId = fetchAvailableVt ();
664+ m_started = false ;
665+
666+ if (auth->sessionType () == Session::X11Session) {
667+ m_displayServer = new XorgDisplayServer (this );
668+ m_displayServerType = X11DisplayServerType;
669+ } else {
670+ m_displayServer = new WaylandDisplayServer (this );
671+ m_displayServerType = WaylandDisplayServerType;
672+ }
673+ connect (m_displayServer, &DisplayServer::started, this , &Display::displayServerStarted);
674+ connect (m_displayServer, &DisplayServer::stopped, this , &Display::stop);
675+
676+ m_socketServer = new SocketServer (this );
677+
678+ m_greeter = new Greeter (this );
679+ m_greeter->setDisplayServerCommand (auth->session ());
680+ m_greeter->setUser (user);
681+ m_greeter->setSkipAuth ();
682+
683+ connect (m_greeter, &Greeter::failed, this , &Display::stop);
684+ connect (m_greeter, &Greeter::displayServerFailed, this , &Display::displayServerFailed);
685+ connect (m_greeter, &Greeter::succeed, this , &Display::stop);
686+
687+ m_displayServer->start ();
688+ }
653689 }
654690 m_socket = nullptr ;
655691 }
@@ -711,7 +747,8 @@ namespace DDM {
711747 }
712748 }
713749
714- if (status != Auth::HELPER_AUTH_ERROR && m_displayServerType != DisplayServerType::SingleCompositerServerType)
750+ // Don't restart display when ddm-helper crashed (exit code 9)
751+ if (status != Auth::HELPER_AUTH_ERROR && status != Auth::HelperExitStatus (9 ) && m_displayServerType != DisplayServerType::SingleCompositerServerType)
715752 stop ();
716753 }
717754
@@ -730,7 +767,7 @@ namespace DDM {
730767 void Display::slotSessionStarted (bool success) {
731768 qDebug () << " Session started" << success;
732769 Auth* auth = qobject_cast<Auth*>(sender ());
733- if (m_displayServerType == SingleCompositerServerType ) {
770+ if (auth-> isSingleMode () ) {
734771 switchToUser (auth->user ());
735772 }
736773
0 commit comments