From 902f94b2d48182bda063fbbe6ad64d24ab19c4c1 Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Thu, 18 Sep 2025 14:41:47 +0800 Subject: [PATCH] fix: Password lineEdit cannot input char after setting a special keyboard layout as title Log: as title Pms: BUG-317167,BUG-329229 --- src/session-widgets/auth_password.cpp | 51 +++++++++++++++++++++++++++ src/session-widgets/auth_password.h | 3 ++ 2 files changed, 54 insertions(+) diff --git a/src/session-widgets/auth_password.cpp b/src/session-widgets/auth_password.cpp index e8c3d956..a9fb4e20 100644 --- a/src/session-widgets/auth_password.cpp +++ b/src/session-widgets/auth_password.cpp @@ -194,7 +194,34 @@ void AuthPassword::initConnections() if (focus && !blockEditSig()) { emit lineEditTextChanged(m_lineEdit->text()); } + + if (focus) { + QString kbLayout = getCurrentKBLayout(); + if (!kbLayout.isEmpty() && !kbLayout.toLower().startsWith("us")) { + m_originalKBLayout = kbLayout; + qCInfo(DDE_SHELL) << "Original keyboard layout:" << m_originalKBLayout; + // 如果键盘布局有特殊设置,则切换到英文键盘布局,认证成功后恢复 + setKBLayout("us"); + } + } else { + if (!m_originalKBLayout.isEmpty()) { + // 切换回原来的键盘布局 + setKBLayout(m_originalKBLayout); + m_originalKBLayout.clear(); + } + } }); + + connect(this, &AuthPassword::authFinished, this, [this](const AuthState state) { + if (state == AS_Success) { + if (!m_originalKBLayout.isEmpty()) { + // 切换回原来的键盘布局 + setKBLayout(m_originalKBLayout); + m_originalKBLayout.clear(); + } + } + }); + connect(m_lineEdit, &DLineEditEx::textChanged, this, [this, blockEditSig](const QString &text) { m_lineEdit->hideAlertMessage(); hidePasswordHintWidget(); @@ -1038,3 +1065,27 @@ void AuthPassword::onReadyToAuthChanged(bool ready) { ready ? emit lineEditTextChanged(m_lineEdit->text()) : emit lineEditTextChanged(""); } + + +QString AuthPassword::getCurrentKBLayout() const +{ + QProcess p; + p.start("/usr/bin/setxkbmap", {"-query"}); + p.waitForFinished(); + + const QString output = QString::fromUtf8(p.readAllStandardOutput()); + for (const QString &line : output.split('\n')) { + if (line.startsWith("layout:")) { + QString layout = line.section(':', 1).trimmed(); + return layout; + } + } + + return {}; +} + +void AuthPassword::setKBLayout(const QString &layout) +{ + qCDebug(DDE_SHELL) << "Set keyboard layout: " << layout; + QProcess::execute("/usr/bin/setxkbmap", { layout}); +} \ No newline at end of file diff --git a/src/session-widgets/auth_password.h b/src/session-widgets/auth_password.h index f970b3f3..abac1956 100644 --- a/src/session-widgets/auth_password.h +++ b/src/session-widgets/auth_password.h @@ -105,6 +105,8 @@ public slots: void showAlertMessage(const QString &text); void hidePasswordHintWidget(); void updatePasswordTextMargins(); + QString getCurrentKBLayout() const; + void setKBLayout(const QString &layout); private: bool m_passwordLineEditEnabled; @@ -126,6 +128,7 @@ public slots: AssistLoginWidget *m_assistLoginWidget; DConfig *m_authenticationDconfig; bool m_canShowPasswordErrorTips; + QString m_originalKBLayout; }; #endif // AUTHPASSWORD_H