Ubuntu 打开应用在导航栏没有图标是个齿轮

Ubuntu Dock 应用显示齿轮图标的修复方法

文章目录

  • [Ubuntu Dock 应用显示齿轮图标的修复方法](#Ubuntu Dock 应用显示齿轮图标的修复方法)
    • 问题现象
    • 核心原因
    • [1. 查看当前桌面环境类型](#1. 查看当前桌面环境类型)
    • [2. 查看应用的 WM_CLASS](#2. 查看应用的 WM_CLASS)
    • [3. 也可以使用 xprop 查看](#3. 也可以使用 xprop 查看)
    • [4. 找到应用对应的 .desktop 文件](#4. 找到应用对应的 .desktop 文件)
    • [5. 修改 .desktop 文件](#5. 修改 .desktop 文件)
    • [6. Navicat 示例](#6. Navicat 示例)
    • [7. 更新 desktop 数据库](#7. 更新 desktop 数据库)
    • [8. 重新启动应用](#8. 重新启动应用)
    • [9. Dock 中仍然显示旧图标](#9. Dock 中仍然显示旧图标)
    • [10. 常用排查命令](#10. 常用排查命令)
    • 总结

问题现象

在 Ubuntu 中启动某些应用后,Dock / 导航栏里没有显示应用自己的图标,而是显示一个齿轮或默认图标。

这种情况通常不是图标文件本身有问题,而是 GNOME 无法把"当前运行的窗口"和对应的 .desktop 启动器匹配起来。

常见于:

  • IntelliJ IDEA
  • Navicat
  • AppImage 程序
  • 自己手动解压安装的软件
  • Java / Qt / Electron 等应用

核心原因

Linux 桌面环境会根据窗口的 WM_CLASS 去匹配对应的 .desktop 文件。

如果 .desktop 中缺少:

ini 复制代码
StartupWMClass=xxx

或者 StartupWMClass 与实际窗口的 WM_CLASS 不一致,GNOME 就可能把这个窗口当成一个未知程序,从而显示齿轮或默认图标。


1. 查看当前桌面环境类型

执行:

bash 复制代码
echo $XDG_SESSION_TYPE

如果输出:

text 复制代码
x11

可以使用 xprop 或 wmctrl 查看窗口类。


2. 查看应用的 WM_CLASS

推荐使用:

bash 复制代码
wmctrl -lx

如果没有安装:

bash 复制代码
sudo apt install wmctrl

示例输出:

text 复制代码
0x05400054  0 jetbrains-idea.jetbrains-idea  hostname  IntelliJ IDEA
0x08000017  0 AppRun.AppRun                   hostname  Navicat

中间这一列就是窗口类信息:

text 复制代码
jetbrains-idea.jetbrains-idea
AppRun.AppRun

格式通常可以理解为:

text 复制代码
instance.class

一般 StartupWMClass 使用后面的 class。

例如:

text 复制代码
jetbrains-idea.jetbrains-idea

对应:

ini 复制代码
StartupWMClass=jetbrains-idea

而:

text 复制代码
AppRun.AppRun

对应:

ini 复制代码
StartupWMClass=AppRun

3. 也可以使用 xprop 查看

执行:

bash 复制代码
xprop WM_CLASS

然后点击需要查看的应用窗口。

正常会输出:

text 复制代码
WM_CLASS(STRING) = "jetbrains-idea", "jetbrains-idea"

一般优先使用第二个值:

ini 复制代码
StartupWMClass=jetbrains-idea

如果两个值不同,例如:

text 复制代码
WM_CLASS(STRING) = "idea", "jetbrains-idea"

通常使用:

ini 复制代码
StartupWMClass=jetbrains-idea

4. 找到应用对应的 .desktop 文件

用户自己的启动器通常位于:

bash 复制代码
~/.local/share/applications/

系统级启动器通常位于:

bash 复制代码
/usr/share/applications/

可以通过应用名搜索:

bash 复制代码
grep -Ril "IntelliJ IDEA" \
~/.local/share/applications \
/usr/share/applications 2>/dev/null

也可以根据启动命令搜索:

bash 复制代码
grep -Ril "AppRun" \
~/.local/share/applications \
/usr/share/applications 2>/dev/null

5. 修改 .desktop 文件

例如 IntelliJ IDEA:

ini 复制代码
[Desktop Entry]
Version=1.0
Type=Application
Name=IntelliJ IDEA
Icon=/home/user/software/idea/bin/idea.png
Exec=/home/user/software/idea/bin/idea.sh
StartupWMClass=jetbrains-idea
Terminal=false
Categories=Development;IDE;

关键就是:

ini 复制代码
StartupWMClass=jetbrains-idea

如果:

bash 复制代码
wmctrl -lx

显示:

text 复制代码
AppRun.AppRun

那么:

ini 复制代码
StartupWMClass=AppRun

例如:

ini 复制代码
[Desktop Entry]
Type=Application
Name=Navicat 17 for MySQL
Icon=/home/user/software/navicat/navicat-icon.png
Exec=/home/user/software/navicat/AppRun
StartupWMClass=AppRun
Categories=Development;
Keywords=database;sql;

7. 更新 desktop 数据库

修改完成后执行:

bash 复制代码
update-desktop-database ~/.local/share/applications

如果修改的是系统级 /usr/share/applications,通常不一定需要手动执行,但也可以执行:

bash 复制代码
sudo update-desktop-database /usr/share/applications

8. 重新启动应用

先彻底退出应用。

如果 desktop 文件名为:

text 复制代码
intellij-idea.desktop

可以执行:

bash 复制代码
gtk-launch intellij-idea

注意 gtk-launch 使用的是文件名去掉 .desktop 后的部分。

例如:

text 复制代码
navicat.desktop

对应:

bash 复制代码
gtk-launch navicat

9. Dock 中仍然显示旧图标

如果之前已经把错误的齿轮图标固定到了 Dock:

  1. 右键旧的齿轮图标
  2. 选择"从收藏夹移除"
  3. 完全退出应用
  4. 通过应用菜单或 gtk-launch 重新启动
  5. 确认图标正常
  6. 再右键选择"添加到收藏夹"

10. 常用排查命令

查看桌面类型:

bash 复制代码
echo $XDG_SESSION_TYPE

查看所有窗口类:

bash 复制代码
wmctrl -lx

查看指定窗口的 WM_CLASS:

bash 复制代码
xprop WM_CLASS

搜索 desktop 文件:

bash 复制代码
grep -Ril "应用名" \
~/.local/share/applications \
/usr/share/applications 2>/dev/null

查看 desktop 文件:

bash 复制代码
cat ~/.local/share/applications/xxx.desktop

更新 desktop 数据库:

bash 复制代码
update-desktop-database ~/.local/share/applications

通过 desktop 启动应用:

bash 复制代码
gtk-launch xxx

总结

Ubuntu Dock 中应用显示齿轮或默认图标,本质上通常是:

text 复制代码
运行中的窗口
        ↓
WM_CLASS
        ↓
无法匹配
        ↓
.desktop

解决思路就是:

text 复制代码
wmctrl -lx
    ↓
找到应用的 WM_CLASS
    ↓
找到对应 .desktop
    ↓
添加 StartupWMClass
    ↓
重新启动应用

最关键的一条:

ini 复制代码
StartupWMClass=应用实际的窗口类

例如:

text 复制代码
jetbrains-idea.jetbrains-idea

对应:

ini 复制代码
StartupWMClass=jetbrains-idea
text 复制代码
AppRun.AppRun

对应:

ini 复制代码
StartupWMClass=AppRun
相关推荐
忆挽篱笙歌8 小时前
gdb/cgdb
linux·ubuntu
Julien200410 小时前
管理 Ansible 配置文件
linux·运维·服务器·ssh·学习方法
MicrosoftCloud10 小时前
性能排查 01|free 显示内存用了 90% 就是快满了吗?buff/cache 与 available 一次讲清
linux·运维·内存·free·buff/cache
xiaoye-duck11 小时前
《Linux 网络编程》深入理解 epoll(下):epoll 实战开发与 LT/ET 触发模式深度剖析
linux·网络
成为你的宁宁11 小时前
【Ubuntu 18.04安装Gitlab】
ubuntu·gitlab
峥无11 小时前
Linux线程深度剖析:轻量级进程、虚拟内存分页、进程线程资源对比
linux·运维·mmap
北风催呀催12 小时前
HuggingFace下载镜像加速技巧
linux·huggingface
MicrosoftCloud13 小时前
性能排查 02|vmstat、iostat、mpstat、sar 怎么读?性能四件套的分工与判读阈值
linux·ubuntu·vmstat·性能监控·iostat·sysstat
AR-26710-13 小时前
Linux Day16——日志
linux·运维