GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak najít soubory ikon, které používají jiné než výchozí stavové nabídky (známé jako indikátory)?

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í…


Ubuntu
  1. Linux:Jak najít ovladač zařízení používaný pro zařízení?

  2. Jak zálohovat telefon Ubuntu?

  3. Jak najít soubory v daném sektoru?

  1. Hledání souborů v příkazovém řádku (jak na to)

  2. Jak najít všechny řídké soubory v Linuxu

  3. Jak najít největší adresáře nebo největší soubory?

  1. Jak najít soubory v CentOS 8 na příkazovém řádku

  2. Jak zkontrolovat velké soubory v konzole

  3. Jak najít hashovací algoritmus používaný k hashování hesel?