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

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

在此处输入图像描述

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

在我的截图中,我有自己的Cloud和Radiotray,但我想要一个不特定于这些特定图标的一般答案。 我不知道文件名或文件类型,因此搜索很困难。

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

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

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

dpkg-query -L  

在我的例子中

 dpkg-query -L placesfiles 

在此处输入图像描述

除其他外,这将输出以下图像:

 /opt/placesfiles/images/dir_icon.png /opt/placesfiles/images/placesfiles64.png /usr/share/pixmaps/placesfiles.png 

……这将使搜索非常有限。

来自man 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 (ie 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”: 

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 

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

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

一个例子

再次使用radiotray示例

 dpkg-query -L radiotray | xargs grep icon 

在输出中我们找到了ao:

 /usr/lib/python2.7/dist-packages/radiotray/SysTrayGui.py self.icon.set_from_file(APP_ICON_CONNECT) 

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

 from lib.common import APPNAME, APPVERSION, APP_ICON_ON, APP_ICON_OFF, APP_ICON_CONNECT, APP_INDICATOR_ICON_ON, APP_INDICATOR_ICON_OFF 

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

在本单元中,我们可以阅读以下部分:

 # Media path if os.path.exists(os.path.abspath('../data/images/')): IMAGE_PATH = os.path.abspath('../data/images/') else: IMAGE_PATH = '%s/%s/images' % (datadir, APPDIRNAME) # Images APP_ICON = os.path.join(IMAGE_PATH, 'radiotray.png') APP_ICON_ON = os.path.join(IMAGE_PATH, 'radiotray_on.png') APP_ICON_OFF = os.path.join(IMAGE_PATH, 'radiotray_off.png') APP_ICON_CONNECT = os.path.join(IMAGE_PATH, 'radiotray_connecting.gif') APP_INDICATOR_ICON_ON = "radiotray_on" APP_INDICATOR_ICON_OFF = "radiotray_off" APP_INDICATOR_ICON_CONNECT = "radiotray_connecting" 

……我们在这……

特殊情况

通过实际的所有指标,我设法使用上面的方法找到相应的图标。

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

自己云的情况似乎就是这种情况。 使用上述方法显示在/usr/share/icons/hicolor//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 

……这给了我们一些有用的信息。 输出包括一节:

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

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

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

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

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

在此处输入图像描述

这certificate了这些确实是我们正在寻找的图标。

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

另见我们的讨论。

未完待续…

图标及其潜在位置

指标有两种方式可以使用图标:

  • 自定义图标。 这通常会进入/usr/share/pixmaps/ ,尽管有些作者可能会将指示符图标发送到其他目录。 Jacob Vlijm,他的答案在这个页面上,也是SpaceView指标的作者,例如,选择将该指标的图标放入/opt/spaceview/icon 。 使用这些类型的图标有点棘手但不复杂 – 使用dpkg -L cat /var/lib/dpkg/info/PACKAGE.list并搜索图标文件,扩展名为.png.svg 。 这些是最典型的
  • 标准,主题特定的图标。 这些通常可以在/usr/share/icons文件夹中找到。 例如,在我的指标如Udisks Indicator中,我经常依赖于/usr/share/icons/gnome ,因为这些是标准的,并且随附任何Ubuntu安装。 如果您没有找到查询dpkg的图标,则该软件包可能会使用标准图标。

去源头

如果指标是用Python或Ruby编写的,那么通过源代码查找线索可能相对容易,因为这些是脚本,使用grep搜索源代码就足够了。 编译语言(如C和Vala)没有附带源代码,因此您必须通过apt-get source package-name或从apt-get source package-name任何地方获取它。 (冒险用户可以使用hexdump或反编译可执行文件,但恕我直言,这只是为了对图标的好奇心而工作太多了)。

注意 :如果图标位于其中一个标准目录中,例如/usr/share/icons//usr/share/pixmaps ,则软件作者可以选择仅通过名称调用图标,而不使用扩展名。 例如,在我的udisks-indicator我使用此行来调用其中一个标准图标:

 self.app.set_icon("drive-harddisk-symbolic") 

注意缺少.svg.png扩展名。 因此,在这种情况下,我们有一个图标的名称,我们可以使用Linux标准命令(如locatefind

使用标准Linux工具进行搜索

如果你真的想要一个搜索图标的命令,只需使用这个简单的组合:

 dpkg -L  | xargs file | grep -i image 

这是一个例子。 我知道指标diskman使用自定义图标。 那么这个命令告诉我们什么?

 $ dpkg -L indicator-diskman | xargs file | grep -i image /usr/share/indicator-diskman/images: directory /usr/share/indicator-diskman/images/drive-harddisk.svg: SVG Scalable Vector Graphics image /usr/share/indicator-diskman/images/media-optical.png: PNG image data, 64 x 64, 8-bit/color RGBA, non-interlaced /usr/share/indicator-diskman/images/disks.png: PNG image data, 64 x 64, 8-bit gray+alpha, non-interlaced /usr/share/indicator-diskman/images/locked.png: PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced /usr/share/indicator-diskman/images/lock.svg: SVG Scalable Vector Graphics image /usr/share/indicator-diskman/images/unlocked.png: PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced /usr/share/indicator-diskman/images/media-eject.svg: SVG Scalable Vector Graphics image /usr/share/indicator-diskman/images/disk.png: PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced /usr/share/pixmaps/indicator-diskman.png: PNG image data, 64 x 64, 8-bit gray+alpha, non-interlaced 

注意/usr/share/pixmaps/indicator-diskman.png最后一张图片,这是指标实际显示在面板上的内容。

如果指标使用标准图标怎么办? 显然,没有输出:

 $ dpkg -L udisks-indicator | xargs file | grep -i image $ 

结论

虽然没有设置标准,但是有一些典型的图标位置,我们可以使用dpkg来查询每个特定包附带的文件的信息。 最后,也许这不是最技术性的建议,但考虑向开发人员发送电子邮件或停止他们的IRC或聊天,并简单地问他们“嘿,你的指标使用什么图标?”。 开发人员通常很乐意听取使用他们软件的人的意见,并且不介意回答快速问题。