Answers:
这些图标没有默认的存储位置。任何应用程序(开发人员)都可以将它们存储在适当的位置。
但是,好消息是指示器通常不会安装无休止的文件和图像列表。我们可以通过(除了查看代码之外)查看命令的输出来限制搜索:
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-query -L
。搜索的find / -name state-ok -type f
外观似乎已停滞,但我将使其整夜运行。
/usr/share/icons/hicolor/<size>/apps
。不幸的是.deb文件没有安装:Errors were encountered while processing:
我稍后会重试...
指示器可以采用两种方式使用图标:
/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
。
如果您确实想要一个用于搜索图标的命令,请使用以下简单组合:
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或聊天中停下来,然后简单地问他们“嘿,您的指示器使用什么图标?”。开发人员通常很高兴听到使用他们的软件的人的意见,并且不介意回答一个快速的问题。
/tmp
因此不切实际。不过,由于大多数应用程序都使用已安装的图标集,因此可以轻松地为您的应用程序自定义它们。
dpkg -L
做同样的事情?