Feature/Linux 应用监听支持 .desktop 自动刷新与符号链接扫描 - #661
Open
zx1095971114 wants to merge 3 commits into
Open
Conversation
此前 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', ...),因为对应用缓存而言,'内容
变化'和'新增'的语义一致(都需要重新扫描条目),由防抖逻辑合并
多次触发。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
变更内容
本 PR 修复 ZTools 在 Linux 平台上的应用缓存刷新问题,涉及 3 个 commit:
ed4742dLinux 监听 .desktop 文件变化自动刷新应用缓存AppWatcher.getRecursiveWatchPaths()在linux分支返回getLinuxApplicationPaths()(XDG + Flatpak 导出目录)AppWatcher.shouldIgnore()新增 linux 分支:放行.desktop文件和监听目录下的子目录AppWatcher.bindWatcherEvents()新增 linux 的add/unlink处理,仅.desktop文件触发notifyChangerefreshAppsCache()9b0ec9eLinux 扫描支持 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是链接)36e7169监听 .desktop / .lnk / .app 文件的内容修改事件AppWatcher.bindWatcherEvents()补齐 chokidar 的change事件处理(之前只监听add/unlink).desktop、Windows.lnk、macOS.appnotifyChange('add', ...)("内容变化"和"新增"语义一致,由防抖合并多次触发)动机
Linux 平台此前存在 3 个体验缺陷:
NoDisplay、Exec)change事件修复同样适用于 Windows(.lnk)和 macOS(.app容器目录),统一了三个平台的语义。测试覆盖
新增 / 补充单元测试:
tests/main/appWatcher.test.ts:补 5 个change事件测试.desktopchange 路由到防抖 →refreshAppsCache.desktopchange 不触发刷新.lnkchange 路由到防抖 →refreshAppsCache.lnkchange 不触发刷新.appchange 路由到防抖 →refreshAppsCachetests/main/linuxScanner.test.ts(新增):临时目录中放置普通.desktop与指向外部文件的符号链接.desktop,断言两者都能被扫描到手动验证(Linux)
sudo apt install gimp或flatpak install flathub org.gimp.GIMP).desktop文件(如修改Exec=/usr/bin/firefox为Exec=/usr/bin/firefox --new-tab)/var/lib/flatpak/exports/share/applications/下的符号链接.desktop应用相关 Issue
无
影响范围
.lnk修改实时刷新).app容器目录修改实时刷新)检查清单
pnpm typecheck:node通过pnpm lint(改动文件)通过fix:+ 详细 body)@param/@returns)any使用