Skip to content

fix(launcher): change window layer from Top to Overlay#730

Merged
deepin-bot[bot] merged 1 commit intolinuxdeepin:masterfrom
add-uos:fix/BUG-289261-BUG-343503-window-flags
Mar 12, 2026
Merged

fix(launcher): change window layer from Top to Overlay#730
deepin-bot[bot] merged 1 commit intolinuxdeepin:masterfrom
add-uos:fix/BUG-289261-BUG-343503-window-flags

Conversation

@add-uos
Copy link
Contributor

@add-uos add-uos commented Mar 12, 2026

Change DLayerShellWindow layer from LayerTop to LayerOverlay to fix window display and interaction issues.

将窗口层级从 LayerTop 改为 LayerOverlay,修复窗口显示和交互问题。

Log: 修改启动器窗口层级为 Overlay
PMS: BUG-289261, BUG-343503
Influence: 修复启动器窗口层级问题,确保窗口正确显示和交互。

Change DLayerShellWindow layer from LayerTop to LayerOverlay to fix
window display and interaction issues.

将窗口层级从 LayerTop 改为 LayerOverlay,修复窗口显示和交互问题。

Log: 修改启动器窗口层级为 Overlay
PMS: BUG-289261, BUG-343503
Influence: 修复启动器窗口层级问题,确保窗口正确显示和交互。
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 @add-uos, 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

这段代码修改了 QML 中 DLayerShellWindow 的图层属性,将 layerLayerTop 修改为 LayerOverlay。以下是对该修改的审查意见,涵盖语法逻辑、代码质量、性能和安全性四个方面:

1. 语法逻辑

  • 修改内容:将 DLayerShellWindow.layer 的值从 DLayerShellWindow.LayerTop 变更为 DLayerShellWindow.LayerOverlay
  • 逻辑分析
    • 在 Wayland 合成器(如 KWin)的 Layer Shell 协议中,LayerOverlay 层级高于 LayerTop
    • LayerOverlay 通常用于需要覆盖所有内容(包括锁屏、全屏窗口)的场景,例如屏幕键盘、OSD 提示或全局菜单。
    • 原代码使用 LayerTop,意味着启动器位于普通窗口之上,但会被全屏窗口(如游戏、视频播放器)遮挡。
    • 潜在逻辑风险:将启动器置于 LayerOverlay 层级意味着无论用户是否在全屏应用中操作,只要调用启动器,它都会强制覆盖在全屏内容之上。这符合现代桌面环境(如 macOS、GNOME、Deepin)对"启动器/任务栏"通常"总是置顶"的预期逻辑。因此,逻辑上是合理的。

2. 代码质量

  • 代码规范:代码格式符合 QML 规范,属性赋值清晰。
  • 兼容性:需要确认 DLayerShellWindow 封装的 Wayland 协议版本是否支持 LayerOverlay。如果该封装是基于较新的 Wayland Layer Shell 协议(v4 或更高),则没有问题。如果是旧版本协议,可能不支持此层,导致回退或报错。
  • 建议:确认 DDE (Deepin Desktop Environment) 的具体设计文档,确保启动器确实需要"覆盖全屏窗口"的行为。如果设计意图是"在全屏时自动隐藏",则此修改是错误的;如果设计意图是"类似 macOS 的 Launchpad 覆盖全屏",则此修改是正确的。

3. 代码性能

  • 渲染开销
    • LayerOverlay 层级通常意味着合成器需要更频繁地处理该窗口的重叠和遮挡关系。
    • 然而,对于启动器这种非持续性显示(通常按需打开/关闭)的窗口,性能影响可以忽略不计。
  • 输入处理
    • 配合 KeyboardInteractivityOnDemand(按需获取键盘焦点),性能表现良好,不会因为处于最高层级而持续抢占输入焦点。

4. 代码安全

  • 输入安全
    • 代码中设置了 KeyboardInteractivityOnDemand,这是一个很好的安全实践。它确保了只有当用户明确交互时,启动器才捕获键盘输入,防止处于 LayerOverlay 层级时意外"劫持"全屏应用的键盘事件。
  • 遮挡风险
    • 由于 LayerOverlay 高于锁屏层,理论上启动器可能会显示在锁屏界面上方。需要确保启动器应用本身有逻辑判断,在锁屏状态下禁止显示自身,否则可能造成绕过锁屏的安全隐患(虽然通常显示逻辑由 Shell 控制,但值得注意)。

总结与改进建议

总体评价:该修改旨在让启动器能够覆盖全屏应用,符合现代桌面环境对启动器/启动板的使用习惯。代码修改本身是正确的,且配合了合理的键盘交互策略。

改进建议

  1. 确认锁屏逻辑:确保 Shell 层有逻辑控制,在系统处于锁定状态时,不允许此 DLayerShellWindow 显示,防止安全漏洞。
  2. 确认协议版本:确保底层 Wayland 协议实现支持 LayerOverlay
  3. 文档注释:建议在代码中添加注释,说明为何使用 LayerOverlay(例如:为了确保在全屏游戏或视频播放时也能呼出启动器),以便后续维护者理解意图。
    // Use LayerOverlay to ensure the launcher is visible even over fullscreen windows
    DLayerShellWindow.layer: DLayerShellWindow.LayerOverlay
  4. 测试场景:重点测试在全屏游戏、全屏视频、锁屏界面下呼出启动器的行为是否符合预期。

@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: 18202781743, add-uos

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

@add-uos
Copy link
Contributor Author

add-uos commented Mar 12, 2026

/merge

@deepin-bot deepin-bot bot merged commit 2d86aee into linuxdeepin:master Mar 12, 2026
13 of 14 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