
Estoy creando una aplicación que quiereinstalar un iconopara una extensión específica de la aplicación ( .crystalopen
), de una manera que funcione no sólo en Ubuntu/GNOME sino que también seaportátil a otros entornos de escritoriocomo KDE.
La aplicación se instala sola ~/.local/bin
(en lugar de /usr/bin
) para que no se requieran permisos de root. Por eso me gustaría el íconoinstalado dentro~/.local/
si es posible.
lo que he probado
Iregistrar un tipo MIME( application/vnd.crystal-opener
) para la .crystalopen
extensión creando un application-vnd.crystal-opener.xml
aspecto similar a:
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-type type="application/vnd.crystal-opener">
<comment>Crystal Opener</comment>
<glob pattern="*.crystalopen"/>
</mime-type>
</mime-info>
e instalándolo con:
$ xdg-mime install --mode user application-vnd.crystal-opener.xml
que internamente:
- lo copia en
~/.local/share/mime/packages
, creando los directorios intermedios según sea necesario; y - se ejecuta
update-mime-database ~/.local/share/mime/
para actualizar~/.local/share/mime/mime.cache
.
Iverificar que el tipo MIME esté registradocreando un archivo 1 no vacío con la extensión de archivo y consultando su tipo MIME:
$ echo OPEN > OPEN.crystalopen
$ xdg-mime query filetype OPEN.crystalopen
application/vnd.crystal-opener
o equivalente (en GNOME):
$ gio info OPEN.crystalopen | grep standard::content-type
standard::content-type: application/vnd.crystal-opener
Icrear una imagen de iconocon el nombre de archivo correcto para el tipo MIME application-vnd.crystal-opener.svg
,:
<svg height="128" width="128">
<ellipse cx="43" cy="32" rx="32" ry="32" style="fill:red" />
<ellipse cx="84" cy="32" rx="32" ry="32" style="fill:green" />
</svg>
ElEspecificación del tema del iconodice que debería poder instalar dicha imagen en el tema "hicolor" del que heredan todos los demás temas. Pero eso no parece funcionar. En particular si hago lo siguiente:
$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/hicolor/scalable/mimetypes
$ sudo update-icon-caches /usr/share/icons/*
entonces el ícono del OPEN.crystalopen
archivo en la aplicación Archivos NO cambia a la nueva imagen.
¿Quizás la aplicación Archivos no implementa correctamente la herencia de temas? 2
En lugar de eso, identifico qué tema específico es el tema predeterminado del sistema e instalo el ícono allí, lo que no parece muy confiable ni portátil:
- Iidentificar candidatos para el tema predeterminado del sistemabuscando el ícono de un tipo MIME común como
text/html
:
$ find /usr/share/icons -name 'text-html.*'
/usr/share/icons/Yaru/... (10 lines)
/usr/share/icons/HighContrast/... (1 line)
/usr/share/icons/Humanity/... (7 lines)
Al final
Humanity
resultó ser el tema predeterminado del sistema para este sistema (Ubuntu 23).Primero intento instalar el ícono en el directorio de temas de toda la máquina:
$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/*
- Eso funciona, actualizando exitosamente el ícono del
OPEN.crystalopen
archivo en la aplicación Archivos a la nueva imagen. - Sin embargo quieroinstalar en el directorio de temas del usuarioen lugar de al directorio de temas de toda la máquina, así que hago esto en su lugar:
$ mkdir -p ~/.local/share/icons/Humanity/mimes/256
$ cp application-vnd.crystal-opener.svg ~/.local/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/* # not sufficient to update: ~/.local/share/icons/*
- Eso también funciona, actualizando exitosamente el ícono del
OPEN.crystalopen
archivo en la aplicación Archivos a la nueva imagen. (Aunque desafortunadamentesudo
se requiere actualizar el caché de íconos de toda la máquina para que el ícono aparezca inmediatamente, antes del siguiente cierre de sesión e inicio de sesión).
la gran pregunta
¿Cómo puedo instalar un ícono en un directorio de temas de usuario de modo que el ícono de los archivos relacionados en la aplicación Archivos se actualice a la nueva imagen, de una manera confiable y portátil?¿Eso funcionará no sólo en GNOME sino también en KDE y otros entornos de escritorio?
En particular, ¿es posible instalar un ícono en el ~/.local/share/icons/hicolor
tema que está documentado en elEspecificación del tema del iconocomo estar siempre disponible?
1 Un archivo vacío a menudo se reconocerá como un tipo MIME similar application/x-zerosize
en lugar de cualquier tipo MIME personalizado nuevo que se registre.
2 "Nautilus no obedece las reglas de herencia [temáticas]" segúnhttps://askubuntu.com/a/752316/1724736
Respuesta1
Como la herencia de íconos entre temas no parecía funcionar correctamente, simplemente escribí un script para instalar el ícono de mi aplicación.todotemas en el sistema. Desordenado pero efectivo.
Por favor miralas 124 líneas de código de instalación personalizadoSolía lograr esto.