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


9

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

inserisci qui la descrizione dell'immagine

Dove si trovano questi file immagine 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 dei file o i tipi di file, quindi la ricerca è difficile.

Risposte:


9

Posizione predefinita per le icone degli indicatori non predefinite?

Non esiste un percorso predefinito in cui sono memorizzate queste icone. Qualsiasi applicazione (-developer) può memorizzarli dove è ritenuto appropriato.

Tuttavia , la buona notizia è che gli indicatori di solito non installano elenchi infiniti di file e immagini. Possiamo limitare la nostra ricerca (oltre a guardare nel codice) guardando nell'output del comando:

dpkg-query -L <packagename>

Nel mio esempio di

dpkg-query -L placesfiles

inserisci qui la descrizione dell'immagine

questo tra l'altro avrebbe prodotto le seguenti immagini:

/opt/placesfiles/images/dir_icon.png
/opt/placesfiles/images/placesfiles64.png
/usr/share/pixmaps/placesfiles.png

... Il che renderebbe la ricerca abbastanza limitata.

Dall'uomo 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 i seguenti .pngfile (in esecuzione 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

Se dobbiamo davvero 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

Ancora una volta usando l' radiotrayesempio

dpkg-query -L radiotray | xargs grep icon

nell'output troviamo ao:

/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 commonall'interno della (sotto) directory lib. (Vedi qui come trova Python 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 utilizzando i metodi sopra indicati.

In realtà, tuttavia, è possibile compilare le immagini insieme al codice in un unico eseguibile. Non è necessario spiegare che in questi casi non troverai un'immagine separata, né sarai in grado di sostituirli senza modificare il codice e ricompilare.

Il caso di owncloud sembra essere un caso del genere. Utilizzando i metodi sopra indicati è stato installato un set di icone all'interno /usr/share/icons/hicolor/<size>/apps. Nessuna di queste icone risulta essere utilizzata tuttavia nell'indicatore su Ubuntu .

OP ha fatto un bel po 'di lavoro prima (e dopo) di porre questa domanda. Uno di questi doveva correre:

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

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

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

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

... che sembra dimostrare che queste icone sono generate al volo; chiudendo owncloud, la directory e le sue icone scompaiono.

Si è scoperto che era possibile cambiare l'icona dell'indicatore sostituendo queste icone:

inserisci qui la descrizione dell'immagine

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 lanciato owncloud. L'opzione più conveniente sarebbe ovviamente che il codice del client client fosse modificato.

Vedi anche la nostra discussione qui .

Continua...


Non dpkg -Lfa la stessa cosa?
Kaz Wolfe,

@KazWolfe apparentemente, qui non è menzionato però: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Jacob Vlijm

Grazie, questo è utile per trovare le icone di Radiotray. Sto cercando l'icona monocromatica ownCloud dal mio screenshot ( esempio dal codice sorgente ownCloud su GitHub qui ) - e non è tra i risultati restituiti con dpkg-query -L. La ricerca con gli find / -name state-ok -type fsguardi si è bloccata ma la lascerò in funzione per una notte.
Tom Brossman,

@TomBrossman Sono sicuro che possiamo scoprirlo. Installerò ownCloud per vedere.
Jacob Vlijm,

1
@TomBrossman Il server potrebbe essere temporaneamente inattivo, ottengo 404 -non trovato errore in alcune parti .. Guardando il file .deb scaricato, owncloud installa alcune icone /usr/share/icons/hicolor/<size>/apps . Sfortunatamente, il file .deb non viene installato: Errors were encountered while processing:riproverò più tardi ...
Jacob Vlijm,

4

Icone e loro potenziali posizioni

Esistono due modi in cui l'indicatore può utilizzare le icone:

  • Icona personalizzata. Questo in genere accade /usr/share/pixmaps/, anche se è possibile che alcuni autori inviino icone di indicatori ad altre directory. Jacob Vlijm, la cui risposta è in questa pagina e che è anche autore dell'indicatore SpaceView, ad esempio, ha scelto di inserire le icone per quell'indicatore /opt/spaceview/icon. Con questo tipo di icone è leggermente complicato ma non complesso: utilizzare dpkg -L <package name>oe cat /var/lib/dpkg/info/PACKAGE.listcercare un file icona, con .pngo .svgestensione. Questi sono i più tipici
  • Icona standard specifica per tema. Questi in genere possono essere trovati nella /usr/share/iconscartella. Ad esempio, nei miei indicatori come Udisks Indicator, faccio spesso affidamento su cosa c'è dentro /usr/share/icons/gnome, poiché questi sono standard e vengono forniti con qualsiasi installazione di Ubuntu. Se non trovi un'icona durante la query dpkg, è probabile che il pacchetto utilizzi un'icona standard.

Andare alla fonte

Se un indicatore è scritto in Python o Ruby, cercare indizi nel codice sorgente può essere relativamente semplice, dato che si tratta di script ed è sufficiente utilizzarlo grepper cercare nel codice sorgente. I linguaggi compilati come C e Vala non vengono forniti con il codice sorgente, quindi dovresti ottenerlo, da apt-get source package-nameo ovunque tu abbia ottenuto il pacchetto. (Gli utenti avventurosi potrebbero utilizzare hexdumpo decompilare il file eseguibile, ma IMHO è troppo lavoro solo per curiosità su un'icona).

NOTA : se un'icona si trova in una delle directory standard, come /usr/share/icons/o /usr/share/pixmaps, l'autore del software può scegliere di chiamare l'icona semplicemente per nome, senza estensioni. Ad esempio, nel mio udisks-indicatoruso questa linea per chiamare una delle icone standard:

self.app.set_icon("drive-harddisk-symbolic")

Notare la mancanza .svgo l' .pngestensione. Pertanto, in questo caso, abbiamo un nome dell'icona e possiamo individuarlo utilizzando i comandi standard di Linux come locateo find.

Cerca utilizzando gli strumenti Linux standard

Se vuoi davvero avere un comando per la ricerca delle icone, usa questa semplice combinazione:

dpkg -L <Package name here> | xargs file  | grep -i image

Ecco un esempio So per certo che diskman indicatore utilizza un'icona personalizzata. Cosa ci dice questo comando?

$ 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

Si noti l' /usr/share/pixmaps/indicator-diskman.pngultima immagine, che è ciò che l'indicatore mostra effettivamente sul pannello.

E se l'indicatore utilizza un'icona standard? Beh, ovviamente non ci sarà output:

$ dpkg -L udisks-indicator | xargs file  | grep -i image                                                                 

$

Conclusione

Sebbene non esista uno standard stabilito, esiste un insieme di luoghi tipici in cui le icone vanno e possiamo usare dpkgper interrogare le informazioni su quali file vengono forniti con ciascun pacchetto specifico. Infine, forse non è il suggerimento più tecnico, ma considera di inviare agli sviluppatori un'e-mail o di interrompere il loro IRC o chat e semplicemente chiedere loro "Ehi, quale icona usa il tuo indicatore?". Gli sviluppatori di solito sono lieti di ascoltare le persone che usano il loro software e non dispiaceranno rispondere a una domanda veloce.


Grazie, questa risposta è stata anche molto utile, ma la mia sincronizzazione desktop ownCloud sta facendo qualcosa di strano con le icone e spero di riuscire a capirlo.
Tom Brossman,

@ TomBrossman facendo qualcosa di strano, cosa intendi esattamente?
Sergiy Kolodyazhnyy,

L'applicazione Desktop Sync di ownCloud installa una serie di icone che non utilizza. Avevo sperato di personalizzarli e sostituirli, ma dal momento che li genera al volo /tmpnon è pratico. Personalizzarli per la maggior parte delle applicazioni è facile usando la tua risposta, poiché usano i set di icone installati.
Tom Brossman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.