diff --git a/src/daemon/Display.cpp b/src/daemon/Display.cpp index ba19de319..9cead7e9b 100644 --- a/src/daemon/Display.cpp +++ b/src/daemon/Display.cpp @@ -67,7 +67,7 @@ namespace SDDM { for(const SessionInfo &s : info) { OrgFreedesktopLogin1SessionInterface session(Logind::serviceName(), s.sessionPath.path(), QDBusConnection::systemBus()); if (desiredTty == session.tTY() && session.state() != QLatin1String("closing")) { - qDebug() << "tty" << desiredTty << "already in use by" << session.user().path << session.state() + qDebug() << "tty" << desiredTty << "already in use by" << session.user().path.path() << session.state() << session.display() << session.desktop() << session.vTNr(); return true; } @@ -183,7 +183,7 @@ namespace SDDM { } const int Display::terminalId() const { - return m_terminalId; + return m_auth->isActive() ? m_sessionTerminalId : m_terminalId; } const QString &Display::name() const { @@ -407,14 +407,14 @@ namespace SDDM { // last session later, in slotAuthenticationFinished() m_sessionName = session.fileName(); - int terminalNewSession = m_terminalId; + int m_sessionTerminalId = m_terminalId; if ((session.type() == Session::WaylandSession && m_displayServerType == X11DisplayServerType) || (m_greeter->isRunning() && m_displayServerType != X11DisplayServerType)) { // Create a new VT when we need to have another compositor running - terminalNewSession = VirtualTerminal::setUpNewVt(); + m_sessionTerminalId = VirtualTerminal::setUpNewVt(); } // some information - qDebug() << "Session" << m_sessionName << "selected, command:" << session.exec() << "for VT" << terminalNewSession; + qDebug() << "Session" << m_sessionName << "selected, command:" << session.exec() << "for VT" << m_sessionTerminalId; QProcessEnvironment env; env.insert(session.additionalEnv()); @@ -428,7 +428,7 @@ namespace SDDM { env.insert(QStringLiteral("XDG_SESSION_CLASS"), QStringLiteral("user")); env.insert(QStringLiteral("XDG_SESSION_TYPE"), session.xdgSessionType()); env.insert(QStringLiteral("XDG_SEAT"), seat()->name()); - env.insert(QStringLiteral("XDG_VTNR"), QString::number(terminalNewSession)); + env.insert(QStringLiteral("XDG_VTNR"), QString::number(m_sessionTerminalId)); #ifdef HAVE_SYSTEMD env.insert(QStringLiteral("XDG_SESSION_DESKTOP"), session.desktopNames()); #endif @@ -457,6 +457,7 @@ namespace SDDM { OrgFreedesktopLogin1ManagerInterface manager(Logind::serviceName(), Logind::managerPath(), QDBusConnection::systemBus()); manager.UnlockSession(m_reuseSessionId); manager.ActivateSession(m_reuseSessionId); + m_started = true; } else { if (qobject_cast(m_displayServer)) m_auth->setCookie(qobject_cast(m_displayServer)->cookie()); diff --git a/src/daemon/Display.h b/src/daemon/Display.h index ee96646ff..fbb4c8272 100644 --- a/src/daemon/Display.h +++ b/src/daemon/Display.h @@ -61,6 +61,7 @@ namespace SDDM { const QString &name() const; QString sessionType() const; + QString reuseSessionId() const { return m_reuseSessionId; } Seat *seat() const; @@ -94,6 +95,7 @@ namespace SDDM { bool m_started { false }; int m_terminalId = 0; + int m_sessionTerminalId = 0; QString m_passPhrase; QString m_sessionName; diff --git a/src/daemon/Seat.cpp b/src/daemon/Seat.cpp index aff17d7a9..ec2bf8ac6 100644 --- a/src/daemon/Seat.cpp +++ b/src/daemon/Seat.cpp @@ -31,6 +31,9 @@ #include #include +#include +#include +#include namespace SDDM { Seat::Seat(const QString &name, QObject *parent) : QObject(parent), m_name(name) { @@ -108,6 +111,14 @@ namespace SDDM { void Seat::displayStopped() { Display *display = qobject_cast(sender()); + OrgFreedesktopLogin1ManagerInterface manager(Logind::serviceName(), Logind::managerPath(), QDBusConnection::systemBus()); + std::optional nextVt; + auto reusing = display->reuseSessionId(); + if (manager.isValid() && !reusing.isEmpty()) { + auto sessionPath = manager.GetSession(reusing); + OrgFreedesktopLogin1SessionInterface sessionIface(Logind::serviceName(), sessionPath.value().path(), QDBusConnection::systemBus()); + nextVt = QStringView(sessionIface.tTY()).mid(3).toInt(); // we need to convert ttyN to N + } // remove display removeDisplay(display); @@ -120,10 +131,14 @@ namespace SDDM { // switch to last display in display vector. // Set vt_auto to true, so let the kernel handle the // vt switch automatically (VT_AUTO). - else { + else if (!nextVt) { int disp = m_displays.last()->terminalId(); if (disp != -1) - VirtualTerminal::jumpToVt(disp, true); + nextVt = disp; + } + + if (nextVt) { + VirtualTerminal::jumpToVt(*nextVt, true); } } }