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