web-dev-qa-db-fra.com

Comment trouver les fichiers d'icône utilisés par les menus d'état autres que ceux par défaut (indicateurs)?

Je souhaite rechercher l'emplacement des icônes utilisées par certains menus d'état autres que ceux par défaut (également appelés indicateurs d'application ou applets d'indicateurs).

enter image description here

Où se trouvent ces fichiers images d'icônes?

Dans ma capture d'écran, j'ai ownCloud et Radiotray, mais j'aimerais une réponse générale, non spécifique à ces icônes en particulier. Je ne connais pas les noms ni les types de fichiers, ce qui rend la recherche difficile.

9
Tom Brossman

Emplacement par défaut pour les icônes d'indicateur autres que celles par défaut?

Il n'y a pas d'emplacement par défaut où ces icônes sont stockées. Toute application (-developer) peut les stocker là où cela est jugé approprié.

Cependant , la bonne nouvelle est que les indicateurs n’installent généralement pas de listes interminables de fichiers et d’images. Nous pouvons limiter notre recherche en (sauf dans le code) en regardant dans le résultat de la commande:

dpkg-query -L <packagename>

Dans mon exemple de

dpkg-query -L placesfiles

enter image description here

ceci produirait entre autres les images suivantes:

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

... Ce qui rendrait la recherche assez limitée.

De l'homme 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”:

Dans le cas de Radiotray , j'ai trouvé les fichiers .png suivants (exécutant 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

Si nous avons vraiment besoin de le savoir, il faut chercher le code

... nous pouvons rechercher dans les fichiers installés (à l'intérieur) les correspondances de la chaîne "icône". La plupart des indicateurs sont écrits dans l'un des langages de script (comme python), ce qui signifie qu'ils sont très faciles à rechercher.

Un exemple

Encore en utilisant l'exemple radiotray

dpkg-query -L radiotray | xargs grep icon

dans la sortie on trouve a.o .:

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

En regardant dans le fichier SysTrayGui.py, on peut voir:

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

Nous pouvons en conclure que les icônes mentionnées sont définies dans le module common à l’intérieur du (sous) répertoire lib. (Voir ici comment python le trouve-t-il modules, section Sous-répertoires )

Dans ce module, nous pouvons lire la section:

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

...et nous voici...

Situations exceptionnelles

Avec tous mes indicateurs pratiques, j'ai réussi à trouver les icônes correspondantes en utilisant les méthodes ci-dessus.

Il s'avère toutefois possible de compiler des images avec le code dans un seul exécutable. Nul besoin d’expliquer que, dans de tels cas, vous ne trouverez pas d’image distincte, ni ne pourrez les remplacer sans éditer le code et recompiler.

Le cas de owncloud semble en être un. En utilisant la ou les méthodes ci-dessus, un ensemble d’icônes a été installé dans /usr/share/icons/hicolor/<size>/apps. Cependant, aucune de ces icônes ne semble être utilisée dans l'indicateur sur ubuntu .

OP a beaucoup travaillé avant (et après), il a posé cette question. L'un d'eux était de courir:

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

... ce qui nous donne quelques informations utiles. La sortie comprenait une section:

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

En regardant dans le répertoire /tmp/iconcache-50ePXx, j'ai trouvé les icônes exactes utilisées par l'indicateur:

enter image description hereenter image description hereenter image description here

... ce qui semble prouver que ces icônes sont générées à la volée; la fermeture de owncloud fait disparaître le répertoire et ses icônes.

Il s'est avéré possible de changer l'icône de l'indicateur en remplaçant ces icônes:

enter image description here

ce qui prouve que ce sont bien les icônes que nous recherchions.

Cependant, pour automatiser ce que j'ai fait manuellement, il faudrait un script/wrapper, car le nom du répertoire créé est modifié chaque fois que owncloud est lancé. L'option la plus pratique serait bien sûr de changer le code du client owncloud-client.

Voir aussi notre discussion ici .

À suivre...

9
Jacob Vlijm

Icônes et leurs emplacements potentiels

Il y a deux façons dont l'indicateur peut utiliser des icônes:

  • Icône personnalisée. Cela va généralement dans /usr/share/pixmaps/, bien qu'il soit possible que certains auteurs envoient des icônes d'indicateurs à d'autres répertoires. Jacob Vlijm, dont la réponse figure sur cette page et qui est également l'auteur de l'indicateur SpaceView, a par exemple choisi de placer les icônes correspondant à cet indicateur dans /opt/spaceview/icon. Avec ce type d’icônes, c’est un peu délicat, mais pas complexe - utilisez dpkg -L <package name> ou cat /var/lib/dpkg/info/PACKAGE.list et recherchez un fichier d’icône, avec l’extension .png ou .svg. Ce sont les plus typiques
  • Icône standard, spécifique au thème. Ceux-ci se trouvent généralement dans le dossier /usr/share/icons. Par exemple, dans mes indicateurs tels que Udisks Indicator, je me fie souvent à ce qui se trouve dans /usr/share/icons/gnome, car ils sont standard et livrés avec toute installation Ubuntu. Si vous ne trouvez pas une icône dans la requête dpkg, il est probable que le paquet utilise une icône standard.

Aller à la source

Si un indicateur est écrit en Python ou en Ruby, il peut être relativement facile de rechercher des indices dans le code source car il s'agit de scripts et qu'il suffit d'utiliser grep pour effectuer une recherche dans le code source. Les langages compilés tels que C et Vala ne sont pas livrés avec le code source, vous devez donc l'obtenir, soit via apt-get source package-name, soit à partir de n'importe quel endroit où vous avez obtenu le paquet. (Les utilisateurs aventureux pourraient utiliser hexdump ou décompiler le fichier exécutable, mais à mon humble avis, cela demande trop de travail, rien que par curiosité pour une icône).

NOTE: si une icône réside dans l'un des répertoires standard, tels que /usr/share/icons/ ou /usr/share/pixmaps, l'auteur du logiciel peut choisir d'appeler l'icône simplement par son nom. , sans extensions. Par exemple, dans mon udisks-indicator, j'utilise cette ligne pour appeler l'une des icônes standard:

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

Notez l'absence de l'extension .svg ou .png. Ainsi, dans ce cas, nous avons un nom d’icône et nous pouvons le localiser à l’aide de commandes standard Linux telles que locate ou find.

Rechercher à l'aide d'outils standard Linux

Si vous voulez vraiment avoir une commande pour rechercher des icônes, utilisez simplement cette combinaison:

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

Voici un exemple. Je sais pertinemment que cet indicateur Diskman utilise une icône personnalisée. Alors qu'est-ce que cette commande nous dit?

$ 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

Remarquez le /usr/share/pixmaps/indicator-diskman.png la dernière image, ce que l'indicateur montre réellement sur le panneau.

Et si l'indicateur utilise une icône standard? Bien évidemment, il n'y aura pas de sortie:

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

$

Conclusion

Bien qu'il n'y ait pas de standard défini, il existe un ensemble d'emplacements typiques où les icônes vont, et nous pouvons utiliser dpkg pour rechercher des informations sur les fichiers fournis avec chaque paquet spécifique. Enfin, ce n’est peut-être pas la suggestion la plus technique, mais envisagez d’envoyer un courrier électronique aux développeurs ou de leur demander de discuter avec leur IRC. Les développeurs sont généralement heureux d’être informés par les utilisateurs de leur logiciel et ne sont pas dérangés par la réponse à une question rapide.

4
Sergiy Kolodyazhnyy