Как найти файлы значков, используемые в нестандартных меню состояния (или индикаторах)?

9

Я хотел бы найти расположение значков, используемых в некоторых нестандартных меню состояния (также называемых индикаторами приложений или апплетами индикаторов).

введите описание изображения здесь

Где находятся эти файлы изображений значков?

На моем скриншоте у меня есть ownCloud и Radiotray, но я хотел бы получить общий ответ, не относящийся к конкретным значкам, пожалуйста. Я не знаю имен файлов или типов файлов, поэтому поиск затруднен.

Том Броссман
источник

Ответы:

9

Местоположение по умолчанию для значков индикатора не по умолчанию?

Там нет места по умолчанию, где хранятся эти значки. Любое приложение (-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делает то же самое?
Каз Вулф
@KazWolfe, по-видимому, здесь это не упоминается, хотя: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Джейкоб Влейм
Спасибо, это полезно для поиска иконок Radiotray. Мне нужен монохромный значок ownCloud на моем скриншоте ( пример из исходного кода ownCloud на GitHub здесь ) - и он не входит в число результатов, возвращаемых с dpkg-query -L. Поиск с find / -name state-ok -type fвнешностью застопорился, но я оставлю его включенным на ночь.
Том Броссман
@ TomBrossman Я уверен, что мы можем узнать. Я установлю ownCloud, чтобы увидеть.
Джейкоб Влейм
1
@TomBrossman Сервер может быть временно недоступен, я получаю 404 - ошибка не найдена в некоторых частях .. Глядя на загруженный файл .deb, owncloud устанавливает довольно много значков /usr/share/icons/hicolor/<size>/apps . К сожалению, файл .deb не устанавливается: Errors were encountered while processing:я
попытаюсь
4

Иконки и их потенциальные местоположения

Есть два способа, которыми индикатор может использовать иконки:

  • Пользовательский значок. Обычно это происходит /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я использую эту строку для вызова одного из стандартных значков:

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 или чат и спросить их: «Эй, какой значок использует ваш индикатор?». Разработчики обычно рады услышать от людей, которые используют их программное обеспечение, и не прочь ответить на быстрый вопрос.

Сергей Колодяжный
источник
Спасибо, этот ответ также был очень полезен, но моя синхронизация рабочего стола ownCloud делает что-то странное с иконками, и я надеюсь это выяснить.
Том Броссман
@ TomBrossman, делая что-то странное, что именно ты имеешь в виду?
Сергей Колодяжный
Приложение Desktop Sync для ownCloud устанавливает набор значков, которые оно не использует. Я надеялся настроить и заменить их, но так как он генерирует их на лету, /tmpэто не практично. Настроить их для большинства приложений легко, используя ваш ответ, поскольку они используют установленные наборы значков.
Том Броссман,