Местоположение по умолчанию для значков индикатора не по умолчанию?
Там нет места по умолчанию, где хранятся эти значки. Любое приложение (-developer) может хранить их там, где это будет сочтено целесообразным.
Тем не менее , хорошая новость заключается в том, что индикаторы обычно не устанавливают бесконечные списки файлов и изображений. Мы можем ограничить наш поиск (кроме просмотра кода) просмотром вывода команды:
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
Если нам действительно нужно это выяснить, ищем код
... мы можем просматривать (внутри) установленные файлы на предмет совпадения строки "значок". Многие из индикаторов написаны на одном из языков сценариев (например python
), что означает, что они очень хорошо подходят для поиска.
Пример
Снова используя radiotray
пример
dpkg-query -L radiotray | xargs grep icon
в выводе мы находим:
/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
внутри (под) каталога lib
. (Смотрите здесь, как 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"
... и вот мы здесь ...
Исключительные ситуации
Используя практически все мои индикаторы, мне удалось найти соответствующие значки, используя метод (ы) выше.
Однако оказывается возможным собрать изображения вместе с кодом в один исполняемый файл. Не нужно объяснять, что в таких случаях вы не найдете отдельное изображение и не сможете заменить их без редактирования кода и перекомпиляции.
Случай owncloud, кажется, такой случай. Использование вышеупомянутого метода (ов) показало, что набор иконок был установлен внутри /usr/share/icons/hicolor/<size>/apps
. Однако ни один из этих значков не используется в индикаторе на Ubuntu .
ОП проделал довольно большую работу, прежде чем (и после) он задал этот вопрос. Один из них должен был бежать:
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-client.
Смотрите также наше обсуждение здесь .
Продолжение следует...
dpkg -L
делает то же самое?dpkg-query -L
. Поиск сfind / -name state-ok -type f
внешностью застопорился, но я оставлю его включенным на ночь./usr/share/icons/hicolor/<size>/apps
. К сожалению, файл .deb не устанавливается:Errors were encountered while processing:
яИконки и их потенциальные местоположения
Есть два способа, которыми индикатор может использовать иконки:
/usr/share/pixmaps/
, хотя некоторые авторы могут отправлять значки индикаторов в другие каталоги. Якоб Влейм, чей ответ находится на этой странице и который также является автором индикатора SpaceView, например, решил разместить значки для этого индикатора в/opt/spaceview/icon
. С иконками такого типа это немного сложно, но не сложно - используйтеdpkg -L <package name>
илиcat /var/lib/dpkg/info/PACKAGE.list
и ищите файл значков с расширением.png
или.svg
. Это наиболее типичные/usr/share/icons
папке. Например, в моих индикаторах, таких как индикатор Udisks, я часто полагаюсь на то, что есть/usr/share/icons/gnome
, поскольку они являются стандартными и поставляются с любой установкой Ubuntu. Если вы не нашли значок в запросеdpkg
, скорее всего, пакет использует стандартный значок.Собираемся к источнику
Если индикатор написан на Python или Ruby, поиск исходного кода для подсказок может быть относительно простым, так как это скрипты, и его достаточно использовать
grep
для поиска по исходному коду. Скомпилированные языки, такие как C и Vala, не поставляются с исходным кодом, поэтому вам придется получать его либо через,apt-get source package-name
либо откуда бы вы ни получили пакет. (Авантюрные пользователи могут использоватьhexdump
или декомпилировать исполняемый файл, но IMHO, это слишком много работы только для интереса к иконке).ПРИМЕЧАНИЕ . Если значок находится в одном из стандартных каталогов, например,
/usr/share/icons/
или/usr/share/pixmaps
, автор программного обеспечения может выбрать вызов значка просто по имени, без расширений. Например, в моемudisks-indicator
я использую эту строку для вызова одного из стандартных значков:Обратите внимание на отсутствие
.svg
или.png
продление. Таким образом, в этом случае у нас есть имя иконки, и мы можем найти его, используя стандартные команды Linux, такие какlocate
илиfind
.Поиск с использованием стандартных инструментов Linux
Если вы действительно хотите иметь команду для поиска значков, просто используйте эту простую комбинацию:
Вот пример. Я точно знаю, что индикатор дискмен использует пользовательский значок. Так что эта команда говорит нам?
Обратите внимание на
/usr/share/pixmaps/indicator-diskman.png
последнее изображение, которое на самом деле показывает индикатор на панели.А что если индикатор использует стандартную иконку? Ну, очевидно, не будет никакого выхода:
Вывод
Хотя нет установленного стандарта, есть множество типичных мест, куда идут значки, и мы можем использовать их
dpkg
для запроса информации о том, какие файлы поставляются с каждым конкретным пакетом. Наконец, возможно, это не самое техническое предложение, но подумайте над тем, чтобы отправить разработчикам электронное письмо или заглянуть в IRC или чат и спросить их: «Эй, какой значок использует ваш индикатор?». Разработчики обычно рады услышать от людей, которые используют их программное обеспечение, и не прочь ответить на быстрый вопрос.источник
/tmp
это не практично. Настроить их для большинства приложений легко, используя ваш ответ, поскольку они используют установленные наборы значков.