From 84240dd2eaaedc606948d3976c27ed6171ea6cbe Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Thu, 25 Jun 2026 15:46:49 +0800 Subject: [PATCH] fix(shortcut): skip ddm default session when counting display sessions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hasMultipleDisplaySession() counted org.freedesktop.DisplayManager Sessions and treated >= 2 as "multiple users logged in". On Wayland the default display manager (ddm) keeps a dde session alive next to the user session, so a single logged-in user already exposes two sessions (session's UserName is "dde"). This misjudged a single user as multiple sessions, wrongly gating shutdown/suspend confirmation. Query each session's UserName and skip the "dde" session before counting, so only real user sessions are tallied. On X11 there is no such "dde" session, so the filter is a no-op there. hasMultipleDisplaySession() 通过统计 org.freedesktop.DisplayManager 的 Sessions 数量、以 >= 2 判定"多用户登录"。Wayland 下默认使用的 ddm 会在 用户会话之外保留一个dde会话,因此单个用户登录就已经存在两个 session(UserName 为 "dde"),导致单用户被误判为多会话, 错误地拦截了关机/挂起确认。 改为查询每个会话的 UserName,统计前先跳过 "dde" 会话,只计真实 用户会话。X11 下不存在该 "dde" 会话,过滤为空操作。 Log: skip ddm default session when counting display sessions Pms: BUG-366665 Change-Id: I6eac98bf68881b5210945cd647b4d4306ef9a255 --- .../dde-shortcut-tool/powercontroller.cpp | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/plugin-qt/shortcut/tools/dde-shortcut-tool/powercontroller.cpp b/src/plugin-qt/shortcut/tools/dde-shortcut-tool/powercontroller.cpp index 8d1aa0c..52c83e9 100644 --- a/src/plugin-qt/shortcut/tools/dde-shortcut-tool/powercontroller.cpp +++ b/src/plugin-qt/shortcut/tools/dde-shortcut-tool/powercontroller.cpp @@ -237,7 +237,25 @@ bool PowerController::hasMultipleDisplaySession() QVariant v = displayMgr.property("Sessions"); if (!v.isValid()) return false; - return qdbus_cast>(v).size() >= 2; + + const QList sessions = qdbus_cast>(v); + if (!isWaylandSession()) + return sessions.size() >= 2; + + // On Treeland the default display manager (ddm) keeps a default session(dde) + int userSessions = 0; + for (const QDBusObjectPath &path : sessions) { + QDBusInterface session("org.freedesktop.DisplayManager", path.path(), + "org.freedesktop.DisplayManager.Session", + QDBusConnection::systemBus()); + if (!session.isValid()) + continue; + if (session.property("UserName").toString() == QLatin1String("dde")) + continue; + ++userSessions; + } + + return userSessions >= 2; } void PowerController::doPrepareSuspend()