当前位置: 首页 > news >正文

完美解决 Ubuntu 中自定义启动器图标重复的问题(以 MATLAB 为例)

如果你在 Ubuntu 上为 MATLAB、PyCharm、Android Studio 或其他第三方应用创建了自定义启动器,并把它固定到了左侧的 Dock 栏,你很可能遇到过这个令人抓狂的场景:

当你满心欢喜地点击固定的图标启动程序后,Dock 栏上竟然“凭空”冒出了第二个一模一样的图标来代表正在运行的程序!

[一张动图或截图,清晰地展示了点击固定的 MATLAB 图标后,旁边弹出了另一个代表运行中程序的 MATLAB 图标]

这不仅破坏了 Dock 栏的整洁,也让“添加到收藏夹”这个功能变得毫无意义。这感觉就像你邀请一位客人(MATLAB)来参加派对,结果他进门后,管家(GNOME 桌面)不认识他,又给他发了一个新的临时名牌。

别担心,这并不是 Bug,而是可以完美解决的“身份识别”问题。今天,我们就以 MATLAB 为例,彻底根治这个“双图标”顽疾。

问题根源:启动器与窗口的“身份识别危机”

简单来说,当一个应用程序运行时,它的窗口会向桌面系统报告一个自己的“身份ID”,这个 ID 叫做 WM_CLASS (Window Manager Class)。

而我们创建的 .desktop 启动文件,就像一个静态的快捷方式。默认情况下,桌面系统不知道这个快捷方式应该对应哪个窗口的 WM_CLASS。因此,当程序启动时,系统看到一个它不认识的 WM_CLASS 窗口,就认为这是一个“新程序”,并为它生成了一个临时的图标。

我们的任务就是:找到 MATLAB 窗口的真实 WM_CLASS,然后明确地告诉启动器:“你启动后,应该和这个 WM_CLASS 的窗口合并!”


解决方案:三步搞定

第 1 步:扮演侦探,找到窗口的真实 WM_CLASS

这是最关键的一步。我们需要一个名为 xprop 的小工具,它能帮我们查询窗口的各种属性。

  1. 首先,正常启动 MATLAB。让那个重复的、代表运行中程序的图标出现在 Dock 栏上。

  2. 打开一个新的终端(快捷键 Ctrl + Alt + T)。

  3. 输入以下命令并按回车。此时,你的鼠标光标会变成一个十字准星(+

    xprop WM_CLASS
    
  4. 将这个十字准星光标,移动到 MATLAB 程序的主窗口上(注意!是点击程序窗口本身,不是 Dock 栏上的图标),然后单击鼠标左键

  5. 终端会立刻返回一行信息,这就是我们需要的“身份ID”。对于新版的 MATLAB,你可能会看到类似下面的输出:

    WM_CLASS(STRING) = "Matlab-GLEE", "MATLAB R2025a"
    

这里的 "MATLAB R2025a" 就是我们需要的、独一无二的 WM_CLASS!我们通常选择第二个字符串,因为它更具体,更具代表性。

第 2 步:更新 .desktop 文件,为启动器“正名”

现在,我们要把找到的 WM_CLASS 添加到一个叫做 StartupWMClass 的字段里。

  1. 用文本编辑器打开你之前创建的 matlab.desktop 文件。

    # 路径可能因人而异,这里以放在用户个人目录为例
    nano ~/.local/share/applications/matlab.desktop
    
  2. 在文件末尾,添加新的一行 StartupWMClass=...。请确保填写的值与你刚刚查到的完全一致

    [Desktop Entry]
    Type=Application
    Name=MATLAB
    Comment=MATLAB R2025a
    Exec=/home/lz/Programs/MATLAB/R2025a/bin/matlab -desktop
    Icon=/home/lz/Pictures/matlab.png
    Terminal=false
    Categories=Development;Math;# ↓↓↓ 这是我们添加的关键一行 ↓↓↓
    # 它将启动器和实际运行的窗口关联起来
    StartupWMClass=MATLAB R2025a
    
  3. 保存文件并退出编辑器 (在 nano 中是 Ctrl + X -> Y -> Enter)。

第 3 步:重启桌面,见证奇迹

为了让桌面环境(GNOME Shell)加载我们修改后的配置,最简单可靠的方法是注销当前用户再重新登录

重新登录后,再次点击你固定在 Dock 栏上的 MATLAB 图标。

[一张动图或截图,展示了点击固定的 MATLAB 图标后,该图标下方出现一个运行指示点,没有再弹出新图标]

你会发现,这一次,程序启动后完美地“吸附”到了你固定的图标上,只在图标下方出现一个表示正在运行的小圆点。那个烦人的重复图标,彻底消失了!

结语与延伸

这个利用 xprop 查找 WM_CLASS 并配置 StartupWMClass 的方法,是 Linux 桌面自定义的“必杀技”。它不仅仅适用于 MATLAB,对于解决以下这些应用的图标重复问题同样有效:

  • JetBrains 全家桶 (PyCharm, IntelliJ IDEA, WebStorm…)
  • EclipseAndroid Studio
  • 其他任何用 Java (Swing/AWT)、Qt 或非原生 GTK 工具包编写的第三方软件

掌握了这个技巧,你就能让任何“外来”的应用都像原生程序一样,与你的 Ubuntu 桌面完美融合。现在,去享受你那整洁、有序、不再逼死强迫症的 Dock 栏吧!

http://www.lryc.cn/news/593492.html

相关文章:

  • nginx.conf模版
  • 基于GEE与哨兵2号的土地覆盖分类方法及实现
  • python网络爬虫之selenium库(二)
  • uview-ui使用u-row+u-avatar居中布局
  • uview-ui使用u-icon文字图标展示
  • react+antd 可拖拽模态框组件
  • Python之--元组
  • RabbitMQ01——基础概念、docker配置rabbitmq、内部执行流程、五种消息类型、测试第一种消息类型
  • Java学习--------消息队列的重复消费、消失与顺序性的深度解析​
  • I/O 多路复用select,poll
  • Java 中的继承与多态
  • 5.组合模式
  • 3.5软件开发活动[2-系统设计]面向对象设计-UML统一开发过程
  • [故障诊断方向]SNNs:针对小样本轴承故障诊断的孪生神经网络模型
  • 在Vscode中使用Kimi K2模型:实践指南,三分钟生成个小游戏
  • 练习三:熟知前端知识
  • 目标检测中的标签分配算法总结
  • MinIO深度解析:从核心特性到Spring Boot实战集成
  • Vue的路由模式的区别和原理
  • 《Qt5串口开发》搭建跨平台通信系统
  • VSCode用Python操作MySQL:环境配置与代码验证
  • 操作系统-分布式同步
  • 实验室危险品智能管控:行为识别算法降低爆炸风险
  • Mybatis学习之简介(一)
  • Vue 3 中封装并使用 IndexedDB 的完整教程(含泛型、模块化、通用 CRUD)
  • Vue Swiper组件
  • 93.数字信号处理相关的一些问题
  • 单元测试学习+AI辅助单测
  • 【ArcGIS技巧】最近分享的GIS插件总结与优化
  • Spring MVC源码分析 DispatcherServlet#getHandlerAdapter方法