Ubuntu Dock 点击 Edge 图标总是新建图标的排查与解决
Ubuntu Dock 点击 Edge 图标总是新建图标的排查与解决
在 Ubuntu(GNOME Shell / dash-to-panel)的 Dock 栏中,已将 Microsoft Edge 固定为收藏图标。但每次点击该图标,Edge 会在 Dock 栏另外生成一个新的图标启动,而不是在固定的图标上直接打开窗口。导致 Dock 上出现两个 Edge 图标,体验很差。
背景知识:GNOME 如何通过 .desktop 文件启动应用
GNOME Shell(以及 dash-to-panel / Ubuntu Dock)启动和管理应用的流程如下:
1. 用户点击 Dock 图标 2. Shell.AppSystem 根据 .desktop 文件 ID 查找应用 3. 调用 Shell.App.open_new_window() 4. 底层通过 GAppInfo.launch() 执行 .desktop 中的 Exec= 命令 5. 窗口出现后,Mutter 发出 window-created 信号 6. Shell.WindowTracker 根据窗口的 WM_CLASS 属性反向匹配 .desktop 文件 7. 匹配成功则图标合并到固定的 Dock 图标上,失败则新建图标
第 6 步是问题的关键:WM_CLASS 匹配依赖 .desktop 文件中的 StartupWMClass 字段。
排查过程
第一步:查找系统中所有 Edge 的 .desktop 文件
find /usr/share/applications/ ~/.local/share/applications/ -iname "*edge*"
结果发现系统中存在两个 Edge 主入口文件:
| 文件路径 | StartupWMClass | NoDisplay |
|---|---|---|
microsoft-edge.desktop |
microsoft-edge |
无(默认 false) |
com.microsoft.Edge.desktop |
microsoft-edge |
true |
两个文件的 Exec= 和 StartupWMClass 完全一样,区别仅在于文件名和 NoDisplay 字段。
第二步:理解 NoDisplay=true 的含义
查看 com.microsoft.Edge.desktop 文件,其中有一段关键注释:
# This is the same as microsoft-edge.desktop except NoDisplay=true prevents
# duplicate menu entries. This is required to match the application ID
# used by XDG desktop portal, which has stricter naming requirements.
# The old desktop file is kept to preserve default browser settings.
NoDisplay=true
这段注释说明:
NoDisplay=true会隐藏这个文件,不让它出现在应用菜单中,避免出现两个 Edge 入口。com.microsoft.Edge是 XDG Desktop Portal 要求的反向域名格式应用 ID。- 旧的
microsoft-edge.desktop保留是为了不丢失用户已设置的默认浏览器配置。
第三步:定位根因
Dock 收藏的是 microsoft-edge.desktop(可见的那个)。但当 Edge 窗口创建后,WindowTracker 根据 WM_CLASS=microsoft-edge 去匹配 .desktop 文件时,可能匹配到了另一个文件 com.microsoft.Edge.desktop。
由于两个文件 ID 不同,Dock 认为这是一个不同的应用,于是在固定的图标旁边又新建了一个图标。
解决方案
删除
microsoft-edge.desktop,只保留官方的 com.microsoft.Edge.desktop,并移除其 NoDisplay=true 使它在菜单和 Dock 中正常显示。具体操作
重要提示:操作前请先打开 Edge 浏览器!删除 .desktop 文件后,之前已经打开的 Edge 窗口会与新图标关联。如果先删除再打开,之前打开的窗口可能会丢失或无法归属到新图标上,导致需要手动找回。
1. 备份并删除旧文件:
sudo mv /usr/share/applications/microsoft-edge.desktop \
/usr/share/applications/microsoft-edge.desktop.bak
2. 编辑官方文件,移除 NoDisplay:
sudo sed -i 's/^NoDisplay=true/NoDisplay=false/' \
/usr/share/applications/com.microsoft.Edge.desktop
3. (此步骤非必须,有些桌面会自动处理)更新桌面数据库并重启 GNOME Shell:
sudo update-desktop-database /usr/share/applications/
# 按 Alt+F2 输入 r 回车,重启 GNOME Shell(仅 Xorg)
# Wayland 下需注销重新登录
4. 重新固定 Edge 到 Dock:
右键 Dock 上的 Edge 图标,选择"添加到收藏夹"。
修复后的效果
| 修复前 | 修复后 | |
|---|---|---|
| .desktop 文件 | 两个(冲突) | 一个(唯一) |
| 点击 Dock 图标 | 新生成一个图标 | 在固定图标上打开 |
| XDG Portal | 正常 | 正常(仍用 com.microsoft.Edge) |
| 应用菜单 | 只有一个入口 | 只有一个入口 |
总结
这个问题的根因是 Microsoft Edge 同时安装了两个 .desktop 文件,虽然功能相同,但文件名(即应用 ID)不同。Dock 收藏的是一份,而窗口创建后 WindowTracker 可能匹配到另一份,导致被视为"不同应用"而生成新图标。
解决思路很简单:一个应用只保留一个 .desktop 文件,消除歧义即可。
浙公网安备 33010602011771号