¿Cómo encuentro los archivos de íconos utilizados por los menús de estado no predeterminados (también conocidos como indicadores)?

9

Me gustaría encontrar la ubicación de los iconos utilizados por algunos menús de estado no predeterminados (también llamados indicadores de aplicación o applets de indicador).

ingrese la descripción de la imagen aquí

¿Dónde se encuentran estos archivos de imagen de iconos?

En mi captura de pantalla tengo ownCloud y Radiotray, pero me gustaría una respuesta general no específica a estos íconos en particular, por favor. No sé los nombres de archivo o los tipos de archivo, por lo que la búsqueda es difícil.

Tom Brossman
fuente

Respuestas:

9

¿Ubicación predeterminada para iconos indicadores no predeterminados?

No hay una ubicación predeterminada donde se almacenan estos íconos. Cualquier aplicación (-developer) puede almacenarlos donde se considere apropiado.

Sin embargo , la buena noticia es que los indicadores generalmente no instalan listas interminables de archivos e imágenes. Podemos limitar nuestra búsqueda (además de mirar el código) mirando la salida del comando:

dpkg-query -L <packagename>

En mi ejemplo de

dpkg-query -L placesfiles

ingrese la descripción de la imagen aquí

esto, entre otros, generaría las siguientes imágenes:

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

... Lo que haría que la búsqueda sea bastante limitada.

Del hombre 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”:

En el caso de Radiotray , encontré los siguientes .pngarchivos (en ejecución 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 realmente necesitamos averiguarlo, buscar el código

... podemos ver los archivos instalados (dentro) para encontrar coincidencias de la cadena "icono". Muchos de los indicadores están escritos en uno de los lenguajes de script (como python), lo que significa que se pueden buscar muy bien.

Un ejemplo

De nuevo usando el radiotrayejemplo

dpkg-query -L radiotray | xargs grep icon

en la salida encontramos ao:

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

Mirando el archivo SysTrayGui.py, podemos ver:

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

A partir de esto, podemos concluir que los iconos mencionados están definidos en el módulo commondentro del (sub) directorio lib. (Vea aquí cómo Python lo encuentra módulos, sección Subdirectorios )

En este módulo, podemos leer la sección:

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

...y aquí estamos...

Situaciones excepcionales

Con todos mis indicadores prácticos, logré encontrar los íconos correspondientes utilizando los métodos anteriores.

Sin embargo, resulta posible compilar imágenes junto con el código en un solo ejecutable. No es necesario explicar que en tales casos no encontrará una imagen separada, ni podrá reemplazarlos sin editar el código y volver a compilar.

El caso de owncloud parece ser un caso así. El uso de los métodos anteriores mostró que se instaló un conjunto de iconos dentro /usr/share/icons/hicolor/<size>/apps. Sin embargo, ninguno de estos íconos se usa en el indicador de ubuntu .

OP hizo bastante trabajo antes (y después) hizo esta pregunta. Uno de ellos era correr:

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

... lo que nos da bastante información útil. La salida incluyó una sección:

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

Mirando en el directorio /tmp/iconcache-50ePXx, encontré los íconos exactos que usaba el indicador:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

... lo que parece demostrar que estos íconos se generan sobre la marcha; Al cerrar owncloud, el directorio y sus iconos desaparecen.

Resultó posible cambiar el ícono del indicador reemplazando estos íconos:

ingrese la descripción de la imagen aquí

lo que prueba que estos son los íconos que estábamos buscando.

Sin embargo, para automatizar lo que hice manualmente, se requiere un script / contenedor, ya que el nombre del directorio creado se cambia cada vez que se inicia owncloud. La opción más conveniente sería, por supuesto, que se cambiara el código del cliente de owncloud.

Vea también nuestra discusión aquí .

Continuará...

Jacob Vlijm
fuente
¿No dpkg -Lhace lo mismo?
Kaz Wolfe
@KazWolfe aparentemente, aquí no se menciona: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Jacob Vlijm
Gracias, esto es útil para encontrar los iconos de Radiotray. Estoy detrás del icono monocromo ownCloud de mi captura de pantalla ( ejemplo del código fuente ownCloud en GitHub aquí ), y no está entre los resultados devueltos con dpkg-query -L. Buscar con find / -name state-ok -type fmiradas para haberse estancado, pero lo dejaré funcionando durante la noche.
Tom Brossman
@TomBrossman Estoy seguro de que podemos averiguarlo. Instalaré ownCloud para ver.
Jacob Vlijm
1
@TomBrossman El servidor podría estar temporalmente fuera de servicio, obtengo un error 404 no encontrado en algunas partes. Sin /usr/share/icons/hicolor/<size>/apps embargo, al mirar el archivo .deb descargado, owncloud instala algunos íconos . Desafortunadamente, el archivo .deb no se instala: Errors were encountered while processing:volveré a intentarlo más tarde ...
Jacob Vlijm
4

Iconos y sus ubicaciones potenciales

Hay dos formas en que el indicador podría emplear iconos:

  • Icono personalizado. Esto generalmente se aplica /usr/share/pixmaps/, aunque es posible que algunos de los autores envíen íconos indicadores a otros directorios. Jacob Vlijm, cuya respuesta está en esta página y que también es autor del indicador SpaceView, por ejemplo, eligió colocar iconos para ese indicador /opt/spaceview/icon. Con este tipo de íconos es un poco complicado pero no complejo: use dpkg -L <package name>o cat /var/lib/dpkg/info/PACKAGE.listy busque un archivo de ícono, con .pngo .svgextensión. Estos son los más típicos.
  • Icono estándar, tema específico. Estos normalmente se pueden encontrar en la /usr/share/iconscarpeta. Por ejemplo, en mis indicadores como Udisks Indicator, con frecuencia me baso en lo que hay dentro /usr/share/icons/gnome, ya que estos son estándar y vienen con cualquier instalación de Ubuntu. Si no encuentra un ícono en las consultas dpkg, es probable que el paquete use un ícono estándar.

Yendo a la fuente

Si un indicador está escrito en Python o Ruby, buscar pistas en el código fuente puede ser relativamente fácil, ya que estos son scripts, y es suficiente greppara buscar en el código fuente. Los lenguajes compilados como C y Vala no vienen con el código fuente, por lo que tendría que obtenerlo, ya sea a través apt-get source package-nameo desde donde haya obtenido el paquete. (Los usuarios aventureros pueden usar hexdumpo descompilar el archivo ejecutable, pero en mi humilde opinión es demasiado trabajo solo por curiosidad sobre un icono).

NOTA : si un icono reside en uno de los directorios estándar, como /usr/share/icons/o /usr/share/pixmaps, el autor del software puede elegir llamar al icono simplemente por su nombre, sin extensiones. Por ejemplo, en mi udisks-indicatoruso esta línea para llamar a uno de los iconos estándar:

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

Observe la falta .svgo .pngextensión. Por lo tanto, en este caso, tenemos un nombre del icono y podemos ubicarlo usando comandos estándar de Linux como locateo find.

Buscar utilizando herramientas estándar de Linux

Si realmente desea tener un comando para buscar íconos, simplemente use esta combinación simple:

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

Aquí hay un ejemplo. Sé a ciencia cierta que el indicador diskman usa un icono personalizado. Entonces, ¿qué nos dice este 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

Observe la /usr/share/pixmaps/indicator-diskman.pngúltima imagen, que es lo que el indicador realmente muestra en el panel.

¿Y qué pasa si el indicador usa un ícono estándar? Bueno, obviamente no habrá salida:

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

$

Conclusión

Si bien no hay un estándar establecido, hay un conjunto de lugares típicos donde van los iconos, y podemos usar dpkgpara consultar información sobre qué archivos vienen con cada paquete específico. Finalmente, tal vez no sea la sugerencia más técnica, pero considere enviar un correo electrónico a los desarrolladores o pasar por su IRC o chat, y simplemente preguntarles "¿Qué icono usa su indicador?". Los desarrolladores generalmente están contentos de saber de las personas que usan su software y no les importará responder una pregunta rápida.

Sergiy Kolodyazhnyy
fuente
Gracias, esta respuesta también fue muy útil, pero mi sincronización de escritorio de OwnCloud está haciendo algo extraño con los íconos y espero descubrirlo también.
Tom Brossman
@TomBrossman haciendo algo extraño, ¿qué quieres decir exactamente?
Sergiy Kolodyazhnyy
La aplicación de sincronización de escritorio de ownCloud instala una variedad de íconos que no utiliza. Tenía la esperanza de personalizarlos y reemplazarlos, pero dado que los genera sobre la marcha /tmpno es práctico. Sin embargo, personalizarlas para la mayoría de las aplicaciones es fácil usando su respuesta, ya que usan los conjuntos de iconos instalados.
Tom Brossman