如果你在 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.pswp.cn/pingmian/90040.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90040.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90040.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂深度模型优化器,掌握炼丹工具

深度模型优化器是训练神经网络的核心工具,其目标是高效地找到损失函数的最小值。从基础的随机梯度下降(SGD)到结合一阶动量修正与两阶段更新的Ranger,优化器的发展始终围绕着加速收敛、提升稳定性、适应参数差异和增强泛化能力四大…

关于虚拟机部署的k8s集群calico组件在开机恢复快照时的问题

在恢复虚拟机开机快照的时候总会出现各种的网络问题,连接不到自己的443端口,集群状态异常等等,绕一圈都发现不了问题,其实根本就没问题。虚拟机环境再现,恢复快照后的k8s环境,nfs莫名宕掉提示此报错&#x…

从感知到决策:虚拟仿真系统与视觉算法融合下的多路RTSP视频接入技术探究

1️⃣ 背景概述 随着国防信息化和智能化进程的不断加快,虚拟仿真系统 与 智能视觉算法平台 正逐步成为现代化装备研发、测试验证与战术训练的重要技术支撑。相比传统的静态建模或离线推演,新一代作战仿真与智能系统更强调 实时性、感知能力与动态交互&a…

Android app如果不适配Android 15会怎么样

深度思考完成 用时49秒 首先,用户的问题是:“Android app如果不适配Android 15会怎么样?”我需要基于搜索结果来回答。 让我回顾搜索结果: ‌1:标题是“Android 15应用适配指南”,内容强调了不适配Androi…

Vue-21-利用Vue3的axios+Python的flask实现前后端交互功能

文章目录 1 任务需求 2 前端 2.1 模板template 2.2 JS代码script 2.3 Calculate.vue(子组件) 2.4 App.vue(根组件) 3 后端 3.1 导入模块 3.2 创建应用实例 3.3 配置CORS 3.4 定义路由 3.5 处理请求 3.6 main.py 4 附录 4.1 CORS 4.1.1 全局启用CORS 4.1.2 限制允许的域名(更安…

动态规划之最长回文子串

题目:最长回文子串 给你一个字符串 s,找到 s 中最长的 回文 子串。 示例 1: 输入:s “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 示例 2: 输入:s “cbbd” 输…

Linux 编程中的错误处理机制详解 —— `errno` 全解析

文章目录Linux 编程中的错误处理机制详解 —— errno 全解析一、什么是 errno?❓为什么需要 errno?✅ 它在哪里定义?二、errno 的设置与读取规则⚠️ errno 不是总是有效!❗使用 errno 的正确步骤:三、与 errno 配套使…

力扣-最长递增子序列

简单记录学习~给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例…

公司内部网址怎么在外网打开?如何让外网访问内网的网站呢?

很多公司内部本地会部署有中小型的服务器,可以很好的方便用于一些办公业务系统,或测试开发需要。在数字化办公和生活场景中,除了公司内部局域网内访问公司系统外,经常会遇到需要让外网访问内网网站的情况。比如企业员工远程办公时…

有趣的css - 多选立体标签按钮

🍭 大家好,我是 Just,这里是「设计师工作日常」,今天分享的是一个交互较完整的多选立体标签按钮。 最新文章通过公众号「设计师工作日常」发布。 目录整体效果核心代码html 代码css 部分代码完整代码如下html 页面css 样式页面渲…

C++中byte*和char*的区别

在C中,byte*(通常指 std::byte*)和 char* 都是指针类型,但它们在语义和用途上有重要区别:1. 类型定义char* char 是C内置的基本类型,表示字符(通常是1字节)。 char* 常用于&#xff…

【node】npm包本地开发与调试

npm link 进入本地的 babel-plugin-function-try-catch 这个 npm 包的根目录执行: npm link上面的命令可以将当前的这个包安装在全局(mac 中的路径是 /usr/local/bin),也就是 npm i -g 安装包的目录。 执行后结果如图&#xff…

突破量子仿真瓶颈:微算法科技MLGO量子算法的算术化与核操作迭代模型

近年来,量子计算机的迅速发展和潜在的强大计算能力吸引了全球科研机构和企业的广泛关注。量子计算机利用量子力学的特性来处理复杂的计算任务,具有在某些方面远超经典计算机的潜力。然而,真正实用的量子计算机尚未大规模普及,因此…

python中读取 Excel 表格数据

在pandas中读取 Excel 表格后,有多种方式可以按列、按行提取数据,下面我将详细介绍常见的方法。 0.声明 在本文中我使用的excel表内容如下:1. 读取 Excel 文件 首先,我们需要使用 pandas 的 read_excel 函数读取 Excel 文件&#…

算法训练营day28 贪心算法②122.买卖股票的最佳时机II、55. 跳跃游戏、 45.跳跃游戏II 、1005.K次取反后最大化的数组和

贪心算法第二篇博客!感觉这篇博客中的算法都很巧妙,需要动动脑筋 122.买卖股票的最佳时机II (这道题可以遍历数组,如果不能遍历的话,就不能做了,需要注意的是: 只有一只股票!当前只…

NumPy核心操作全攻略

NumPy(Numerical Python)是 Python 生态中用于科学计算的核心库,提供高性能的多维数组对象(ndarray)及相关的数学运算工具。其核心功能围绕数组操作、线性代数、随机数生成等,是数据科学、机器学习等领域的…

Redis 主从同步对象模型

淘汰策略 对最外层的key进行淘汰 expire(秒)/pexpire(毫秒) ttlmaxmemory:最大内存的一半(持久化fork()子进程) 数据迁移需要额外的空间 maxmemory-policy 提供淘汰机制 默认不会淘汰 lru 最近最少使用 lfu最近最少频次 voltaile 对由expire的进行淘汰持久化: fork:写时复制原理…

C++ 使用 constexpr 、查表法、分治法加速位镜像翻转

代码////// brief 左右翻转位。////// note 翻转后&#xff0c;最低位位将变为最高位&#xff0c;最高位将变为最低位。//////template <typename T>requires(std::is_same_v<T, uint8_t>)constexpr T Reverse(T value){int32_t bit_count sizeof(T) * 8;for (int…

知识库搭建之Meilisearch‘s 搜索引擎 测评-东方仙盟测评师

windows 启动后 启动成功后关键信息 Config file path: "none" Database path: "./data.ms" Server listening on: "http://localhost:7700" Environment: "development" Commit SHA: &quo…

【笔记】Anaconda 重装后虚拟环境写入路径异常的完整排查与解决过程

Anaconda 安装[仅为当前用户安装/为所有用户安装]选项对环境变量设置的影响_anaconda没有添加环境变量-CSDN博客 Anaconda 路径治理指南&#xff1a;路径精简、权限优化与环境隔离-CSDN博客 Windows系统下手动升级Anaconda的详细指南_anaconda升级-CSDN博客 Conda 命令大全&…