Skip to content

Feature/Linux 应用监听支持 .desktop 自动刷新与符号链接扫描 - #661

Open
zx1095971114 wants to merge 3 commits into
ZToolsCenter:mainfrom
zx1095971114:feature/linux-refresh-application
Open

Feature/Linux 应用监听支持 .desktop 自动刷新与符号链接扫描#661
zx1095971114 wants to merge 3 commits into
ZToolsCenter:mainfrom
zx1095971114:feature/linux-refresh-application

Conversation

@zx1095971114

Copy link
Copy Markdown

变更内容

本 PR 修复 ZTools 在 Linux 平台上的应用缓存刷新问题,涉及 3 个 commit:

  1. ed4742d Linux 监听 .desktop 文件变化自动刷新应用缓存

    • AppWatcher.getRecursiveWatchPaths()linux 分支返回 getLinuxApplicationPaths()(XDG + Flatpak 导出目录)
    • AppWatcher.shouldIgnore() 新增 linux 分支:放行 .desktop 文件和监听目录下的子目录
    • AppWatcher.bindWatcherEvents() 新增 linux 的 add / unlink 处理,仅 .desktop 文件触发 notifyChange
    • 防抖逻辑已存在,变更沿用 refreshAppsCache()
  2. 9b0ec9e Linux 扫描支持 Flatpak 符号链接 .desktop 文件

    • linuxScanner.scanDesktopDir() 改为 isFile() || isSymbolicLink()
    • linuxScanner.getIconSearchPaths() 加入 Flatpak 图标导出目录(~/.local/share/flatpak/exports/share/icons/var/lib/flatpak/exports/share/icons),确保符号链接应用能显示图标
    • ICON_PREFERRED_SIZES 增加 512x512(Flatpak 常仅导出该尺寸)
    • linuxScanner.findIconPath() 主题遍历兼容符号链接目录(部分发行版 hicolor 是链接)
  3. 36e7169 监听 .desktop / .lnk / .app 文件的内容修改事件

    • AppWatcher.bindWatcherEvents() 补齐 chokidar 的 change 事件处理(之前只监听 add / unlink
    • 按平台只监听对应后缀:Linux .desktop、Windows .lnk、macOS .app
    • change 事件统一调用 notifyChange('add', ...)("内容变化"和"新增"语义一致,由防抖合并多次触发)

动机

Linux 平台此前存在 3 个体验缺陷:

场景 修复前 修复后
安装新 .deb / Flatpak 应用 搜索结果不更新,必须重启 ZTools 实时出现新应用
编辑现有 .desktop 文件(如修改 NoDisplayExec 修改不生效,必须重启 实时刷新
Flatpak 应用(LocalSend / Discord / Steam 等) 完全扫描不到 正常出现在搜索结果中

change 事件修复同样适用于 Windows(.lnk)和 macOS(.app 容器目录),统一了三个平台的语义。

测试覆盖

新增 / 补充单元测试:

  • tests/main/appWatcher.test.ts:补 5 个 change 事件测试

    • Linux .desktop change 路由到防抖 → refreshAppsCache
    • Linux 非 .desktop change 不触发刷新
    • Win32 .lnk change 路由到防抖 → refreshAppsCache
    • Win32 非 .lnk change 不触发刷新
    • macOS .app change 路由到防抖 → refreshAppsCache
  • tests/main/linuxScanner.test.ts(新增):临时目录中放置普通 .desktop 与指向外部文件的符号链接 .desktop,断言两者都能被扫描到

Test Files  2 passed (2)
     Tests  16 passed (16)

手动验证(Linux)

  1. 安装新应用(如 sudo apt install gimpflatpak install flathub org.gimp.GIMP
    • 预期:ZTools 搜索结果 1 秒内出现该应用
  2. 编辑现有 .desktop 文件(如修改 Exec=/usr/bin/firefoxExec=/usr/bin/firefox --new-tab
    • 预期:搜索结果中该应用的 path 实时更新
  3. 检查 /var/lib/flatpak/exports/share/applications/ 下的符号链接 .desktop 应用
    • 预期:出现在搜索结果中,并显示图标

相关 Issue

影响范围

  • Linux:完整支持(自动刷新 + 符号链接)
  • Windows:change 事件补齐(.lnk 修改实时刷新)
  • macOS:change 事件补齐(.app 容器目录修改实时刷新)
  • 其他平台:不受影响

检查清单

  • pnpm typecheck:node 通过
  • pnpm lint(改动文件)通过
  • 单元测试 16/16 通过
  • 提交信息符合 conventional commits 格式(fix: + 详细 body)
  • 新增 / 修改方法均有 JSDoc(含 @param / @returns
  • any 使用
  • 命名规范符合(camelCase / PascalCase / UPPER_SNAKE_CASE)

zx1095971114 and others added 3 commits August 29, 2026 14:04
此前 appWatcher 仅处理 win32(.lnk) 与 darwin(.app),Linux 上
返回空路径列表且忽略所有文件,导致新装 deb/Flatpak 后扫描缓存
不更新,只能重启 ZTools 才能看到新应用。

现在 Linux 平台:
- 递归监听 getLinuxApplicationPaths() 返回的 XDG + Flatpak 目录
- 只关心 .desktop 文件的 add/unlink 事件
- 变更经防抖后调用 refreshAppsCache() 重扫并推送 apps-changed 到渲染端

附带补充 appWatcher Linux 行为的单元测试。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Flatpak 导出目录(/var/lib/flatpak/exports/share/applications 等)中的
.desktop 文件是符号链接,而 scanDesktopDir 用 Dirent.isFile() 过滤——
isFile() 对 symlink 返回 false,导致整个 Flatpak 应用集(如 LocalSend)
永远无法被扫描到,即使路径已加入搜索目录。

修复:
- scanDesktopDir 同时接受 isFile() 与 isSymbolicLink()
- getIconSearchPaths 加入 Flatpak 图标导出目录,使符号链接应用能显示图标
- ICON_PREFERRED_SIZES 增加 512x512(Flatpak 常仅导出该尺寸)
- 主题遍历兼容符号链接目录(部分发行版 hicolor 为链接)

新增 linuxScanner 回归测试:临时目录中分别放置普通 .desktop
与指向外部文件的符号链接 .desktop,断言两者都能被扫描到。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
AppWatcher 只监听了 add 和 unlink,遗漏了 chokidar 的 'change'
事件。Linux 上用户编辑已有 .desktop 文件(例如把 NoDisplay 从
true 改成 false、修改 Exec 字段等)只会触发 change 事件,不会触发
add/unlink,因此 ZTools 的应用缓存永远不会刷新。

按平台添加 change 事件监听:
- Linux: .desktop
- Windows: .lnk
- macOS: .app 容器目录

事件统一调用 notifyChange('add', ...),因为对应用缓存而言,'内容
变化'和'新增'的语义一致(都需要重新扫描条目),由防抖逻辑合并
多次触发。
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.

1 participant