diff --git a/src/common/Messages.h b/src/common/Messages.h index a587bb4..b26ccd2 --- a/src/common/Messages.h +++ b/src/common/Messages.h @@ -43,7 +43,9 @@ namespace SDDM { PamConvMsg, PamRequest, LoginSucceeded, - LoginFailed + LoginFailed, + NewUser, + NewSession }; enum Capability { diff --git a/src/daemon/Display.cpp b/src/daemon/Display.cpp index c271f8c..301214e --- a/src/daemon/Display.cpp +++ b/src/daemon/Display.cpp @@ -101,6 +101,10 @@ namespace SDDM { return m_seat; } + SocketServer *Display::socketServer() const { + return m_socketServer; + } + bool Display::start() { return m_started || m_displayServer->start(); } diff --git a/src/daemon/Display.h b/src/daemon/Display.h index 7790424..54806b7 --- a/src/daemon/Display.h +++ b/src/daemon/Display.h @@ -53,6 +53,8 @@ namespace SDDM { Seat *seat() const; + SocketServer *socketServer() const; + public slots: void start(); void stop(); diff --git a/src/daemon/DisplayManager.cpp b/src/daemon/DisplayManager.cpp index 55b18bf..80647dd --- a/src/daemon/DisplayManager.cpp +++ b/src/daemon/DisplayManager.cpp @@ -21,6 +21,7 @@ #include "DaemonApp.h" #include "SeatManager.h" +#include "Seat.h" #include "displaymanageradaptor.h" #include "seatadaptor.h" @@ -159,8 +160,13 @@ namespace SDDM { // TODO: IMPLEMENT } - void DisplayManagerSeat::SwitchToUser(const QString &/*user*/, const QString &/*session*/) { - // TODO: IMPLEMENT + void DisplayManagerSeat::SwitchToUser(const QString &user, const QString &session) { + // change user + Seat* seat = daemonApp->seatManager()->getSeat(m_name); + seat->changeUser(user); + + //change session + seat->changeSession(session); } void DisplayManagerSeat::Lock() { diff --git a/src/daemon/Seat.cpp b/src/daemon/Seat.cpp index 966d445..e10a828 --- a/src/daemon/Seat.cpp +++ b/src/daemon/Seat.cpp @@ -19,6 +19,7 @@ ***************************************************************************/ #include "Seat.h" +#include "SocketServer.h" #include "Configuration.h" #include "DaemonApp.h" @@ -133,4 +134,22 @@ namespace SDDM { if (!success) createDisplay(); } + + void Seat::changeUser(const QString &user){ + for (int i = 0; i < m_displays.size(); i++) { + // iterate all displays + SocketServer *socketServer = m_displays.at(i)->socketServer(); + + socketServer->newUser(user); + } + } + + void Seat::changeSession(const QString &session){ + for (int i = 0; i < m_displays.size(); i++) { + // iterate all displays + SocketServer *socketServer = m_displays.at(i)->socketServer(); + + socketServer->newSession(session); + } + } } diff --git a/src/daemon/Seat.h b/src/daemon/Seat.h index 53ab2f2..ababc57 --- a/src/daemon/Seat.h +++ b/src/daemon/Seat.h @@ -33,6 +33,8 @@ namespace SDDM { explicit Seat(const QString &name, QObject *parent = 0); const QString &name() const; + void changeUser(const QString &user); + void changeSession(const QString &session); public slots: void createDisplay(int terminalId = -1); diff --git a/src/daemon/SeatManager.cpp b/src/daemon/SeatManager.cpp index 9c487fb..d81336c --- a/src/daemon/SeatManager.cpp +++ b/src/daemon/SeatManager.cpp @@ -59,4 +59,8 @@ namespace SDDM { // switch to greeter m_seats.value(name)->createDisplay(); } + + Seat* SeatManager::getSeat(const QString &name){ + return m_seats.value(name); + } } diff --git a/src/daemon/SeatManager.h b/src/daemon/SeatManager.h index 21656bb..4c15ab0 --- a/src/daemon/SeatManager.h +++ b/src/daemon/SeatManager.h @@ -37,6 +37,7 @@ namespace SDDM { void removeSeat(const QString &name); void switchToGreeter(const QString &seat); + Seat* getSeat(const QString &seat); signals: void seatCreated(const QString &name); diff --git a/src/daemon/SocketServer.cpp b/src/daemon/SocketServer.cpp index 4df2612..934f5ca --- a/src/daemon/SocketServer.cpp +++ b/src/daemon/SocketServer.cpp @@ -105,6 +105,7 @@ namespace SDDM { void SocketServer::readyRead() { QLocalSocket *socket = qobject_cast(sender()); + m_socket = socket; static const char *logPrefix = "SocketServer: Message received from greeter:"; @@ -209,6 +210,14 @@ namespace SDDM { // from (pam) backend to greeter + void SocketServer::newUser(const QString &user){ + SocketWriter(m_socket) << quint32(DaemonMessages::NewUser) << user; + } + + void SocketServer::newSession(const QString &session){ + SocketWriter(m_socket) << quint32(DaemonMessages::NewSession) << session; + } + void SocketServer::loginFailed(QLocalSocket *socket, const QString &message) { SocketWriter(socket) << quint32(DaemonMessages::LoginFailed) << message; } diff --git a/src/daemon/SocketServer.h b/src/daemon/SocketServer.h index d3cd85b..494fe6e --- a/src/daemon/SocketServer.h +++ b/src/daemon/SocketServer.h @@ -41,6 +41,8 @@ namespace SDDM { void stop(); QString socketAddress() const; + void newUser(const QString &user); + void newSession(const QString &session); private slots: void newConnection(); @@ -63,6 +65,7 @@ namespace SDDM { private: QLocalServer *m_server { nullptr }; + QLocalSocket *m_socket { nullptr }; }; } diff --git a/src/greeter/GreeterProxy.cpp b/src/greeter/GreeterProxy.cpp index e6991a2..96a7eec --- a/src/greeter/GreeterProxy.cpp +++ b/src/greeter/GreeterProxy.cpp @@ -179,6 +179,26 @@ namespace SDDM { input >> message; switch (DaemonMessages(message)) { + case DaemonMessages::NewSession: { + QString session; + + input >> session; + + qDebug() << "Message received from daemon: NewSession" << session; + + emit sessionChange(session); + break; + } + case DaemonMessages::NewUser: { + QString username; + + input >> username; + + qDebug() << "Message received from daemon: NewUser" << username; + + emit userChange(username); + break; + } case DaemonMessages::Capabilities: { // log message qDebug() << "Message received from daemon: Capabilities"; diff --git a/src/greeter/GreeterProxy.h b/src/greeter/GreeterProxy.h index 76f09c9..2d159c0 --- a/src/greeter/GreeterProxy.h +++ b/src/greeter/GreeterProxy.h @@ -84,6 +84,8 @@ namespace SDDM { void canHybridSleepChanged(bool canHybridSleep); // toward qml gui + void userChange(const QString user); + void sessionChange(const QString session); void loginFailed(const QString err_msg); void loginSucceeded(); void pamConvMsg(const QString pam_msg);