Comment puis-je trouver les fichiers d'icônes utilisés par les menus d'état non par défaut (aka indicateurs)?

9

J'aimerais trouver l'emplacement des icônes utilisées par certains menus d'état non par défaut (également appelés indicateurs d'application ou applets d'indicateur).

entrez la description de l'image ici

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

Dans ma capture d'écran, j'ai ownCloud et Radiotray, mais je voudrais une réponse générale non spécifique à ces icônes particulières s'il vous plaît. Je ne connais pas les noms ou types de fichiers, donc la recherche est difficile.

Tom Brossman
la source

Réponses:

9

Emplacement par défaut pour les icônes d'indicateur non par défaut?

Il n'y a aucun 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 infinies de fichiers et d'images. Nous pouvons limiter notre recherche en (outre la recherche dans le code) en regardant la sortie de la commande:

dpkg-query -L <packagename>

Dans mon exemple de

dpkg-query -L placesfiles

entrez la description de l'image ici

ce serait entre autres, la sortie des 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 .pngfichiers suivants (en cours d'exécution 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, en recherchant le code

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

Un exemple

En utilisant à nouveau l' radiotrayexemple

dpkg-query -L radiotray | xargs grep icon

en sortie on retrouve ao:

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

En examinant le fichier SysTrayGui.py, nous pouvons voir:

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

De cela, nous pouvons conclure que les icônes mentionnées sont définies dans le module commonà l'intérieur du répertoire (sous) lib. (Voir ici comment python trouve ses 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 la pratique de tous mes indicateurs, j'ai réussi à trouver les icônes correspondantes en utilisant la ou les méthodes ci-dessus.

Il s'avère cependant possible de compiler des images avec le code dans un seul exécutable. Inutile d'expliquer que dans de tels cas, vous ne trouverez pas d'image séparée, et vous ne pourrez pas les remplacer sans modifier le code et recompiler.

Le cas de owncloud semble être un tel cas. L'utilisation des méthodes ci-dessus a montré qu'un ensemble d'icônes était installé à l'intérieur /usr/share/icons/hicolor/<size>/apps. Aucune de ces icônes ne s'avère cependant être utilisée dans l'indicateur sur ubuntu .

OP a fait pas mal de travail avant (et après) qu'il a posé cette question. L'un d'eux devait exécuter:

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:

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

... ce qui semble prouver que ces icônes sont générées à la volée; la fermeture d'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:

entrez la description de l'image ici

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 changé chaque fois que owncloud est lancé. L'option la plus pratique serait bien sûr de changer le code du client owncloud.

Voir également notre discussion ici .

À suivre...

Jacob Vlijm
la source
Ne fait pas dpkg -Lla même chose?
Kaz Wolfe
@KazWolfe apparemment, ici, il n'est pas mentionné cependant: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Jacob Vlijm
Merci, ceci est utile pour trouver les icônes Radiotray. Je suis après l'icône monochrome ownCloud de ma capture d'écran ( exemple du code source ownCloud sur GitHub ici ) - et il ne fait pas partie des résultats renvoyés avec dpkg-query -L. La recherche avec des find / -name state-ok -type fregards a calé mais je vais la laisser tourner toute la nuit.
Tom Brossman
@TomBrossman Je suis sûr que nous pouvons le découvrir. J'installerai ownCloud pour voir.
Jacob Vlijm
1
@TomBrossman Le serveur est peut-être temporairement arrêté, j'obtiens une erreur 404 introuvable sur certaines parties. En regardant dans le fichier .deb téléchargé, owncloud installe cependant quelques icônes /usr/share/icons/hicolor/<size>/apps . Malheureusement, le fichier .deb ne s'installe pas: Errors were encountered while processing:je vais réessayer plus tard ...
Jacob Vlijm
4

Icônes et leurs emplacements potentiels

Il y a deux façons dont l'indicateur pourrait 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'indicateur à d'autres répertoires. Jacob Vlijm, dont la réponse se trouve sur cette page et qui est également l'auteur de l'indicateur SpaceView, par exemple, a choisi de placer des icônes pour cet indicateur /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.listet recherchez un fichier d'icône, avec .pngou .svgextension. Ce sont les plus typiques
  • Icône standard spécifique au thème. Ceux-ci se trouvent généralement dans le /usr/share/iconsdossier. Par exemple, dans mes indicateurs tels que Udisks Indicator, je me fie souvent à ce qui est dedans /usr/share/icons/gnome, car ceux-ci sont standard et sont fournis avec toute installation d'Ubuntu. Si vous ne trouvez pas d'icône dans les requêtes dpkg, il est probable que le package utilise une icône standard.

Aller à la source

Si un indicateur est écrit en Python ou Ruby, la recherche d'indices dans le code source peut être relativement facile, car il s'agit de scripts, et il suffit d'utiliser greppour rechercher dans le code source. Les langages compilés tels que C et Vala ne sont pas livrés avec du code source, vous devrez donc l'obtenir, soit via apt-get source package-namesoit à partir de l'endroit où vous avez obtenu le package. (Les utilisateurs aventureux pourraient utiliser hexdumpou décompiler le fichier exécutable, mais à mon humble avis, c'est trop de travail juste pour la curiosité d'une icône).

REMARQUE : 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-indicatorj'utilise cette ligne pour appeler l'une des icônes standard:

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

Notez l'absence .svgou l' .pngextension. Ainsi, dans ce cas, nous avons un nom d'icône, et nous pouvons le localiser à l'aide de commandes standard Linux telles que locateou find.

Recherche à l'aide d'outils Linux standard

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

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

Voici un exemple. Je sais pertinemment que l'indicateur diskman utilise une icône personnalisée. Alors que nous dit cette commande?

$ 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 la /usr/share/pixmaps/indicator-diskman.pngdernière image, ce que l'indicateur affiche réellement sur le panneau.

Et si l'indicateur utilise une icône standard? Eh 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 norme définie, il existe un ensemble d'endroits typiques où les icônes vont, et nous pouvons utiliser dpkgpour interroger les informations sur les fichiers fournis avec chaque package spécifique. Enfin, ce n'est peut-être pas la suggestion la plus technique, mais pensez à envoyer un e-mail aux développeurs ou à passer par leur IRC ou leur chat, et à leur demander simplement "Hé, quelle icône votre indicateur utilise-t-il?". Les développeurs sont généralement heureux d'entendre des personnes qui utilisent leur logiciel et ne voudront pas répondre à une question rapide.

Sergiy Kolodyazhnyy
la source
Merci, cette réponse a également été très utile, mais ma synchronisation de bureau ownCloud fait quelque chose d'étrange avec les icônes et j'espère le comprendre aussi.
Tom Brossman
@ TomBrossman en faisant quelque chose d'étrange, que voulez-vous dire exactement?
Sergiy Kolodyazhnyy
L'application Desktop Sync d'ownCloud installe une gamme d'icônes qu'elle n'utilise pas. J'avais espéré les personnaliser et les remplacer mais comme il les génère à la volée /tmpce n'est pas pratique. Il est cependant facile de les personnaliser pour la plupart des applications en utilisant votre réponse, car ils utilisent le ou les jeux d'icônes installés.
Tom Brossman