Skip to content

Commit 1bd71ea

Browse files
committed
fix: greeter could not enter the password after setting a special keyboard layout
无法输入是因为密码输入限制输入字符。而密码输入需要字母,数字,符号等,禁止其他字符,如藏文。 1.检测到设置特殊键盘布局后,修改称us键盘布局 2.认证成功后,恢复原先键盘布局。 Log: as title Pms: BUG-317167
1 parent e10e61a commit 1bd71ea

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

src/session-widgets/lockcontent.cpp

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ void LockContent::init(SessionBaseModel *model)
112112
}
113113

114114
DConfigHelper::instance()->bind(this, SHOW_MEDIA_WIDGET, &LockContent::OnDConfigPropertyChanged);
115+
116+
if (m_model->appType() == AuthCommon::Login && keyboardLayoutHasSpecialSetting()) {
117+
m_originalKBLayout = getCurrentKBLayoutAndVariant();
118+
qCInfo(DDE_SHELL) << "Original keyboard layout:" << m_originalKBLayout;
119+
// 如果是登录界面且键盘布局有特殊设置,则切换到英文键盘布局
120+
setKBLayoutAndVariant("us");
121+
}
115122
}
116123

117124
void LockContent::initUI()
@@ -184,8 +191,13 @@ void LockContent::initConnections()
184191
connect(m_model, &SessionBaseModel::userListChanged, this, &LockContent::onUserListChanged);
185192
connect(m_model, &SessionBaseModel::userListLoginedChanged, this, &LockContent::onUserListChanged);
186193
connect(m_model, &SessionBaseModel::authFinished, this, [this](bool successful) {
187-
if (successful)
194+
if (successful) {
188195
setVisible(false);
196+
if (!m_originalKBLayout.isEmpty()) {
197+
// 切换回原来的键盘布局
198+
setKBLayoutAndVariant(m_originalKBLayout);
199+
}
200+
}
189201
restoreMode();
190202
});
191203
connect(m_model, &SessionBaseModel::MFAFlagChanged, this, [this](const bool isMFA) {
@@ -985,3 +997,53 @@ void LockContent::showShutdown()
985997
m_model->setCurrentModeState(SessionBaseModel::ModeStatus::ShutDownMode);
986998
m_model->setVisible(true);
987999
}
1000+
1001+
// 判断键盘布局是否有特殊设置,如XKBVARIANT=tib(藏文键盘布局),这个配置文件可通过安装器后配置键盘布局修改
1002+
// 如果设置特殊键盘布局,则在greeter阶段会导致无法输入的问题,密码输入框等设置过滤规则(如大小写,数字,符号等)
1003+
bool LockContent::keyboardLayoutHasSpecialSetting() const
1004+
{
1005+
QFile file("/etc/default/keyboard");
1006+
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
1007+
return false;
1008+
1009+
QTextStream in(&file);
1010+
while (!in.atEnd()) {
1011+
QString line = in.readLine().trimmed();
1012+
if (line.startsWith("XKBVARIANT=")) {
1013+
QString val = line.section('=', 1).trimmed();
1014+
if (val.startsWith('"') && val.endsWith('"'))
1015+
val = val.mid(1, val.length() - 2); // Remove quotes
1016+
return !val.trimmed().isEmpty();
1017+
}
1018+
}
1019+
1020+
return false;
1021+
}
1022+
1023+
QString LockContent::getCurrentKBLayoutAndVariant() const
1024+
{
1025+
QProcess p;
1026+
p.start("/usr/bin/setxkbmap", {"-query"});
1027+
p.waitForFinished();
1028+
QString layout, variant;
1029+
1030+
const QString output = QString::fromUtf8(p.readAllStandardOutput());
1031+
for (const QString &line : output.split('\n')) {
1032+
if (line.startsWith("layout:"))
1033+
layout = line.section(':', 1).trimmed();
1034+
else if (line.startsWith("variant:"))
1035+
variant = line.section(':', 1).trimmed();
1036+
}
1037+
1038+
return variant.isEmpty() ? layout : layout + "+" + variant;
1039+
}
1040+
1041+
void LockContent::setKBLayoutAndVariant(const QString &layoutVariant)
1042+
{
1043+
qCInfo(DDE_SHELL) << "Set keyboard layout and variant: " << layoutVariant;
1044+
const QStringList parts = layoutVariant.split('+');
1045+
if (parts.size() == 2)
1046+
QProcess::execute("/usr/bin/setxkbmap", {parts[0], "-variant", parts[1]});
1047+
else if (parts.size() == 1)
1048+
QProcess::execute("/usr/bin/setxkbmap", {parts[0]});
1049+
}

src/session-widgets/lockcontent.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ public slots:
101101
void initFMAWidget();
102102
void initUserListWidget();
103103
void enableSystemShortcut(const QStringList &shortcuts, bool enabled, bool isPersistent);
104+
bool keyboardLayoutHasSpecialSetting() const;
105+
QString getCurrentKBLayoutAndVariant() const;
106+
void setKBLayoutAndVariant(const QString &layoutVariant);
104107

105108
protected:
106109
SessionBaseModel *m_model = nullptr;
@@ -133,6 +136,8 @@ public slots:
133136
bool m_MPRISEnable = false;
134137
bool m_showMediaWidget = false;
135138
bool m_hasResetPasswordDialog = false;
139+
140+
QString m_originalKBLayout;
136141
};
137142

138143
#endif // LOCKCONTENT_H

0 commit comments

Comments
 (0)