如何找到非默认状态菜单(又名指示器)使用的图标文件?

Tom*_*man 10 indicator icons unity

我想找到一些非默认状态菜单(也称为应用程序指示器或指示器小程序)使用的图标的位置。

在此处输入图片说明

这些图标图像文件位于何处?

在我的屏幕截图中,我有 ownCloud 和 Radiotray,但我想要一个不特定于这些特定图标的一般答案。我不知道文件名或文件类型,所以搜索很困难。

Jac*_*ijm 9

非默认指示器图标的默认位置?

没有存储这些图标的默认位置。任何应用程序(-developer)都可以将它们存储在认为合适的地方。

然而,好消息是指标通常不会安装无休止的文件和图像列表。我们可以通过(除了查看代码之外)查看命令的输出来限制我们的搜索:

dpkg-query -L <packagename>
Run Code Online (Sandbox Code Playgroud)

在我的例子中

dpkg-query -L placesfiles
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这将输出以下图像:

/opt/placesfiles/images/dir_icon.png
/opt/placesfiles/images/placesfiles64.png
/usr/share/pixmaps/placesfiles.png
Run Code Online (Sandbox Code Playgroud)

...这会使搜索非常有限。

从人dpkg-query

   -l, --list [package-name-pattern...]
          List packages matching given pattern. If no package-name-pattern
          is  given,  list all packages in /var/lib/dpkg/status, excluding
          the ones marked as not-installed (i.e.  those  which  have  been
          previously purged). Normal shell wildcard characters are allowed
          in package-name-pattern. Please note you will probably  have  to
          quote  package-name-pattern to prevent the shell from performing
          filename expansion. For example this will list all package names
          starting with “libc6”:
Run Code Online (Sandbox Code Playgroud)

Radiotray的情况下,我找到了以下.png文件(正在运行dpkg-query -L radiotray | grep png):

/usr/share/radiotray/images/radiotray_connecting.png
/usr/share/radiotray/images/radiotray_on.png
/usr/share/radiotray/images/radiotray_off.png
/usr/share/radiotray/images/radiotray.png
/usr/share/pixmaps/radiotray.png
Run Code Online (Sandbox Code Playgroud)

如果我们真的需要找出来,搜索代码

...我们可以查看(内部)已安装的文件以查找字符串“icon”的匹配项。许多指标是用一种脚本语言(如python)编写的,这意味着它们非常易于搜索。

一个例子

再次使用radiotray示例

dpkg-query -L radiotray | xargs grep icon
Run Code Online (Sandbox Code Playgroud)

在输出中我们发现 ao:

/usr/lib/python2.7/dist-packages/radiotray/SysTrayGui.py 
                 self.icon.set_from_file(APP_ICON_CONNECT)
Run Code Online (Sandbox Code Playgroud)

查看文件SysTrayGui.py,我们可以看到:

dpkg-query -L <packagename>
Run Code Online (Sandbox Code Playgroud)

由此,我们可以得出结论,所提到的图标是在common(子)目录内的模块中定义的lib。(见这里python 如何找到它的模块,部分子目录

在本模块中,我们可以阅读以下部分:

dpkg-query -L placesfiles
Run Code Online (Sandbox Code Playgroud)

......我们在这里......

特殊情况

使用我所有的指标,我设法使用上述方法找到了相应的图标。

然而,事实证明,将图像与代码一起编译成单个可执行文件是可能的。无需解释,在这种情况下,您将找不到单独的图像,也无法在不编辑代码和重新编译的情况下替换它们。

owncloud的情况似乎就是这样。使用上述方法显示一组图标已安装在/usr/share/icons/hicolor/<size>/apps. 然而,这些图标都没有在 ubuntu 上的指示器中使用

在他问这个问题之前(和之后),OP 做了很多工作。其中之一是运行:

gdbus call --session --dest com.canonical.indicator.application --object-path /com/canonical/indicator/application/service --method com.canonical.indicator.application.service.GetApplications
Run Code Online (Sandbox Code Playgroud)

...这给了我们一些有用的信息。输出包括一个部分:

('146028888067', 2, 'org.kde.StatusNotifierItem-22055-1', '/StatusNotifierItem/menu', '/tmp/iconcache-50ePXx', '', '', '', 'owncloud', 'ownCloud')
Run Code Online (Sandbox Code Playgroud)

查看目录/tmp/iconcache-50ePXx,我找到了指标使用的确切图标:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

...这似乎证明这些图标是即时生成的;关闭 owncloud 会使目录及其图标消失。

事实证明,可以通过替换这些图标来更改指标的图标:

在此处输入图片说明

这证明这些确实是我们正在寻找的图标。

然而,要自动执行我手动执行的操作,需要一个脚本/包装器,因为每次启动 owncloud 时都会更改创建的目录名称。最方便的选择当然是更改 owncloud-client 的代码。

另请参阅我们在此处的讨论。

未完待续...