diff --git a/misc/dbus/org.deepin.compositor1.xml b/misc/dbus/org.deepin.compositor1.xml
index 2fa81fa0a6..e2e0312f72 100644
--- a/misc/dbus/org.deepin.compositor1.xml
+++ b/misc/dbus/org.deepin.compositor1.xml
@@ -11,5 +11,7 @@
+
+
diff --git a/src/core/treeland.cpp b/src/core/treeland.cpp
index 81e1c5b6b4..7ffe00bbdf 100644
--- a/src/core/treeland.cpp
+++ b/src/core/treeland.cpp
@@ -370,6 +370,7 @@ class Compositor1Adaptor: public QDBusAbstractAdaptor
" \n"
" \n"
" \n"
+ " \n"
" \n"
"")
public:
@@ -396,6 +397,7 @@ public Q_SLOTS: // METHODS
Q_SIGNALS: // SIGNALS
void SessionChanged();
+ void XWaylandAuthChanged();
};
Treeland::Treeland()
diff --git a/src/core/treeland.h b/src/core/treeland.h
index 9443854f85..5b38ab9039 100644
--- a/src/core/treeland.h
+++ b/src/core/treeland.h
@@ -44,6 +44,7 @@ class Treeland
Q_SIGNALS:
void socketDisconnected();
void SessionChanged();
+ void XWaylandAuthChanged();
public Q_SLOTS:
bool ActivateWayland(QDBusUnixFileDescriptor fd);
diff --git a/src/seat/helper.cpp b/src/seat/helper.cpp
index 1016c935d4..694e3ad038 100644
--- a/src/seat/helper.cpp
+++ b/src/seat/helper.cpp
@@ -1968,6 +1968,10 @@ void Helper::init(Treeland::Treeland *treeland)
{
m_treeland = treeland;
connect(m_sessionManager, &SessionManager::sessionChanged, treeland, &Treeland::Treeland::SessionChanged);
+ connect(m_sessionManager,
+ &SessionManager::xwaylandAuthChanged,
+ treeland,
+ &Treeland::Treeland::XWaylandAuthChanged);
auto engine = qmlEngine();
m_greeterProxy = engine->singletonInstance("Treeland", "GreeterProxy");
diff --git a/src/session/session.cpp b/src/session/session.cpp
index 699f73a215..d0bdb58c7d 100644
--- a/src/session/session.cpp
+++ b/src/session/session.cpp
@@ -295,6 +295,7 @@ std::shared_ptr SessionManager::ensureSession(int id, QString username)
xwayland->setOwnsSocket(socket);
// Connect signals
connect(xwayland, &WXWayland::ready, this, [this, xwayland] {
+ Q_EMIT xwaylandAuthChanged();
syncActiveSessionXWaylandPrimaryOutput();
if (auto session = sessionForXWayland(xwayland)) {
session->m_noTitlebarAtom =
diff --git a/src/session/session.h b/src/session/session.h
index 59bd1494ef..36a44c01e0 100644
--- a/src/session/session.h
+++ b/src/session/session.h
@@ -89,6 +89,7 @@ class SessionManager : public QObject {
Q_SIGNALS:
void socketFileChanged();
void sessionChanged();
+ void xwaylandAuthChanged();
private:
std::shared_ptr ensureSession(int id, QString username);
diff --git a/src/systemd-socket.cpp b/src/systemd-socket.cpp
index 672809df00..bcc89d84d4 100644
--- a/src/systemd-socket.cpp
+++ b/src/systemd-socket.cpp
@@ -57,11 +57,6 @@ class SocketActivator : public QObject
if (!test.isValid())
return false;
- if (m_type == "xwayland") {
- m_compositorBus = busFromConnection(connection);
- return true;
- }
-
return connectActivationSignal(connection);
}
@@ -264,12 +259,19 @@ public Q_SLOTS:
if (m_compositorBus == bus)
return true;
+ // Xwayland only has to react to auth refreshes. Its display number and
+ // the XAUTHORITY path survive a wlroots in-place Xwayland restart, so
+ // a session change does not affect it and must not re-run activation.
+ const QString signalName = m_type == "xwayland"
+ ? QStringLiteral("XWaylandAuthChanged")
+ : QStringLiteral("SessionChanged");
+
if (m_compositorBus.has_value()) {
auto oldConnection = dbusConnection(*m_compositorBus);
oldConnection.disconnect("org.deepin.Compositor1",
"/org/deepin/Compositor1",
"org.deepin.Compositor1",
- QStringLiteral("SessionChanged"),
+ signalName,
this,
SLOT(activate()));
m_compositorBus.reset();
@@ -278,7 +280,7 @@ public Q_SLOTS:
if (connection.connect("org.deepin.Compositor1",
"/org/deepin/Compositor1",
"org.deepin.Compositor1",
- QStringLiteral("SessionChanged"),
+ signalName,
this,
SLOT(activate()))) {
m_compositorBus = bus;