Como definir o ícone de uma extensão de arquivo, de forma portátil, sem sudo

Como definir o ícone de uma extensão de arquivo, de forma portátil, sem sudo

Estou criando um aplicativo que desejainstalar um íconepara uma extensão específica do aplicativo ( .crystalopen), de uma forma que funcione não apenas no Ubuntu/GNOME, mas também sejaportátil para outros ambientes de desktopcomo o KDE.

O aplicativo se instala em ~/.local/bin(em vez de em /usr/bin) para que as permissões de root não sejam necessárias. Portanto eu gostaria do íconeinstalado dentro~/.local/se possível.

O que eu tentei

EUregistrar um tipo MIME( application/vnd.crystal-opener) para a .crystalopenextensão criando um application-vnd.crystal-opener.xmlque se pareça com:

<?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 instalando-o com:

$ xdg-mime install --mode user application-vnd.crystal-opener.xml

que internamente:

  1. copia-o para ~/.local/share/mime/packages, criando quaisquer diretórios intermediários conforme necessário; e
  2. corre update-mime-database ~/.local/share/mime/para atualizar ~/.local/share/mime/mime.cache.

EUverifique se o tipo MIME está registradocriando um arquivo 1 não vazio com a extensão de arquivo e consultando seu tipo MIME:

$ echo OPEN > OPEN.crystalopen
$ xdg-mime query filetype OPEN.crystalopen
application/vnd.crystal-opener

ou equivalente (no GNOME):

$ gio info OPEN.crystalopen | grep standard::content-type
  standard::content-type: application/vnd.crystal-opener

EUcrie uma imagem de íconecom o nome de arquivo correto para o 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>

OEspecificação do tema do íconediz que eu deveria ser capaz de instalar tal imagem no tema "hicolor" do qual todos os outros temas herdam. Mas isso não parece funcionar. Em particular se eu fizer o seguinte:

$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/hicolor/scalable/mimetypes
$ sudo update-icon-caches /usr/share/icons/*

então, o ícone do OPEN.crystalopenarquivo no aplicativo Arquivos NÃO muda para a nova imagem.

Talvez o aplicativo Arquivos não implemente a herança de tema corretamente? 2

Em vez disso, identifico qual tema específico é o tema padrão do sistema e instalo o ícone lá, o que não parece muito confiável ou portátil:

  • EUidentificar candidatos para o tema padrão do sistemaprocurando o ícone de um tipo MIME comum 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)
  • No final das contas Humanityacabou sendo o tema padrão do sistema para este sistema (Ubuntu 23).

  • Primeiro tento instalar o ícone no diretório de temas de toda a máquina:

$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/*
  • Isso funciona, atualizando com êxito o ícone do OPEN.crystalopenarquivo no aplicativo Arquivos para a nova imagem.
  • No entanto eu queroinstale no diretório de tema do usuárioem vez de para o diretório de temas de toda a máquina, então faço isso:
$ 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/*
  • Isso também funciona, atualizando com êxito o ícone do OPEN.crystalopenarquivo no aplicativo Arquivos para a nova imagem. (Embora, infelizmente, sudoseja necessário atualizar o cache de ícones de toda a máquina para que o ícone apareça imediatamente, antes do próximo logout e login.)

A grande questão

Como posso instalar um ícone em um diretório de tema do usuário, de modo que o ícone dos arquivos relacionados no aplicativo Arquivos seja atualizado para a nova imagem, de maneira confiável e portátil?que funcionará não apenas no GNOME, mas também no KDE e em outros ambientes de desktop?

Em particular, é possível instalar um ícone no ~/.local/share/icons/hicolortema que está documentado noEspecificação do tema do íconecomo estando sempre disponível?


1 Um arquivo vazio geralmente será reconhecido como um tipo MIME, application/x-zerosizeem vez de qualquer novo tipo MIME personalizado registrado.

2 "O Nautilus não obedece às regras de herança [temática]" de acordo comhttps://askubuntu.com/a/752316/1724736

Responder1

Como a herança de ícones entre temas não parecia estar funcionando corretamente, acabei de escrever um script para instalar o ícone do meu aplicativotodostemas no sistema. Desarrumado, mas eficaz.

Por favor, vejaas 124 linhas do código de instalação personalizadoEu costumava conseguir isso.

informação relacionada