Como encontro os arquivos de ícones usados pelos menus de status não padrão (também conhecidos como indicadores)?

9

Gostaria de encontrar a localização dos ícones usados por alguns não padrão. menus de status (também chamados de indicadores de aplicativos ou applets indicadores).

Onde estão localizados esses arquivos de imagem de ícones?

Na minha tela eu tenho ownCloud e Radiotray, mas eu gostaria de uma resposta geral não específica para esses ícones em particular, por favor. Eu não sei os nomes dos arquivos ou os tipos de arquivos, então pesquisar é difícil.

    
por Tom Brossman 03.10.2016 / 15:08

2 respostas

9

Local padrão para ícones de indicador não padrão?

Não há local padrão onde esses ícones são armazenados. Qualquer aplicativo (-developer) pode armazená-los onde for considerado apropriado.

No entanto , a boa notícia é que os indicadores geralmente não instalam listas intermináveis de arquivos e imagens. Nós podemos limitar nossa busca por (além de olhar para o código) olhando para a saída do comando:

dpkg-query -L <packagename>

No meu exemplo de

dpkg-query -L placesfiles

isso, entre outros, produzirá as seguintes imagens:

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

... O que tornaria a pesquisa bastante limitada.

De man 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”:

No caso de Radiotray , encontrei os seguintes arquivos .png (executando 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

Se nós realmente precisarmos descobrir, pesquisando o código

... podemos examinar (dentro) arquivos instalados para correspondências da string "ícone". Muitos dos indicadores são escritos em uma das linguagens de script (como python ), o que significa que eles são muito pesquisáveis.

Um exemplo

Novamente usando o exemplo radiotray

dpkg-query -L radiotray | xargs grep icon

na saída encontramos um.o .:

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

Olhando para o arquivo 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 disso, podemos concluir que os ícones mencionados estão definidos no módulo common dentro do (sub) diretório lib . (Veja aqui como o python o encontra módulos, seção Subdiretórios )

Neste módulo, podemos ler a seção:

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

... e aqui estamos nós ...

Situações excepcionais

Com todos os meus indicadores práticos, consegui encontrar os ícones correspondentes usando o (s) método (s) acima.

No entanto, é possível compilar imagens junto com o código em um único executável. Não há necessidade de explicar que, em tais casos, você não encontrará uma imagem separada, nem poderá substituí-las sem editar o código e recompilar.

O caso do próprio nuvem parece ser um desses casos. Usando o (s) método (s) acima mostrou que um conjunto de ícones foi instalado dentro de /usr/share/icons/hicolor/<size>/apps . Nenhum destes ícones acaba por ser utilizado no indicador no Ubuntu .

OP fez algum trabalho antes (e depois), ele fez esta pergunta. Um deles foi executar:

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

... o que nos dá bastante informação útil. A saída incluiu uma seção:

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

Olhando para o diretório /tmp/iconcache-50ePXx , encontrei os ícones exatos que foram usados pelo indicador:

< href="https://i.stack.imgur.com/7ksaI.png">

... o que parece provar que esses ícones são gerados em tempo real; fechar o owncloud faz com que o diretório e seus ícones desapareçam.

Foi possível alterar o ícone do indicador substituindo esses ícones:

o que prova que estes são de fato os ícones que procurávamos.

Para automatizar o que fiz manualmente, no entanto, seria necessário um script / wrapper, já que o nome do diretório criado é alterado toda vez que o owncloud é iniciado. A opção mais conveniente seria, claro, que o código do próprio cliente do cliente seria alterado.

Veja também nossa discussão aqui .

Para continuar ...

    
por Jacob Vlijm 27.12.2016 / 21:31
4

Ícones e seus possíveis locais

Existem duas maneiras de o indicador usar ícones:

  • ícone personalizado. Isso geralmente vai para /usr/share/pixmaps/ , embora seja possível que alguns dos autores enviem ícones indicadores para outros diretórios. Jacob Vlijm, cuja resposta está nesta página e que também é autor do indicador SpaceView, por exemplo, escolheu colocar ícones para esse indicador em /opt/spaceview/icon . Com esses tipos de ícones, é um pouco complicado, mas não complexo - use dpkg -L <package name> ou cat /var/lib/dpkg/info/PACKAGE.list e procure por um arquivo de ícone, com extensão .png ou .svg . Estes são mais típicos
  • Padrão, ícone específico do tema. Eles geralmente podem ser encontrados na pasta /usr/share/icons . Por exemplo, em meus indicadores, como o Udisks Indicator, eu geralmente confio no que está em /usr/share/icons/gnome , já que eles são padrão e vêm com qualquer instalação do Ubuntu. Se você não encontrar um ícone de consultar dpkg , provavelmente o pacote usa um ícone padrão.

Indo para a fonte

Se um indicador é escrito em Python ou Ruby, olhar através do código-fonte para dicas pode ser relativamente fácil, já que estes são scripts, e é suficiente usar grep para pesquisar o código-fonte. Linguagens compiladas, como C e Vala, não vêm com o código-fonte, então você teria que obtê-lo, seja por meio de apt-get source package-name ou de onde quer que você tenha obtido o pacote. (Usuários aventureiros podem usar hexdump ou descompilar o arquivo executável, mas IMHO é muito trabalho apenas por curiosidade sobre um ícone).

OBSERVAÇÃO : se um ícone residir em um dos diretórios padrão, como /usr/share/icons/ ou /usr/share/pixmaps , o autor do software pode optar por chamar o ícone simplesmente pelo nome, sem extensões . Por exemplo, no meu udisks-indicator eu uso essa linha para chamar um dos ícones padrão:

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

Observe a falta da extensão .svg ou .png . Assim, nesse caso, temos um nome do ícone e podemos localizá-lo usando comandos padrão do Linux, como locate ou find .

Pesquisa usando ferramentas padrão do Linux

Se você realmente quiser ter um comando para pesquisar ícones, basta usar essa combinação simples:

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

Aqui está um exemplo. Eu sei de fato que o indicador diskman usa um ícone personalizado. Então, o que este comando nos diz?

$ 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 a /usr/share/pixmaps/indicator-diskman.png da última imagem, que é o que o indicador realmente mostra no painel.

E se o indicador usar um ícone padrão? Bem, obviamente, não haverá saída:

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

$

Conclusão

Embora não exista um padrão definido, há um conjunto de locais típicos para os ícones e podemos usar dpkg para consultar informações sobre quais arquivos acompanham cada pacote específico. Por fim, talvez não seja a sugestão mais técnica, mas considere enviar um e-mail aos desenvolvedores ou pará-los pelo IRC ou pelo bate-papo, e simplesmente perguntar "Ei, que ícone seu indicador usa?". Os desenvolvedores normalmente ficam felizes em ouvir pessoas que usam o software e não se importam em responder uma pergunta rápida.

    
por Sergiy Kolodyazhnyy 28.12.2016 / 10:48