![为什么有些打开的应用程序在 Unity 启动器中显示为“问号”?](https://linux22.com/image/812347/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%89%E4%BA%9B%E6%89%93%E5%BC%80%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%9C%A8%20Unity%20%E5%90%AF%E5%8A%A8%E5%99%A8%E4%B8%AD%E6%98%BE%E7%A4%BA%E4%B8%BA%E2%80%9C%E9%97%AE%E5%8F%B7%E2%80%9D%EF%BC%9F.png)
我遇到了几个程序的问题,它们在 Unity 中有启动器,但在启动后会创建一个单独的图标。启动器是否可以跟踪它生成的窗口以更好地组织?或者这是 Unity 本身的一个错误?
这可能并不重要,但这个特定的程序是一个单声道程序,并且生成的图标被列为面板。
答案1
发生了什么
此类问题与 Unity 的应用程序匹配框架有关。为了简化技术细节,程序窗口和应用程序对 Ubuntu 来说是两个独立的东西。Ubuntu 需要“猜测”哪个应用程序拥有某个窗口。有时这种猜测会失败,启动器中会出现一个问号。
失败的原因可能是:
问题中显示的应用程序(KeePass2)存在第 1 类问题,即已报告给相应的错误跟踪器。
问题示例
下面的示例是技术性的,针对希望自己的应用程序在 Ubuntu 启动器中正确显示的程序员。
问题 3 – 没有应用程序描述
为了使应用程序与 Unity 集成(即在 Dash 中可搜索并放置在启动器中),它需要有一个桌面条目。此类条目放置在/usr/share/applications/
、/usr/local/share/applications/
和中$HOME/.local/share/applications/
(后两者分别用于第三方软件、系统范围和用户专用)。它们以.desktop
扩展名结尾并遵循以下基本格式:
[Desktop Entry]
Type=Application
Name=My Application's Name
Icon=/file/path/of/my/icon
Exec=/file/path/of/my/executable
此条目通过调用可执行文件来启动程序Exec
。每当该程序显示窗口或对话框时,Unity 都会注意到其可执行文件“属于”此应用程序描述,并使用启动器中给定的Name
和。Icon
这是一个基本示例。形式化规范涵盖许多高级功能。
问题 2 – 应用程序描述错误
让我们假设它my_app.desktop
存在于有效的应用程序目录中,但是:
/file/path/of/my/icon
在文件系统中不存在。/file/path/of/my/icon
不是图像。- 该条目使用了一些不正确的语法或无效的标签。
在上述任何一种情况下,Ubuntu 都将无法在启动器中正确列出应用程序窗口。
问题 1 – BAMF 中的一个错误
从 Ubuntu 11.10 开始,BAMF 存在许多错误,导致无法正确匹配应用程序。常见(暂时)缺陷包括:
- 路径
Exec
是符号链接而不是常规文件 - 该可执行文件是启动主可执行文件的脚本。
在这些情况下,程序员别无选择,只能使用变通方法,例如删除符号链接抽象,或直接链接到可执行文件。桌面入口规范本身并不要求这两种方法。
答案2
仅当设置了 WM_CLASS 属性时,窗口才能与应用程序匹配。要在 X11 中执行此操作,请使用:
XSetClassHint( display, window, &class_hints );
您需要将一个指针传递给具有字段“res_name”和“res_class”的 XClassHint 结构。
答案3
我在使用 16.04 时遇到了一些问题,包括图标变灰,有时触摸板会变得不稳定(Acer V15 nitro),而且软件中心(可能还有其他图标)无法从图标打开(只能通过终端命令打开)。我在某处找到了卸载并重新安装 gnome 软件的建议。自从我这样做以来,整个系统一直 100% 稳定,不再有灰色图标,运行完美。当我进行此更改后重新启动时,最初看起来很可怕 - 重新启动时会显示大量系统消息 - 因此请自行承担风险。
sudo apt-get autoremove gnome-software && sudo apt-get install gnome-software