Skip to content

fix: avoid notification dbus interface crash in quick fullscreen scre…#809

Merged
deepin-bot[bot] merged 1 commit into
linuxdeepin:release/eaglefrom
LiHua000:release/eagle
Mar 19, 2026
Merged

fix: avoid notification dbus interface crash in quick fullscreen scre…#809
deepin-bot[bot] merged 1 commit into
linuxdeepin:release/eaglefrom
LiHua000:release/eagle

Conversation

@LiHua000

Copy link
Copy Markdown

…enshot

Move save path log to immediately after local file save, and send notifications via direct DBus message call to avoid QDBusInterface construction crashes.

log: fix bug

Bug: https://pms.uniontech.com/bug-view-351229.html

…enshot

Move save path log to immediately after local file save, and send notifications via direct DBus message call to avoid QDBusInterface construction crashes.

log: fix bug

Bug: https://pms.uniontech.com/bug-view-351229.html
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

这段代码主要修改了 quickFullScreenshot 函数中关于 D-Bus 通知的发送逻辑。以下是对该 diff 的详细审查,包括语法逻辑、代码质量、代码性能和代码安全方面的改进意见:

1. 语法逻辑审查

  • 正确性:代码逻辑是正确的。修改前使用 QDBusInterfacecallWithArgumentList,修改后使用 QDBusMessageQDBusConnectioncall 方法,两者在功能上等价,都能正确调用 D-Bus 的 Notify 方法。
  • 连接检查:新增的 if (sessionBus.isConnected()) 检查是一个很好的逻辑补充。修改前的代码如果 D-Bus 未连接,调用可能会失败但没有明确的提示或处理。修改后增加了防御性编程,避免了潜在的崩溃或无响应。
  • 头文件包含:新增了 #include <QDBusConnection>#include <QDBusMessage>,这是必要的,因为代码中显式使用了这两个类。

2. 代码质量审查

  • 代码风格
    • 使用了 QStringLiteral 宏(例如 QStringLiteral("org.freedesktop.Notifications")),这比直接使用 const char*QString 在编译时生成字符串更高效,是很好的 Qt 编码实践。
    • qDebug() 的位置移动:将 qDebug() << "saveFilePath:" << saveFileName; 移到了文件保存操作之后,这比放在通知发送之前更符合逻辑(先确认保存成功,再打印路径)。
  • 可读性:使用 QDBusMessage 的构建方式虽然比 QDBusInterface 稍显繁琐,但更清晰地展示了 D-Bus 调用的三要素(服务名、对象路径、接口名、方法名)。
  • 错误处理:增加了 else 分支打印 qWarning,有助于调试 D-Bus 连接问题。

3. 代码性能审查

  • 异步调用:修改后的代码使用了 sessionBus.call(notifyCall, QDBus::NoBlock)
    • 优点QDBus::NoBlock 意味着这是一个异步调用,函数会立即返回,不会等待通知服务的回复。这对于截图这种即时性操作非常重要,避免了界面卡顿。
    • 对比:原代码 notification.callWithArgumentList(QDBus::AutoDetect, ...) 默认行为通常是阻塞的(取决于具体实现,但 QDBusInterface 的 call 系列方法往往是同步的),这可能会导致 UI 线程在 D-Bus 服务繁忙时短暂冻结。因此,这是一个显著的性能提升
  • 对象创建const QDBusConnection sessionBus = QDBusConnection::sessionBus(); 获取了会话总线的引用。虽然 QDBusConnection 是基于引用计数的共享类,但将其声明为 const 是良好的习惯,表明在该作用域内不打算改变连接对象本身。

4. 代码安全审查

  • D-Bus 安全性:代码调用了标准的 Freedesktop 通知接口,这是桌面环境通用的接口,不存在明显的安全漏洞。
  • 内存安全
    • QDBusMessageQVariantList (arg) 的管理是自动的,符合 Qt 的 RAII 机制,没有内存泄漏风险。
    • QMimeData *imageData = new QMimeData; 这一行在 diff 上下文中存在,需确保后续有对应的 delete 或将其交给 Qt 对象树(如 QApplication::clipboard()->setMimeData(imageData) 会自动接管所有权)。根据上下文 clipboard->setMimeData 会接管所有权,所以是安全的。
  • 防御性编程isConnected() 检查增强了程序的健壮性,防止在无 D-Bus 环境下(如某些服务器环境或极简桌面环境)调用出错。

改进建议

尽管代码已经很不错,但仍有以下微小的优化空间:

  1. 检查 D-Bus 调用结果(可选)
    目前使用了 QDBus::NoBlock,这意味着无法直接获取返回值(通知 ID)。如果应用后续需要根据通知 ID 进行操作(例如替换通知),则需要改为阻塞调用或使用异步回调。但在"快速截图"场景下,忽略返回值通常是可以接受的。

  2. 常量定义
    D-Bus 的服务名、对象路径、接口名等字符串是硬编码的。如果项目中多处使用,建议定义为类的静态常量或匿名命名空间中的常量,以避免拼写错误并便于维护。

    // 在文件顶部或类定义中
    namespace {
        const char DBUS_SERVICE[] = "org.freedesktop.Notifications";
        const char DBUS_PATH[] = "/org/freedesktop/Notifications";
        const char DBUS_INTERFACE[] = "org.freedesktop.Notifications";
    }
    // 使用时
    QDBusMessage::createMethodCall(QStringLiteral(DBUS_SERVICE), ...);
  3. 移除未使用的变量(需检查上下文):
    Diff 中移除了 QDBusInterface notification 的定义,这是正确的。但请确保 QDBusReply 头文件是否仍然需要,如果不再使用 QDBusReply 类,可以移除该头文件以减少编译依赖。

  4. 代码简化
    可以考虑将 D-Bus 调用封装成一个独立的辅助函数(例如 sendSystemNotification(...)),这样 quickFullScreenshot 函数会更简洁,职责更单一。

总结

这段代码修改是正向的优化。主要改进点在于:

  1. 将同步的 D-Bus 调用改为异步(QDBus::NoBlock),提升响应速度。
  2. 增加了 D-Bus 连接状态检查,增强了健壮性。
  3. 调整了日志输出位置,使其更合理。
  4. 使用了 QStringLiteral 优化字符串处理。

建议采纳上述"改进建议"中的第2点(常量定义)以进一步提高代码的可维护性。

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: LiHua000, max-lvs

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

@LiHua000

Copy link
Copy Markdown
Author

/merge

@deepin-bot deepin-bot Bot merged commit 8c92dd8 into linuxdeepin:release/eagle Mar 19, 2026
10 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