Skip to content

Conversation

@fly602
Copy link
Contributor

@fly602 fly602 commented Feb 2, 2026

系统空闲黑屏和按电源键黑屏. 由于黑屏需要时间, 导致锁屏先显示出来.
添加少量的延迟修改时序, 先黑屏再锁屏

Log: 解决系统触发黑屏时, 先显示锁屏再黑屏的问题
BUG: PMS-288277
Influence: power

系统空闲黑屏和按电源键黑屏. 由于黑屏需要时间, 导致锁屏先显示出来.
添加少量的延迟修改时序, 先黑屏再锁屏

Log: 解决系统触发黑屏时, 先显示锁屏再黑屏的问题
BUG: PMS-288277
Influence: power
Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @fly602, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@deepin-ci-robot
Copy link

deepin pr auto review

这段代码主要针对电源管理中的"关闭屏幕并锁定"功能进行了时序调整。通过将锁屏操作延迟执行,旨在解决性能较差的机器上黑屏和锁屏操作冲突或延迟的问题。

以下是针对语法逻辑、代码质量、代码性能和代码安全的详细审查意见:

1. 语法逻辑审查

  • 时间单位不一致(严重)

    • keybinding1/special_keycode.go 中,延迟时间设置为 200 * time.Microsecond(微秒)。
    • session/power1/power_save_plan.go 中,延迟时间设置为 200 * time.Millisecond(毫秒)。
    • 问题1 毫秒 = 1000 微秒。第一处代码的延迟时间仅为第二处的 1/1000。200 微秒对于计算机来说几乎可以忽略不计,无法达到"让性能差的机器先黑屏"的预期效果,这很可能是一个笔误。
    • 建议:将 keybinding1/special_keycode.go 中的 time.Microsecond 修改为 time.Millisecond,保持两处逻辑一致。
  • 执行顺序调整

    • 原逻辑:先判断是否锁屏,再关屏。
    • 新逻辑:先执行关屏函数 systemTurnOffScreen(),然后通过定时器延迟执行锁屏。
    • 分析:逻辑上是合理的。通过先触发关屏指令,让系统开始处理显示器的关闭,随后再处理锁屏逻辑,可以避免在锁屏界面加载过程中屏幕才变黑导致的视觉闪烁或卡顿感。

2. 代码质量审查

  • 魔法数字

    • 代码中出现了 2005 这样的数字。
    • 建议:为了提高代码可读性和可维护性,建议将这些硬编码的数字定义为常量。例如:
      const (
          lockDelayDuration = 200 * time.Millisecond
          lockShowTimeout   = 5 * time.Second
      )
  • 注释语言

    • 注释 // 让性能差的机器先黑屏,再锁屏 是中文,虽然符合团队习惯,但在国际化项目中建议统一使用英文,或者确保项目规范允许中文注释。

3. 代码性能审查

  • Goroutine 开销
    • 使用 time.AfterFunc 会启动一个新的 goroutine 来执行延迟函数。
    • 分析:对于这种偶尔触发的电源管理事件,goroutine 的开销完全可以忽略不计。这是一个合理的异步处理方式,不会阻塞主流程(如关屏指令的发送)。

4. 代码安全审查

  • 竞态条件
    • time.AfterFunc 是异步执行的。如果在 200ms 的延迟期间,用户进行了唤醒操作(例如移动鼠标或按键),系统可能会先执行锁屏,导致用户操作被打断。
    • 场景:用户点击"关闭屏幕",立刻改变主意移动鼠标唤醒。此时屏幕刚黑,但 200ms 后锁屏程序启动,强制锁定屏幕。这可能不是用户预期的行为。
    • 建议:虽然这更多是产品逻辑(UX)问题而非代码安全漏洞,但建议在执行锁屏前检查系统状态(如屏幕是否已经被唤醒)。如果屏幕已唤醒,可能需要取消锁屏任务。time.AfterFunc 返回一个 Timer 对象,可以调用 Stop() 方法来取消任务。

改进后的代码示例

针对 keybinding1/special_keycode.go 的修正建议:

// 定义常量
const (
    screenOffToLockDelay = 200 * time.Millisecond
)

// ... 在函数中 ...
case powerActionTurnOffScreen:
    m.systemTurnOffScreen()
    if screenBlackLock {
        // 修正:使用 Millisecond 而不是 Microsecond
        // 可以考虑保存 timer 以便在需要时取消(例如用户立刻唤醒屏幕)
        _ = time.AfterFunc(screenOffToLockDelay, systemLock)
    }

总结

这段代码的修改方向是正确的(异步延迟锁屏以优化体验),但存在明显的时间单位不一致的严重逻辑错误(微秒 vs 毫秒),必须修正。此外,消除魔法数字和考虑用户在延迟期间的操作反馈可以进一步提升代码质量。

@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: fly602, mhduiy

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

@fly602 fly602 merged commit f303f01 into linuxdeepin:master Feb 2, 2026
17 checks passed
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