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


9

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

在此处输入图片说明

这些图标图像文件位于哪里?

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

Answers:


9

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

这些图标没有默认的存储位置。任何应用程序(开发人员)都可以将它们存储在适当的位置。

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

dpkg-query -L <packagename>

在我的例子中

dpkg-query -L placesfiles

在此处输入图片说明

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

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

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

从人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”:

对于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

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

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

# 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"

...这是我们...

特殊情况

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

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

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

...这给了我们很多有用的信息。输出包括以下部分:

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

查看目录/tmp/iconcache-50ePXx,我发现了指示器使用的确切图标:

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

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

事实证明,可以通过替换以下图标来​​更改指示器的图标:

在此处输入图片说明

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

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

另请参阅此处的讨论。

未完待续...


不会dpkg -L做同样的事情?
卡兹·沃尔夫

@KazWolfe显然是,这里没有提及:manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Jacob Vlijm

谢谢,这对找到Radiotray图标很有帮助。我在屏幕快照中找到了ownCloud单色图标(示例来自GitHub上的ownCloud源代码),并且它不在的返回结果中dpkg-query -L。搜索的find / -name state-ok -type f外观似乎已停滞,但我将使其整夜运行。
汤姆·布鲁斯曼

@TomBrossman我确信我们可以找到答案。我将安装ownCloud来查看。
雅各布·弗利姆

1
@TomBrossman服务器可能暂时关闭,我在某些部分上收到404-not found错误/usr/share/icons/hicolor/<size>/apps 。不幸的是.deb文件没有安装:Errors were encountered while processing:我稍后会重试...
Jacob Vlijm

4

图标及其潜在位置

指示器可以采用两种方式使用图标:

  • 自定义图标。/usr/share/pixmaps/尽管有些作者可能将指示器图标发送到其他目录,但这通常会进入。例如,Jacob Vlijm的答案在此页面上,他还是SpaceView指标的作者,选择将该指标的图标放入/opt/spaceview/icon。使用这类图标有点棘手,但并不复杂-使用dpkg -L <package name>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从何处获取软件包,都必须获取源代码。(hexdump喜欢冒险的用户可以使用或反编译可执行文件,但是恕我直言,仅出于对图标的好奇心,这是太多的工作了)。

注意:如果图标位于标准目录之一(例如/usr/share/icons/或)中/usr/share/pixmaps,则软件的作者可以选择仅按名称调用该图标,而无需扩展名。例如,在我中,udisks-indicator我使用此行来调用标准图标之一:

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

请注意缺少.svg.png扩展。因此,在这种情况下,我们有一个图标的名称,我们可以使用Linux标准命令(例如locate或)找到它find

使用标准Linux工具进行搜索

如果您确实想要一个用于搜索图标的命令,请使用以下简单组合:

dpkg -L <Package name here> | xargs file  | grep -i image

这是一个例子。我知道指示器磁盘员使用自定义图标这一事实。那么,该命令告诉我们什么?

$ 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或聊天中停下来,然后简单地问他们“嘿,您的指示器使用什么图标?”。开发人员通常很高兴听到使用他们的软件的人的意见,并且不介意回答一个快速的问题。


谢谢,这个答案也非常有帮助,但是我自己的cloud桌面同步对图标做了一些奇怪的事情,我希望也能弄清楚。
汤姆·布鲁斯曼

@TomBrossman做一些奇怪的事情,这到底是什么意思?
Sergiy Kolodyazhnyy

ownCloud的Desktop Sync应用程序会安装一系列不使用的图标。我曾希望自定义和替换它们,但是由于它是动态生成的,/tmp因此不切实际。不过,由于大多数应用程序都使用已安装的图标集,因此可以轻松地为您的应用程序自定义它们。
汤姆·布鲁斯曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.