Chtěl bych najít umístění ikon používaných některými nevýchozími stavovými nabídkami (nazývanými také indikátory aplikací nebo aplety indikátorů).
Kde jsou umístěny soubory obrázků těchto ikon?
Na mém snímku obrazovky mám ownCloud a Radiotray, ale chtěl bych obecnou odpověď, která není specifická pro tyto konkrétní ikony. Neznám názvy souborů ani typy souborů, takže vyhledávání je obtížné.
Přijatá odpověď:
Výchozí umístění pro jiné než výchozí ikony indikátorů?
Neexistuje žádné výchozí umístění, kam jsou tyto ikony uloženy. Jakákoli aplikace (-developer) je může uložit tam, kde to považuje za vhodné.
Nicméně , dobrou zprávou je, že indikátory obvykle neinstalují nekonečné seznamy souborů a obrázků. Naše hledání můžeme omezit (kromě pohledu do kódu) nahlédnutím do výstupu příkazu:
dpkg-query -L <packagename>
V mém příkladu
dpkg-query -L placesfiles
to by mimo jiné vytvořilo následující obrázky:
//eadn-wc01-5196795.nxedge.io/opt/placesfiles/images/dir_icon.png
//eadn-wc01-5196795.nxedge.io/opt/placesfiles/images/placesfiles64.png
//eadn-wc01-5196795.nxedge.io/usr/share/pixmaps/placesfiles.png
…Což by vyhledávání značně omezilo.
Od člověka 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”:
V případě Radiotray , našel jsem následující .png
soubory (spuštěním dpkg-query -L radiotray | grep png
):
//eadn-wc01-5196795.nxedge.io/usr/share/radiotray/images/radiotray_connecting.png
//eadn-wc01-5196795.nxedge.io/usr/share/radiotray/images/radiotray_on.png
//eadn-wc01-5196795.nxedge.io/usr/share/radiotray/images/radiotray_off.png
//eadn-wc01-5196795.nxedge.io/usr/share/radiotray/images/radiotray.png
//eadn-wc01-5196795.nxedge.io/usr/share/pixmaps/radiotray.png
Pokud opravdu potřebuji to zjistit hledáním kódu
…můžeme prohlížet (uvnitř) nainstalované soubory a hledat shodu s řetězcem „ikona“. Mnoho indikátorů je napsáno v jednom ze skriptovacích jazyků (jako python
), což znamená, že jsou velmi dobře prohledávatelné.
Příklad
Opět pomocí radiotray
příklad
dpkg-query -L radiotray | xargs grep icon
ve výstupu najdeme a.o.:
/usr/lib/python2.7/dist-packages/radiotray/SysTrayGui.py
self.icon.set_from_file(APP_ICON_CONNECT)
Podívejte se do souboru SysTrayGui.py
, můžeme vidět:
from lib.common import APPNAME, APPVERSION, APP_ICON_ON, APP_ICON_OFF, APP_ICON_CONNECT, APP_INDICATOR_ICON_ON, APP_INDICATOR_ICON_OFF
Z toho můžeme usoudit, že zmíněné ikony jsou definovány v modulu common
uvnitř (pod)adresáře lib
. (Podívejte se, jak python najde své moduly, sekce Podadresáře )
V tomto modulu si můžeme přečíst sekci:
# 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"
…a tady jsme…
Výjimečné situace
S praktickými všemi mými indikátory se mi podařilo najít odpovídající ikony pomocí výše uvedených metod.
Související:Najít téměř duplicitní soubory ve složce?Ukázalo se však, že je možné zkompilovat obrázky spolu s kódem do jediného spustitelného souboru. Není třeba vysvětlovat, že v takových případech nenajdete samostatný obrázek ani je nebudete moci nahradit bez úpravy kódu a překompilování.
Případ owncloud se zdá být takovým případem. Pomocí výše uvedených metod se ukázalo, že uvnitř /usr/share/icons/hicolor/<size>/apps
byla nainstalována sada ikon . Ukázalo se však, že žádná z těchto ikon není použita v indikátoru na ubuntu .
OP odvedl kus práce předtím (a poté, co položil tuto otázku). Jedním z nich bylo běžet:
gdbus call --session --dest com.canonical.indicator.application --object-path /com/canonical/indicator/application/service --method com.canonical.indicator.application.service.GetApplications
… což nám dává docela užitečné informace. Výstup obsahoval sekci:
('146028888067', 2, 'org.kde.StatusNotifierItem-22055-1', '/StatusNotifierItem/menu', '/tmp/iconcache-50ePXx', '', '', '', 'owncloud', 'ownCloud')
Podívejte se do adresáře /tmp/iconcache-50ePXx
, našel jsem přesné ikony, které indikátor používal:
… což zřejmě dokazuje, že tyto ikony jsou generovány za běhu; zavřením owncloudu adresář a jeho ikony zmizí.
Ukázalo se, že je možné změnit ikonu indikátoru nahrazením těchto ikon:
což dokazuje, že toto jsou skutečně ikony, které jsme hledali.
K automatizaci toho, co jsem udělal ručně, by to však vyžadovalo skript/obal, protože název vytvořeného adresáře se změní při každém spuštění owncloudu. Nejpohodlnější možností by samozřejmě bylo, že by se změnil kód vlastního cloudového klienta.
Pokračování…