Группа :: Графические оболочки/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);