Skip to content

Fix/aibar fashion alignment#1601

Open
shule1987 wants to merge 2 commits into
linuxdeepin:masterfrom
shule1987:fix/aibar-fashion-alignment
Open

Fix/aibar fashion alignment#1601
shule1987 wants to merge 2 commits into
linuxdeepin:masterfrom
shule1987:fix/aibar-fashion-alignment

Conversation

@shule1987
Copy link
Copy Markdown

No description provided.

Keep the fashion mode mail plugin visible without waking the mail client
when no mailbox account is configured, and read CPU and memory usage from
/proc so the monitor plugin reports real values instead of stale fallback
data.

This revision also trims the PR back to dock-focused fashion mode changes
so the GitHub diff stays below the cppcheck action limit, and refreshes the
REUSE/SPDX metadata required by the current CI checks.
@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: shule1987

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

Copy link
Copy Markdown

@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 @shule1987, your pull request is larger than the review limit of 150000 diff characters

@github-actions
Copy link
Copy Markdown

TAG Bot

TAG: 2.0.38
EXISTED: yes
DISTRIBUTION: unstable

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 19, 2026

CLA Assistant Lite bot All contributors have signed the CLA ✍️ ✅

Place the UOS AI dock applet in the right-side fashion-mode group and align its icon spacing with adjacent dock content.
@shule1987 shule1987 force-pushed the fix/aibar-fashion-alignment branch from a82eccc to 4063834 Compare May 19, 2026 03:01
@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

这是一个非常大且复杂的代码变更,主要涉及 DDE Shell Dock(任务栏)的重构和新功能添加。以下是对该 diff 的详细审查意见,分为语法逻辑、代码质量、代码性能和代码安全四个方面。

一、 语法逻辑

  1. QML 组件内部定义与实例化问题

    • 文件: panels/dock/package/FashionLeftDockArea.qml
    • 问题: 在文件底部定义了 component PageShell: Itemcomponent MusicActionButton: Item,但在文件中间的 contentItem 中直接使用了 <PageShell><MusicActionButton> 标签进行实例化。
    • 风险: QML 的 component 内联定义虽然合法,但在某些旧版本的 QML 引擎中,如果组件在实例化之后才被定义,可能会出现找不到组件的警告或运行时错误。建议将内联组件定义移到使用它们的 contentItem 之前,或者抽取为独立的 QML 文件。
  2. QML 属性绑定与状态冲突

    • 文件: panels/dock/package/main.qml
    • 问题: dockRightPart 中同时使用了 anchorsstates (包含 AnchorChanges) 和 Binding 来控制 xwidth 等属性。
    • 风险: 在 QML 中,混合使用锚点、直接属性赋值和 Binding 极易导致属性绑定冲突或被覆盖。特别是 Binding.when 的条件与 State 的条件相同,可能会产生不可预期的行为。
    • 建议: 统一使用一种布局方式。如果必须根据状态改变布局,请完全依赖 StatesAnchorChanges/PropertyChanges,避免使用 Binding
  3. C++ 枚举注册与 QML 使用

    • 文件: panels/dock/constants.h
    • 问题: 新增了 ViewMode 枚举,并使用 Q_ENUM_NS 注册。在 QML 中通过 Dock.FashionMode 等方式访问。
    • 风险: 确保在 QML 引擎启动前,包含该枚举的类或命名空间已经被正确注册(通常通过 qmlRegisterUncreatableType 或在插件初始化时),否则 QML 将无法识别 Dock.FashionMode
  4. DConfig 键值类型不匹配

    • 文件: panels/dock/dconfig/org.deepin.dde.dock.json
    • 问题: View_Mode 的默认值是字符串 "center",但在 docksettings.cpp 中,string2ViewMode 函数需要处理该字符串转换。如果用户手动修改了 DConfig 值为不识别的字符串,当前逻辑会回退到 inferViewMode,这虽然安全,但可能不符合用户预期。
    • 建议: 在 string2ViewMode 中增加对未知值的日志警告,方便调试。
  5. X11 唤醒区域状态管理

    • 文件: panels/dock/x11dockhelper.h / x11dockhelper.cpp
    • 问题: X11DockWakeUpArea 新增了 m_isOpen 状态标志,并在 open()close() 中进行判断。但在 updateDockWakeArea() 中,如果 !m_isOpen 则直接返回。
    • 风险: 如果在 close() 状态下屏幕位置或大小发生变化,updateDockWakeArea 会被调用但直接返回,导致下次 open() 时使用的仍是旧的坐标数据。
    • 建议: 即使在 !m_isOpen 状态下,也应该更新内部的区域计算数据,或者在 open() 时强制触发一次区域更新。

二、 代码质量

  1. 硬编码的 C++ 符号名

    • 文件: panels/dock/fashionleftpluginprovider.cpp
    • 问题: 使用了硬编码的 C++ mangled 名称来解析动态库符号:
      reinterpret_cast<WeatherCodeToDescriptionFunction>(
          weatherDockPluginLibrary().resolve("_ZN17WeatherController24weatherCodeToDescriptionEi"));
    • 风险: 极高的维护风险。一旦 WeatherController 的命名空间、类名或函数签名发生任何变化(即使是编译器更换也可能导致 name mangling 规则不同),这段代码就会在运行时静默失败。
    • 建议: 强烈建议使用 dlsym 配合 extern "C" 导出的函数,或者使用正规的插件机制(如 Qt Plugin)。
  2. 硬编码的文件路径

    • 文件: panels/dock/fashionleftpluginprovider.cpp
    • 问题: 包含大量硬编码的绝对路径,如 /usr/share/icons/..., /usr/lib/dde-dock/plugins/..., /proc/net/route, /sys/class/net/ 等。
    • 风险: 降低了代码的可移植性,且如果系统目录结构变化(如转到 /usr/local 或不同的发行版),代码将失效。
    • 建议: 对于图标路径,使用 Qt 的图标主题系统;对于插件路径,使用编译时定义的宏或配置文件;对于系统信息,尽量使用 Qt 提供的跨平台 API(如 QNetworkInterface)。
  3. 过大的单文件

    • 文件: panels/dock/fashionleftpluginprovider.cpp (新增 4430 行)
    • 问题: 单个源文件过于庞大,包含了天气、邮件、音乐、AI、系统监控等所有逻辑,且内部有大量匿名命名空间中的辅助函数。
    • 建议: 按功能模块拆分。例如,将天气相关逻辑拆分到 WeatherProvider.cpp,音乐相关逻辑拆分到 MusicProvider.cpp 等。
  4. 翻译符号未提取

    • 文件: panels/dock/package/FashionLeftDockArea.qmlfashionleftpluginprovider.cpp
    • 问题: QML 和 C++ 中新增了大量使用 qsTr()QObject::tr() 包裹的字符串,但未更新 .ts 翻译文件。
    • 建议: 运行 lupdate 工具提取新的可翻译字符串,并更新 org.deepin.ds.dock_zh_CN.ts
  5. 符号链接追踪

    • 文件: panels/dock/package/translations/org.deepin.ds.dock_zh_CN.qm
    • 问题: 新增的 .qm 文件是一个符号链接,指向构建目录中的文件 (/home/shule/src/dde-shell/build-run/...)。
    • 风险: 这是一个明显的提交失误,会导致在其他环境或编译后无法找到翻译文件。
    • 建议: 删除此符号链接,确保 .qm 文件是在编译时生成并安装的,或者直接提交二进制 .qm 文件(如果项目习惯如此)。

三、 代码性能

  1. 高频定时器与轮询

    • 文件: panels/dock/fashionleftpluginprovider.h / .cpp
    • 问题: 存在多个高频定时器:
      • m_cursorMonitorTimer 间隔 16ms (约 60fps)
      • m_musicTimer 间隔 1000ms
      • m_statsTimer 间隔 1000ms
      • m_aiTimer 间隔 2000ms
    • 风险: 这些定时器即使在 Dock 隐藏或用户空闲时也在运行,会造成不必要的 CPU 唤醒和功耗。
    • 建议:
      • m_cursorMonitorTimer 应该只在 Dock 可见且鼠标在其附近时启动。
      • 其他数据刷新定时器应考虑在 Dock 隐藏时降低频率或暂停。
  2. 频繁读取 /proc 文件系统

    • 文件: panels/dock/fashionleftpluginprovider.cpp
    • 问题: readCpuTimes, systemMemoryUsagePercent, totalInterfaceBytes 等函数每秒都会读取 /proc/stat, /proc/meminfo, /proc/net/dev
    • 风险: 虽然 /proc 是虚拟文件系统,读取开销不大,但在嵌入式或低性能设备上,频繁的文件 I/O 仍可能产生性能影响。
    • 建议: 考虑使用平台特定的 API(如 sysinfo 系统调用)来获取内存信息,减少文件解析开销。
  3. QML 隐式宽度计算

    • 文件: panels/dock/package/main.qml
    • 问题: adaptiveFashionGridDisplayedWidth 等属性依赖于 gridLayout.implicitWidth,而 implicitWidth 的计算会遍历所有子项。如果在动画或拖拽过程中频繁触发重新计算,可能导致 UI 卡顿。
    • 建议: 确保在 implicitWidth 计算中避免复杂的 JavaScript 运算,必要时使用缓存。

四、 代码安全

  1. 使用 QProcess::startDetached 启动进程

    • 文件: panels/dock/fashionleftpluginprovider.cpp
    • 问题: launchCommand 函数使用 QProcess::startDetached(program, arguments) 启动外部程序。
    • 风险: 如果 programarguments 来自不可信的输入(如 DConfig 配置),可能存在命令注入风险。
    • 建议: 确保 program 路径是硬编码或经过严格校验的绝对路径,避免使用相对路径或从外部直接读取可执行文件名。
  2. LD_PRELOAD 注入

    • 文件: panels/dock/loadtrayplugins.cpp
    • 问题: 为了同步字体,将 libtray_loader_font_sync.so 通过 LD_PRELOAD 注入到托盘插件进程中。
    • 风险: LD_PRELOAD 是一种非常侵入性的技术,可能导致不可预期的行为或安全策略冲突(如 SELinux 可能阻止预加载)。
    • 建议: 评估是否有更温和的方式实现字体同步,例如通过 Wayland 协议传递字体信息,或修改托盘插件源码直接支持字体设置。
  3. X11 窗口操作

    • 文件: panels/dock/dockpanel.cpp / x11dockhelper.cpp
    • 问题: 使用 xdotool 和 XCB 操作窗口,包括 windowactivate, windowraise, xcb_configure_window 等。
    • 风险: 这些操作需要相应的 X11 权限,在受限环境下可能失败。此外,操作其他进程的窗口应确保不会干扰其正常状态。
    • 建议: 添加错误处理和权限检查,确保在 Wayland 环境下这些代码路径不会被执行(目前已有 #if defined(BUILD_WITH_X11) 保护,但 xdotool 的调用没有)。
  4. 读取符号链接目标

    • 文件: panels/dock/fashionleftpluginprovider.cpp
    • 问题: 使用 QFile::symLinkTarget 读取 /proc/[pid]/exe/proc/[pid]/cwd
    • 风险: 在高安全级别的系统上,读取其他进程的 /proc 信息可能需要 root 权限或特定的 CAP_SYS_PTRACE 能力。
    • 建议: 捕获可能的权限错误,并在无法读取时优雅降级。

总结

此次变更引入了大量的新功能(时尚模式、AI 助手、天气、音乐等),重构了 Dock 的布局和隐藏逻辑。代码整体功能完整,但在模块化拆分、硬编码路径/符号、性能优化(定时器轮询)以及 QML 属性绑定冲突方面存在明显的技术债。

建议优先修复 符号链接提交错误QML 组件定义顺序 问题,并逐步重构 fashionleftpluginprovider.cpp 这个超大文件。

@deepin-bot
Copy link
Copy Markdown

deepin-bot Bot commented May 20, 2026

TAG Bot

New tag: 2.0.42
DISTRIBUTION: unstable
Suggest: synchronizing this PR through rebase #1603

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.

2 participants