Skip to content

Conversation

@yixinshark
Copy link
Contributor

…oard layout

as title

Log: as title
Pms: BUG-317167,BUG-329229

…oard layout

as title

Log: as title
Pms: BUG-317167,BUG-329229
deepin-ci-robot added a commit to linuxdeepin/dde-session-shell-snipe that referenced this pull request Sep 18, 2025
Synchronize source files from linuxdeepin/dde-session-shell.

Source-pull-request: linuxdeepin/dde-session-shell#45
@deepin-ci-robot
Copy link

deepin pr auto review

这段代码主要添加了键盘布局切换的功能,用于在密码认证过程中临时切换到美式键盘布局,认证完成后恢复原来的布局。我来分析一下代码的各个方面:

语法逻辑

  1. 代码逻辑基本清晰,但在键盘布局切换的实现上有一些潜在问题:
    • 使用QProcess::execute而不是QProcess::startAndWait来执行setxkbmap命令,这可能会导致命令执行状态无法被正确捕获
    • setKBLayout函数中没有检查命令执行是否成功
    • m_originalKBLayout变量在多个地方被修改,但没有同步机制

代码质量

  1. 命名规范良好,变量和方法命名清晰
  2. 日志记录适当,使用了适当的日志级别(qCInfo, qCDebug)
  3. 代码结构清晰,相关功能放在一起
  4. 缺少错误处理机制,特别是对于setxkbmap命令执行失败的情况

代码性能

  1. 使用QProcess执行系统命令,性能开销相对较大
  2. 多次调用setxkbmap可能会影响用户体验
  3. 没有对键盘布局变化进行缓存,每次都需要查询系统状态

代码安全

  1. 直接执行系统命令setxkbmap,没有进行参数验证
  2. 如果layout参数包含恶意字符,可能会造成安全风险
  3. 没有对setxkbmap命令的执行结果进行验证

改进建议

  1. 错误处理
void AuthPassword::setKBLayout(const QString &layout)
{
    if (layout.isEmpty()) {
        qCWarning(DDE_SHELL) << "Empty keyboard layout provided";
        return;
    }
    
    qCDebug(DDE_SHELL) << "Set keyboard layout: " << layout;
    QProcess process;
    process.start("/usr/bin/setxkbmap", {layout});
    if (!process.waitForFinished(1000)) { // 设置超时
        qCWarning(DDE_SHELL) << "Failed to set keyboard layout:" << layout;
        return;
    }
    
    if (process.exitCode() != 0) {
        qCWarning(DDE_SHELL) << "setxkbmap failed with exit code:" 
                            << process.exitCode() 
                            << "Error:" << process.readAllStandardError();
    }
}
  1. 性能优化
class AuthPassword {
private:
    QString m_currentKBLayout;  // 添加当前布局缓存
    bool m_layoutChanged;       // 标记布局是否已更改
};
  1. 参数验证
void AuthPassword::setKBLayout(const QString &layout)
{
    // 验证布局名称是否合法
    static const QRegularExpression layoutRegex("^[a-z]{2,3}(_[a-z]{2,3})?(?:,[a-z]{2,3}(_[a-z]{2,3})?)*$");
    if (!layoutRegex.match(layout).hasMatch()) {
        qCWarning(DDE_SHELL) << "Invalid keyboard layout format:" << layout;
        return;
    }
    
    // ... 其余代码
}
  1. 状态管理优化
void AuthPassword::initConnections()
{
    // ... 现有代码
    
    connect(this, &AuthPassword::authFinished, this, [this](const AuthState state) {
        if (state == AS_Success && !m_originalKBLayout.isEmpty()) {
            setKBLayout(m_originalKBLayout);
            m_originalKBLayout.clear();
        }
    });
}
  1. 添加单元测试
    建议为键盘布局相关功能添加单元测试,包括:
  • 正常的键盘布局切换
  • 无效的布局名称处理
  • 命令执行失败的处理
  • 并发情况下的状态管理
  1. 文档完善
    为新增的方法添加注释,说明其用途、参数和可能的异常情况。

这些改进将提高代码的健壮性、安全性和可维护性,同时提供更好的用户体验。

yixinshark pushed a commit to linuxdeepin/dde-session-shell-snipe that referenced this pull request Sep 18, 2025
Synchronize source files from linuxdeepin/dde-session-shell.

Source-pull-request: linuxdeepin/dde-session-shell#45
yixinshark pushed a commit to linuxdeepin/dde-session-shell-snipe that referenced this pull request Sep 18, 2025
Synchronize source files from linuxdeepin/dde-session-shell.

Source-pull-request: linuxdeepin/dde-session-shell#45
@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: waterlovemelon, yixinshark

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@yixinshark yixinshark merged commit 2a50230 into linuxdeepin:master Sep 18, 2025
14 of 15 checks passed
yixinshark pushed a commit to linuxdeepin/dde-session-shell-snipe that referenced this pull request Sep 18, 2025
Synchronize source files from linuxdeepin/dde-session-shell.

Source-pull-request: linuxdeepin/dde-session-shell#45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants