Com o objetivo de extrair todos os tamanhos de um ícone (arquivo ICO) como imagens PNG de um arquivo EXE , notei que o Wine parece fazer isso automaticamente.
Após a instalação do foobar2000 , o Wine (presumo) criou um Desktop Entry em ~/.local/share/applications/wine/Programs/foobar2000.desktop
, contendo o seguinte conteúdo:
[Desktop Entry]
Name=foobar2000
Exec=env WINEPREFIX="$HOME/.wine" wine C:\\\\windows\\\\command\\\\start.exe /Unix "$HOME/.wine/dosdevices/c:/users/Public/Start\\ Menu/Programs/foobar2000.lnk"
Type=Application
StartupNotify=true
Comment=Play, organize and tag your music.
Path=$HOME/.wine/dosdevices/c:/Program Files (x86)/foobar2000
Icon=3C17_foobar2000.0
Eventualmente, a Icon
chave chamou minha atenção e descobri que ela foi resolvida de acordo com a Especificação do Tema do Ícone . Procurando por aí, encontrei os diretórios ~/local/share/icons/hicolor/*/apps/
que continham os arquivos para esses ícones (cada pasta contendo 3C17_foobar2000.0.png
), novamente que eu presumo que o Wine criou.
Minha pergunta é como o Wine gerou esses arquivos de imagem do aplicativo (ou arquivo de atalho)?
O Wine inclui um
winemenubuilder
programa que cuida disso: ele pega um atalho do Windows e cria um.desktop
arquivo FDO (FreeDesktop.Org) correspondente. A extração de ícones faz parte disso, tratada peloopen_module_icon
e funções relacionadas. Para extrair ícones,winemenubuilder
encontra o executável correspondente ao atalho (opcionalmente esperando que ele seja criado, se necessário) e carrega os recursos que ele contém usando aLoadResource
função do Wine, encontra os ícones e os converte para um formato de imagem apropriado.irá converter o link para um
.desktop
arquivo, em~/.local/share/applications/wine/Programs
, e extrair os ícones disponíveis, convertê-los e armazená-los nos subdiretórios apropriados de~/.local/share/icons
. (Acho que/path/to/link.lnk
deve ser acessível usando os mapeamentos de unidade do Wine; funciona bem com.lnk
arquivos que foram instalados no Wine.)irá extrair o primeiro ícone no executável apontado por
link.lnk
paraicon.png
.