From 92b78d1d125c88e85c4937d1fcbe2dc03c421a20 Mon Sep 17 00:00:00 2001 From: deepin-wm Date: Thu, 18 Jun 2026 20:38:46 +0800 Subject: [PATCH] fix: switch user login password input unresponsive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add setLock(true) in lock() for real user branch to immediately set isLocked state 2. The root cause is lock() did not immediately set isLocked, causing keyboard focus not transferred to lock screen QML 3. Downgrade onSessionLock() log from qCWarning to qCDebug for non-active session id branch 4. Add ordering dependency comment in setLock() to prevent re-entry 5. Use Qt.callLater in updateUser() to delay forceActiveFocus until event loop iteration ends Log: Fixed switch user login screen password input unresponsive issue Influence: 1. Test user switching from power management interface 2. Verify password input field gets focus after user selection 3. Test lock/unlock cycle with real user sessions fix: 切换用户登录输入密码无响应 1. 在 lock() 真实用户分支中添加 setLock(true) 立即设置 isLocked 状态 2. 根因是 lock() 未立即设置 isLocked, 导致键盘焦点未转移到锁屏 QML 3. 将 onSessionLock() 中非活跃 session 的日志 从 qCWarning 降级为 qCDebug 4. 在 setLock() 中添加顺序依赖注释防止重入 5. 在 updateUser() 中使用 Qt.callLater 延迟 forceActiveFocus 到事件循环末尾 Log: 修复切换用户登录界面输入密码无响应问题 Influence: 1. 测试从电源管理界面切换用户功能 2. 验证用户选择后密码输入框获得焦点 3. 测试真实用户会话的锁定/解锁循环 --- src/greeter/greeterproxy.cpp | 6 ++++-- src/plugins/lockscreen/qml/UserInput.qml | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/greeter/greeterproxy.cpp b/src/greeter/greeterproxy.cpp index 37defcf7f..521cce88a 100644 --- a/src/greeter/greeterproxy.cpp +++ b/src/greeter/greeterproxy.cpp @@ -137,6 +137,7 @@ void GreeterProxy::setShowShutdownView(bool show) { void GreeterProxy::setLock(bool isLocked) { if (isLocked && !m_isLocked) { + // m_isLocked must be set before m_lockScreen->lock() to prevent re-entry m_isLocked = true; if (m_lockScreen && !m_lockScreen->isVisible()) m_lockScreen->lock(); @@ -242,6 +243,7 @@ void GreeterProxy::lock() } qCInfo(lcTlGreeter) << "Locking user" << session->username() << "with session id" << session->id(); SocketWriter(m_socket) << quint32(GreeterMessages::Lock) << session->id(); + setLock(true); } ////////////////////////////// @@ -347,8 +349,8 @@ void GreeterProxy::onSessionLock() qCWarning(lcTlGreeter) << "Lock signal received for non-exist session id:" << id << ", ignore."; else if (activeSession->id() != id) - qCWarning(lcTlGreeter) - << "Lock signal received for non-active session id:" << id << ", ignore."; + qCDebug(lcTlGreeter) + << "Lock signal received for session id:" << id << ", already locked via lock() call."; else QMetaObject::invokeMethod(this, [this] { setLock(true); diff --git a/src/plugins/lockscreen/qml/UserInput.qml b/src/plugins/lockscreen/qml/UserInput.qml index e368d4904..0e827228a 100644 --- a/src/plugins/lockscreen/qml/UserInput.qml +++ b/src/plugins/lockscreen/qml/UserInput.qml @@ -323,6 +323,7 @@ Item { passwordField.text = '' avatar.fallbackSource = currentUser.icon hintText.text = normalHint + Qt.callLater(function() { passwordField.forceActiveFocus() }) } function startOtherUserMode() {