Як знайти файли значків, які використовуються у меню статусу, що не використовується за замовчуванням (ака-індикатори)?


9

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

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

Де знаходяться ці файли зображень із значками?

У моєму скріншоті у мене є власніCloud та Radiotray, але я хотів би отримати загальну відповідь, не специфічну для цих конкретних іконок. Я не знаю імен та типів файлів, тому пошук важкий.

Відповіді:


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

у висновку ми знаходимо ао:

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

... і ось ми ...

Виняткові ситуації

Використовуючи практичні всі мої показники, мені вдалося знайти відповідні піктограми за допомогою методів, описаних вище.

Однак виявляється можливим компілювати зображення разом з кодом в єдиний виконуваний файл. Не потрібно пояснювати, що в таких випадках ви не знайдете окремого зображення, а також не зможете їх замінити без редагування коду та перекомпіляції.

Випадок власного одягу, здається, такий випадок. Використовуючи вищевказаний метод (и), показали, що всередині встановлено набір піктограм /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. Найзручнішим варіантом, звичайно, буде те, що код власного клієнта-клієнта буде змінено.

Дивіться також нашу дискусію тут .

Далі буде...


Не 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 Indicator, я часто покладаюся на те, що є /usr/share/icons/gnome, оскільки вони є стандартними та постачаються з будь-якою установкою Ubuntu. Якщо ви не знайдете піктограму для запиту dpkg, швидше за все, пакет використовує стандартний значок.

Йдемо до джерела

Якщо індикатор записаний на Python або Ruby, перегляд вихідного коду для підказок може бути досить простим, оскільки це сценарії, і їх достатньо використовувати grepдля пошуку вихідного коду. Мови компіляції, такі як C та Vala, не постачаються з вихідним кодом, тому вам доведеться отримати його або через, apt-get source package-nameабо звідки ви отримали пакет. (Користувачі Adventurous можуть використовувати 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, роблячи щось дивне, що саме ти маєш на увазі?
Сергій Колодяжний

Програма робочого синхронізатора ownCloud встановлює коло значків, які він не використовує. Я сподівався налаштувати та замінити їх, але оскільки це створює їх на льоту, /tmpце не практично. Налаштувати їх для більшості програм легко, використовуючи вашу відповідь, оскільки вони використовують встановлений набір іконок.
Том Броссман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.