Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37040847
en ru br
Репозитории ALT

Группа :: Графические оболочки/KDE
Пакет: sddm

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: alt-dbus-sessionchange.patch
Скачать


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<QLocalSocket *>(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);
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin