GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Come trovare i file delle icone utilizzati dai menu di stato non predefiniti (ovvero indicatori)?

Vorrei trovare la posizione delle icone utilizzate da alcuni menu di stato non predefiniti (chiamati anche indicatori di applicazioni o applet di indicatori).

Dove si trovano questi file di immagine delle icone?

Nel mio screenshot ho ownCloud e Radiotray, ma vorrei una risposta generale non specifica per queste icone particolari, per favore. Non conosco i nomi o i tipi di file, quindi la ricerca è difficile.

Risposta accettata:

Posizione predefinita per le icone degli indicatori non predefinite?

Non esiste una posizione predefinita in cui sono archiviate queste icone. Qualsiasi applicazione (-sviluppatore) può archiviarli dove lo ritiene opportuno.

Comunque , la buona notizia è che gli indicatori di solito non installano elenchi infiniti di file e immagini. Possiamo limitare la nostra ricerca (oltre a esaminare il codice) esaminando l'output del comando:

dpkg-query -L <packagename>

Nel mio esempio di

dpkg-query -L placesfiles

questo produrrebbe, tra l'altro, le seguenti immagini:

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

…Il che renderebbe la ricerca piuttosto limitata.

Da man 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”:

Nel caso di Radiotray , ho trovato il seguente .png file (in esecuzione 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

Se davvero bisogno di scoprirlo, cercando il codice

...possiamo cercare tra i file installati (all'interno) le corrispondenze della stringa "icona". Molti degli indicatori sono scritti in uno dei linguaggi di script (come python ), il che significa che sono molto ben ricercabili.

Un esempio

Sempre usando il radiotray esempio

dpkg-query -L radiotray | xargs grep icon

nell'output troviamo a.o.:

/usr/lib/python2.7/dist-packages/radiotray/SysTrayGui.py 
                 self.icon.set_from_file(APP_ICON_CONNECT)

Esaminando il file SysTrayGui.py , possiamo vedere:

from lib.common import APPNAME, APPVERSION, APP_ICON_ON, APP_ICON_OFF, APP_ICON_CONNECT, APP_INDICATOR_ICON_ON, APP_INDICATOR_ICON_OFF

Da ciò, possiamo concludere che le icone menzionate sono definite nel modulo common all'interno della (sotto) directory lib . (Vedi qui come python trova i moduli, sezione Sottodirectory )

In questo modulo, possiamo leggere la sezione:

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

…ed eccoci qui…

Situazioni eccezionali

Con tutti i miei indicatori pratici, sono riuscito a trovare le icone corrispondenti usando i metodi sopra.

Correlati:individuare i file quasi duplicati in una cartella?

Risulta tuttavia possibile compilare le immagini insieme al codice in un unico eseguibile. Non c'è bisogno di spiegare che in questi casi non troverai un'immagine separata, né potrai sostituirle senza modificare il codice e ricompilare.

Il caso di owncloud sembra essere un caso del genere. L'utilizzo dei metodi sopra indicati ha mostrato che un set di icone è stato installato all'interno di /usr/share/icons/hicolor/<size>/apps . Nessuna di queste icone risulta tuttavia essere utilizzata nell'indicatore su ubuntu .

OP ha fatto un bel po' di lavoro prima (e dopo) di aver posto questa domanda. Uno di questi era quello di correre:

gdbus call --session --dest com.canonical.indicator.application --object-path /com/canonical/indicator/application/service --method com.canonical.indicator.application.service.GetApplications

... il che ci fornisce alcune informazioni utili. L'output includeva una sezione:

('146028888067', 2, 'org.kde.StatusNotifierItem-22055-1', '/StatusNotifierItem/menu', '/tmp/iconcache-50ePXx', '', '', '', 'owncloud', 'ownCloud')

Esaminando la directory /tmp/iconcache-50ePXx , ho trovato le icone esatte utilizzate dall'indicatore:

… il che sembra dimostrare che queste icone sono generate al volo; la chiusura di owncloud fa sparire la directory e le sue icone.

È stato possibile modificare l'icona dell'indicatore sostituendo queste icone:

il che dimostra che queste sono davvero le icone che stavamo cercando.

Per automatizzare ciò che ho fatto manualmente, tuttavia, sarebbe necessario uno script/wrapper, poiché il nome della directory creata viene modificato ogni volta che viene avviato owncloud. L'opzione più conveniente sarebbe ovviamente quella di modificare il codice del client-cloud.

Continua...


Ubuntu
  1. Trovare file nella riga di comando (come fare per)

  2. Come verificare la presenza di file di grandi dimensioni nella console

  3. Come trovare l'algoritmo di hashing utilizzato per eseguire l'hashing delle password?

  4. Come utilizzare la GUI per cercare file in Gnome?

  5. Come trovare tutti i file relativi a un software?

Come trovare file in Linux con il comando Trova

Come trovare i file usando la riga di comando nel terminale Linux

Come decomprimere i file gz in Linux

Come trovare l'indirizzo MAC in Ubuntu

Come trovare file sulla riga di comando di Ubuntu

Come trovare file con il comando fd in Linux