Skip to content

fix(shot): hide record button on toolbar under Treeland#855

Merged
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
dengzhongyuan365-dev:bug-fix-5-28
May 29, 2026
Merged

fix(shot): hide record button on toolbar under Treeland#855
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
dengzhongyuan365-dev:bug-fix-5-28

Conversation

@dengzhongyuan365-dev

Copy link
Copy Markdown
Member
  • Add isTreelandMode check before appending recorder button to toolbar layout in initShotLabel()
  • Consistent with existing Treeland gating pattern for mosaic and scrollshot buttons

在截图工具栏初始化时增加 Treeland 环境判断,
当运行在 Treeland 合成器下时不将录屏按钮加入工具栏布局,
与模糊按钮和滚动截图按钮的屏蔽方式保持一致。

Log: Treeland合成器下截图工具栏不再显示录屏功能入口

PMS: TASK-389563

Influence: 截图工具栏在Treeland合成器下不再展示录屏切换按钮

- Add isTreelandMode check before appending recorder button to
  toolbar layout in initShotLabel()
- Consistent with existing Treeland gating pattern for mosaic and
  scrollshot buttons

在截图工具栏初始化时增加 Treeland 环境判断,
当运行在 Treeland 合成器下时不将录屏按钮加入工具栏布局,
与模糊按钮和滚动截图按钮的屏蔽方式保持一致。

Log: Treeland合成器下截图工具栏不再显示录屏功能入口

PMS: TASK-389563

Influence: 截图工具栏在Treeland合成器下不再展示录屏切换按钮
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

你好!我是CodeGeeX,你的智能编程助手。我已经仔细审查了你提供的Git Diff代码。这段代码的主要意图是在 TreeLand 环境下暂时屏蔽录屏功能。

以下是我从语法逻辑、代码质量、代码性能和代码安全四个维度进行的详细审查和改进建议:

1. 语法与逻辑

  • 严重的缩进与作用域问题(subtoolwidget.cpp):
    subtoolwidget.cpp 的修改中,新增的 if (!(Utils::isTreelandMode)) 语句没有使用大括号 {},并且与下方代码的缩进存在严重的对齐问题。原代码中 m_recorderButton->setFixedSizeinstallTipHintbtnList.appendconnect 的缩进看起来像是属于某个代码块(或者原本就是错误的缩进),现在直接在中间插入了一个 if 判断,会导致逻辑错误极其混乱的代码流

    • 问题分析: 如果不加大括号,if 仅仅作用于 btnList.append(m_recorderButton); 这一行。而 connect 信号槽的代码依然会无条件执行。虽然在 UI 上隐藏了按钮,但信号槽依然连接,如果通过其他途径(如快捷键或代码)触发了该按钮的 clicked 信号,依然会执行录屏逻辑,这违背了“屏蔽录屏功能”的初衷。
    • 改进意见: 强烈建议使用大括号 {} 明确 if 的作用域,并将相关的初始化、UI添加和信号槽连接全部包裹在内。
  • 逻辑运算符风格:
    if (!(Utils::isTreelandMode)) 使用了 ! 逻辑非,建议改为 if (!Utils::isTreelandMode),去掉内部多余的括号,更符合C++的编码习惯。另外,isTreelandMode 看起来像是一个变量,如果是变量,建议命名为 isTreelandMode(布尔变量通常不加额外前缀,或者加 b/is 前缀);如果是函数,应加上括号 isTreelandMode()

2. 代码质量

  • 注释与代码不一致(subtoolwidget.cpp):
    注释写着 // TODO:treeland暂时屏蔽录屏功能,这是很好的实践。但原注释 // TreeLand环境下现在已支持录屏功能 如果不再适用,应该直接删除,而不是留两行意思相反的注释,这会让后续维护者产生困惑。
  • 硬编码字符串:
    main_window.cpp 中的 launchMode == "screenRecord" 使用了硬编码字符串。建议将其定义为常量(如 const QString LAUNCH_MODE_SCREEN_RECORD = "screenRecord";)或枚举,避免魔法字符串,提高可维护性。
  • 代码复用与耦合:
    目前在 MainWindowSubToolWidget 两个地方都使用了 Utils::isTreelandMode 进行判断。如果将来 TreeLand 环境支持了录屏,你需要同时修改这两个地方。建议将这种环境特性的判断封装到统一的配置管理类中,或者通过传参控制 UI 的生成,减少全局状态的散落。

3. 代码性能

  • 无明显性能问题:
    这里的修改仅仅是增加了一个布尔变量的条件判断,属于 O(1) 操作,对性能几乎没有影响。Utils::isTreelandMode 如果只是读取一个全局变量或缓存过的环境变量,性能是完全没问题的。但如果它每次都需要执行系统调用或读取配置文件来判断,则建议将其结果缓存。

4. 代码安全

  • 状态不一致导致的逻辑漏洞:
    如前面语法逻辑中提到的,如果 SubToolWidget 中仅仅是不把按钮加入 btnList,但 connect 依然执行,或者 MainWindow::initLaunchMode 中虽然阻止了初始化,但录屏相关的快捷键、DBus 接口等没有完全封堵,可能会导致在 TreeLand 模式下用户通过其他途径触发录屏,从而引发未定义行为或崩溃。安全/稳定性的核心原则是:不仅要在 UI 上屏蔽,还要在逻辑入口彻底拦截。

改进后的代码建议

基于以上分析,我为你重构了这部分代码:

src/main_window.cpp

 void MainWindow::initLaunchMode(const QString &launchMode)
 {
     qCDebug(dsrApp) << "initLaunchMode";
     m_functionType = status::shot;
     // 建议将 "screenRecord" 提取为常量,这里暂保持原样
     // 逻辑上:只有在非 TreeLand 模式下,才允许进入录屏初始化分支
     if (launchMode == "screenRecord" && !Utils::isTreelandMode) {
         qCDebug(dsrApp) << "initLaunchMode screenRecord";
         m_sizeTips->setRecorderTipsInfo(true);
         m_sizeTips->updateTips(QPoint(recordX, recordY), QSize(recordWidth, recordHeight));
     }
     // ... 其他逻辑
 }

src/widgets/subtoolwidget.cpp

     // 删除旧的无用注释:// TreeLand环境下现在已支持录屏功能
     // TODO: TreeLand暂时屏蔽录屏功能,待功能完善后移除此判断
     m_recorderButton = new ToolButton();
     m_recorderButton->setCheckable(false);
     m_recorderButton->setIconSize(TOOL_ICON_SIZE);
     m_recorderButton->setNormalIcon(":/icons/deepin/builtin/normal_icons/record_normal.svg");
     Utils::setAccessibility(m_recorderButton, AC_SUBTOOLWIDGET_RECORDER_BUTTON);
     m_recorderButton->setFixedSize(TOOL_BUTTON_SIZE); // 修正了原有的缩进问题
     installTipHint(m_recorderButton, tr("Record"));

     // 使用大括号明确作用域,确保 UI 隐藏的同时,信号槽也不进行连接
     if (!Utils::isTreelandMode) {
         btnList.append(m_recorderButton);
         connect(m_recorderButton, &ToolButton::clicked, this, [ = ] {
             m_pMainWindow->getToolBarPoint();
             // ... 其他录屏相关逻辑
         });
     }

总结: 最核心的修改点是必须给 subtoolwidget.cpp 中的 if 加上大括号,并将 connect 包含进去,否则会导致隐蔽的逻辑漏洞。希望这些审查意见对你有所帮助!

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: dengzhongyuan365-dev, lzwind

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

@dengzhongyuan365-dev

Copy link
Copy Markdown
Member Author

/forcemerge

@deepin-bot

deepin-bot Bot commented May 29, 2026

Copy link
Copy Markdown
Contributor

This pr force merged! (status: unstable)

@deepin-bot deepin-bot Bot merged commit 13ac4bb into linuxdeepin:master May 29, 2026
8 of 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