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

可以使用 xpropwmctrl 查看窗口类。


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
相关推荐
曦夜日长2 小时前
Linux系统篇,进程概念(四):内核链表的深度理解、进程优先级的底层理解
linux·运维·服务器·php
‎ദ്ദിᵔ.˛.ᵔ₎2 小时前
Linux 库制作与原理
linux
liulilittle3 小时前
Linux AI 开发环境搭建实录
linux·ai·llm·agent·hyper-v·dev·opencode
高亦真4 小时前
今天是学习嵌入式的第39天
linux·学习·算法
AR-26710-4 小时前
Linux Day8——FHS文件系统层次
linux
qq_297670874 小时前
Ubuntu 打开系统应用老弹密码?三步彻底关闭免密
linux
杨云龙UP4 小时前
DB2 HADR 主备切换实战:SQL1639N 认证问题、备库只读与双向 Takeover
linux·运维·数据库·db2·主备切换·角色互换
半仙白桑5 小时前
内核篇第一讲:linux创建进程
linux·fork·创建进程