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).
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.
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
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
... 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.
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...
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:
... 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:
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...
Il y a deux façons dont l'indicateur peut utiliser des icônes:
/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/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.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
.
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
$
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.