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

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

enter image description here

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

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

9
задан 3 October 2016 в 06:08

2 ответа

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

Нет никакого местоположения по умолчанию, где эти значки хранятся. Любое приложение (-разработчик) может сохранить их, где это считают соответствующим.

Однако хорошие новости - то, что индикаторы обычно не устанавливают бесконечные списки файлов и изображения. Мы можем ограничить наш поиск (кроме изучения кода) изучение вывода команды:

dpkg-query -L <packagename>

В моем примере

dpkg-query -L placesfiles

enter image description here

это было бы среди других, произведите следующие изображения:

/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

в выводе мы находим a.o.:

/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. (См. здесь, как Python находит это модулями, разделом Subdirectories),

В этом модуле мы можем считать раздел:

# 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. Ни один из этих значков не оказывается используемым однако в индикаторе на человечности.

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, Я нашел точные значки, которые использовались индикатором:

enter image description here enter image description here enter image description here

... который, кажется, доказывает, что эти значки сгенерированы на лету; закрытие owncloud делает каталог, и его значки исчезают.

Оказалось возможным изменить значок индикатора путем замены этих значков:

enter image description here

который доказывает, что это действительно значки, мы искали.

Автоматизировать, что я сделал вручную однако, будет требовать сценария/обертки, так как имя созданного каталога изменилось, каждый раз owncloud запускается. Самая удобная опция, конечно, состояла бы в том, что код owncloud-клиента будет изменен.

См. также наше обсуждение здесь.

Продолжение следует...

9
ответ дан 23 November 2019 в 04:57

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

Существует два способа, которыми индикатор мог использовать значки:

  • Пользовательский значок. Это обычно входит /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, я часто полагаюсь на то, что находится в /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 или чат и просто выяснение у них "Эй, какой значок Ваш индикатор использует?". Разработчики обычно рады получить известие от людей, которые используют их программное обеспечение и не будут возражать для ответа на быстрый вопрос.

4
ответ дан 23 November 2019 в 04:57

Другие вопросы по тегам:

Похожие вопросы: